ChatGPT i Bard. Jak sobie radzą w praktyce?

Sztuczna inteligencja to aktualny i stały trend. Codziennie powstają artykuły o AI, a coraz większa ilość systemów jest integrowana z istniejącymi rozwiązaniami.

ChatGPT vs Bard
ChatGPT vs Bard
Źródło zdjęć: © avlab.pl

Od czasu publicznej premiery ChatGPT 30 listopada 2022 roku zauważalne jest również zainteresowanie sztuczną inteligencją przez pracodawców — ofert pracy dla prompt engineerów czy specjalistów od AI ciągle przybywa.

Najpopularniejsze usługi "rozmowy" ze sztuczną inteligencją to ChatGPT i Bard. Rozwiązanie od Google działa od 21 marca 2023 roku, natomiast w Polsce dostępne jest od 13 lipca tego roku.

W sieci można znaleźć różne porównania tych dwóch czatów, my skupimy się jednak na pytaniach stricte technicznych z obszarów bezpieczeństwa, administracji IT i DevOps.

Dalsza część artykułu pod materiałem wideo

Dzięki temu będziemy mogli porównać jakość generowanych odpowiedzi i uzasadnić przydatność tych narzędzi w codziennej pracy.

Obsługa ChatGPT i Bard

Przedstawione rozwiązania dostępne są pod poniższymi linkami:

  • https://chat.openai.com
  • https://bard.google.com

Oba rozwiązania wymagają wcześniejszego zalogowania. W przypadku ChatGPT do wyboru mamy logowanie z użyciem konta Google, Microsoft lub Apple oraz zwykłym kontem OpenAI. Bard, jako produkt Google, dostępny jest wyłącznie z poziomu konta tej usługi.

Wygląd interfejsów jest bardzo zbliżony, a obsługa intuicyjna. Wpisujemy po prostu odpowiednie prompty w oknie "komunikatora". W menu po lewej stronie pojawi się zapis czatów o nazwach wygenerowanych przez AI na podstawie naszego pierwszego zapytania. Nazwy czatów można zmieniać, a zapisy usuwać.

  • Bard
  • ChatGPT
[1/2] BardŹródło zdjęć: © Licencjodawca

Porównanie ChatGTP vs Bard Google

Przygotowałem po trzy pytania w języku polskim dla każdego z obszarów:

  • bezpieczeństwo,
  • administracja IT,
  • DevOPS.

Daje to w sumie dziewięć różnych pytań. Pod każdym pytaniem zostały udostępnione odpowiedzi wygenerowane przez ChatGPT i Bard. Została również wskazana lepsza odpowiedź, przez co rozumiem poprawność i zgodność z rzeczywistością. W przypadku błędnych lub niepełnych odpowiedzi został dodany komentarz z rozszerzoną odpowiedzią.

Pod każdą odpowiedzią udostępniłem odnośnik do treści poszczególnych czatów.

W przypadku Bard, gdzie generowane są trzy wersje odpowiedzi, pod uwagę brałem tylko pierwszą z nich (wyświetlaną od razu użytkownikowi).

Pytania z kategorii: Bezpieczeństwo

Pytanie nr 1:

Próba otworzenia serwisu Facebook powoduje wyświetlenie zawartości innej strony. Użytkownik nie zmieniał żadnych ustawień systemu czy przeglądarki i korzysta z własnego komputera w domu. Na innych urządzeniach ta sytuacja nie występuje. O czym może świadczyć takie zachowanie przeglądarki?

Odpowiedź ChatGPT

Takie zachowanie przeglądarki może wskazywać na kilka możliwych przyczyn. Oto kilka potencjalnych wyjaśnień:

1. Pliki cookie: Pliki cookie to niewielkie fragmenty danych przechowywane przez przeglądarkę, które pomagają witrynom internetowym zapamiętywać informacje o użytkowniku. Może się zdarzyć, że pliki cookie powiązane z serwisem Facebook zostały uszkodzone lub zmienione, co powoduje wyświetlanie innej strony. Spróbuj wyczyścić pliki cookie dla serwisu Facebook i zobacz, czy to rozwiązuje problem.

2. Caching: Przeglądarka przechowuje lokalnie pewne dane z odwiedzanych stron internetowych w celu przyspieszenia ich ładowania. Jeśli przeglądarka zachowała starszą wersję strony Facebook w pamięci podręcznej (cache), może to spowodować wyświetlanie innej zawartości. Spróbuj wyczyścić pamięć podręczną przeglądarki i sprawdź, czy to rozwiązuje problem.

3. Przekierowanie serwerów DNS: Serwery DNS (Domain Name System) są odpowiedzialne za przekształcanie adresów URL na adresy IP witryn internetowych. Jeśli wystąpią problemy z przekierowaniem serwerów DNS, przeglądarka może prowadzić do nieprawidłowych adresów IP, co powoduje wyświetlanie innej strony. Spróbuj zmienić serwery DNS w ustawieniach systemu operacyjnego lub skorzystać z innych serwerów DNS, na przykład od dostawcy usług internetowych.

4. Infekcja malwarem: Nieprawidłowe przekierowania strony mogą być spowodowane zainfekowaniem komputera przez złośliwe oprogramowanie. Złośliwe programy mogą modyfikować ustawienia przeglądarki lub przekierowywać użytkownika na fałszywe strony. Zalecam zeskanowanie komputera za pomocą antywirusowego oprogramowania, aby upewnić się, że nie ma zainfekowanego oprogramowania.

Jeśli żadne z powyższych rozwiązań nie pomogą, warto skonsultować się z technikiem komputerowym lub dostawcą usług internetowych, aby sprawdzić, czy nie ma problemów związanych z urządzeniem lub siecią.

Odpowiedź Bard

Istnieje kilka możliwych przyczyn, dla których przeglądarka może wyświetlać inną zawartość niż oczekiwano podczas próby odwiedzenia serwisu Facebook. Oto kilka z nich:

  • Adware lub malware. Adware i malware to złośliwe oprogramowanie, które może zostać zainstalowane na komputerze użytkownika bez jego wiedzy. Może ono zmieniać ustawienia przeglądarki i przekierowywać użytkowników na inne strony internetowe.
  • Złe ustawienia proxy lub VPN. Ustawienia proxy i VPN mogą również powodować przekierowanie użytkowników na inne strony internetowe.
  • Problemy z DNS. DNS to system nazw domenowych, który tłumaczy nazwy stron internetowych na adresy IP. Jeśli są problemy z DNS, użytkownik może zostać przekierowany na inną stronę internetową niż oczekiwano.
  • Problemy z połączeniem internetowym. Jeśli połączenie internetowe jest niestabilne lub wolne, użytkownik może zostać przekierowany na inną stronę internetową.
  • Problemy z przeglądarką. Przeglądarka może mieć problemy z wyświetlaniem strony Facebook. W takim przypadku należy spróbować zaktualizować przeglądarkę lub użyć innej przeglądarki.

Jeśli użytkownik wyeliminował wszystkie możliwe przyczyny i nadal ma problemy z wyświetlaniem strony Facebook, może skontaktować się z pomocą techniczną Facebooka.

Komentarz AVLab:

Odpowiedź udzielona przez Bard jest zdecydowanie bardziej sensowna, zgodna z przedstawioną w pytaniu sytuacją i skondensowana do najważniejszych informacji. Dwa pierwsze podpunkty są oczywiste, to poprawna odpowiedź. Jako "Problemy z DNS" mogę uznać zmodyfikowany przez malware plik HOSTS, który zawiera wpis facebook.com powiązany z adresem IP kontrolowanym przez atakującego. Prowadzi to do sytuacji, w której domena facebook.com nie zostanie rozwiązana na poprawne adresy serwisu Facebook.

Pytanie nr 2:

Użytkownicy systemu Linux zgłosili, że ich dane z katalogów domowych zostały odczytane przez zewnętrznego klienta, który wylistował zawartość tych katalogów. Jak w możliwie łatwy sposób można zapobiec opisanej sytuacji w przyszłości, zakładając, że klient potrzebuje dostępu do tego konkretnego hosta poprzez SSH?

Odpowiedź ChatGPT

Aby zapobiec odczytowi danych z katalogów domowych przez zewnętrznego klienta, można podjąć kilka kroków w celu zwiększenia bezpieczeństwa systemu. Oto kilka zaleceń:

1. Ogranicz uprawnienia katalogów domowych: Upewnij się, że uprawnienia do katalogów domowych użytkowników są ustawione w sposób umożliwiający odczyt tylko właścicielowi. Można to osiągnąć, wykonując następujące polecenie w terminalu dla każdego katalogu domowego:

chmod 700 /ścieżka/do/katalogu_domowego

2. Wyłącz listowanie katalogów: Aby uniemożliwić zewnętrznemu klientowi wylistowanie zawartości katalogów domowych, można zmienić konfigurację serwera SSH. Otwórz plik konfiguracyjny SSH:

sudo nano /etc/ssh/sshd_config

Znajdź linię z opcją "PubkeyAuthentication" i upewnij się, że jest ustawiona na "yes". Następnie dodaj lub odkomentuj (jeśli istnieje) linię z opcją "PasswordAuthentication" i ustaw ją na "no". To wyłączy uwierzytelnianie hasłem przez SSH. Zapisz plik i uruchom ponownie usługę SSH:

sudo service ssh restart

3. Skonfiguruj dostęp za pomocą kluczy SSH: Zamiast używać uwierzytelniania hasłem, zaleca się skonfigurowanie dostępu za pomocą kluczy SSH. Wygeneruj parę kluczy na swoim lokalnym komputerze, a następnie skopiuj klucz publiczny na serwer. Na serwerze utwórz plik .ssh/authorized_keys w katalogu domowym użytkownika:

mkdir ~/.sshchmod 700 ~/.sshnano ~/.ssh/authorized_keys

Wklej klucz publiczny do pliku authorized_keys i zapisz go. Następnie zmień uprawnienia pliku:

chmod 600 ~/.ssh/authorized_keys

Teraz zewnętrzny klient będzie mógł się uwierzytelniać tylko za pomocą klucza prywatnego.

4. Aktualizuj system regularnie: Regularnie aktualizuj system operacyjny i oprogramowanie, aby korzystać z najnowszych łatek bezpieczeństwa. Można to zrobić przy użyciu menedżera pakietów systemu, na przykład apt w przypadku dystrybucji opartych na Debianie.

Pamiętaj, że te zalecenia dotyczą jedynie zabezpieczenia dostępu do katalogów domowych i uwierzytelniania przez SSH. Istnieje wiele innych czynników, które mogą mieć wpływ na ogólne bezpieczeństwo systemu, takie jak firewall, monitorowanie logów, zabezpieczenia sieci itp. Zawsze warto zasięgnąć informacji na temat najlepszych praktyk bezpieczeństwa systemów Linux i dostosować środowisko do konkretnych potrzeb i zagrożeń.

Odpowiedź Bard

Oto kilka sposobów na łatwe zapobieganie odczytywaniu danych z katalogów domowych przez zewnętrznego klienta za pomocą SSH:

1. Ustaw uprawnienia do katalogów domowych tak, aby były tylko do odczytu dla danego użytkownika. Oznacza to, że nikt inny, oprócz użytkownika, nie będzie mógł uzyskać dostępu do plików znajdujących się w katalogu domowym. Aby to zrobić, możesz użyć następującego polecenia:

chmod 700 ~/

2. Użyj kluczy SSH zamiast haseł. Klucze SSH są znacznie bardziej bezpieczne niż hasła, ponieważ nie można ich łatwo złamać. Aby utworzyć klucz SSH, możesz użyć następującego polecenia:

ssh-keygen

Po utworzeniu klucza SSH możesz go dodać do hosta zdalnego, używając następującego polecenia:

ssh-copy-id -i ~/.ssh/id_rsa user@host

3. Użyj serwera proxy SSH. Serwer proxy SSH to usługa, która pośredniczy w połączeniach SSH. Może być używany do ochrony danych przesyłanych przez połączenie SSH. Istnieje wiele różnych serwerów proxy SSH dostępnych do użytku.

4. Zainstaluj i skonfiguruj narzędzie fail2ban. Fail2ban to narzędzie, które może blokować adresy IP, które próbują zbyt wiele razy zalogować się do serwera SSH. Może to pomóc w zapobieganiu atakom brute force na serwer SSH.

5. Aktualizuj oprogramowanie. Ważne jest, aby zawsze aktualizować oprogramowanie na serwerach. Aktualizacje często zawierają poprawki bezpieczeństwa, które mogą pomóc w zapobieganiu atakom na serwer.

Postępując zgodnie z tymi wskazówkami, możesz pomóc w ochronie danych z katalogów domowych przed zewnętrznymi klientami.

Komentarz AVLab:

Udzielone odpowiedzi skupiają się w głównej mierze na zabezpieczeniu dostępu poprzez SSH. Wymieniono używanie kluczy zamiast hasła i wspomniano o narzędziu fail2ban. W pytaniu nie chodziło jednak o te kwestie.

Ustawienie chmod 700 na katalogu domowym sprawi, że tylko jego właściciel będzie miał pełne prawa, ale nie obejmie to podkatalogów, np. /home/user/dokumenty. Klient z naszego pytania faktycznie nie wyświetli zawartości katalogu /home/user, ale (znając schemat nazewnictwa katalogów) będzie mógł tego dokonać dla wszelkich podkatalogów. W tym konkretnym przypadku lepszym i najprostszym rozwiązaniem będzie przypisanie klientowi domyślnej powłoki rbash (restricted shell). Sprawi to, że nie będzie mógł wyjść poza swój katalog domowy, ani wylistować danych nienależących do niego (użycie znaku / jest blokowane). Trudniejszą, ale też ciekawszą opcję stanowi konfiguracja chroot dla zewnętrznego użytkownika, aby całkowicie zablokować mu dostęp do systemu oraz ograniczyć możliwe polecenia do wykonania.

Dodam też, że drugi punkt z odpowiedzi ChatGPT nie jest w żadnym stopniu prawdziwy. Wyłącznie logowania hasłem nie ma wpływu na listowanie katalogów. Gdyby dostęp SSH nie był konieczny (jak zaznaczono w pytaniu), prostym i skutecznym wyjściem byłoby udostępnienie klientowi wyłącznie dostępu SFTP i "zamknięcie" go w katalogu domowym.

Pytanie nr 3:

Użytkownik otrzymał w wiadomości e-mail plik EXE z aplikacją od dostawcy pewnej usługi. Nadawca został zweryfikowany, a wiadomość jest prawdziwa. Pomimo tego użytkownik obawia się ewentualnych konsekwencji uruchomienia pliku. Z jakich rozwiązań może skorzystać, aby bezpiecznie uruchomić tę aplikację?

Odpowiedź ChatGPT

Jeśli użytkownik otrzymał plik EXE od zaufanego nadawcy i jest przekonany, że wiadomość jest prawdziwa, istnieje kilka kroków, które może podjąć, aby bezpiecznie uruchomić tę aplikację:

1. Sprawdź autentyczność nadawcy: Upewnij się, że nadawca jest rzeczywiście zaufanym dostawcą usługi. Często oszuści mogą podszywać się pod znane firmy, dlatego należy dokładnie sprawdzić adres e-mail nadawcy, linki w wiadomości itp.

2. Skanuj plik antywirusem: Przed uruchomieniem pliku EXE, zaleca się przeskanowanie go przy użyciu aktualnego programu antywirusowego. Wybierz renomowany program antywirusowy i przeskanuj plik, aby upewnić się, że nie zawiera złośliwego oprogramowania.

3. Sprawdź zasady bezpieczeństwa: Skonsultuj się z zasadami bezpieczeństwa swojej firmy lub zasobami związanych z bezpieczeństwem, jeśli korzystasz z komputera służbowego. Może istnieć specyficzna procedura lub wytyczne dotyczące uruchamiania aplikacji lub plików o nieznanych źródłach.

4. Utwórz kopię zapasową: Zanim uruchomisz plik EXE, zaleca się utworzenie kopii zapasowej ważnych danych na komputerze. Jeśli aplikacja powoduje problemy lub zawiera złośliwe oprogramowanie, możesz przywrócić swoje dane z kopii zapasowej.

5. Uruchom wirtualną maszynę: Jeśli masz dostęp do narzędzi do wirtualizacji, możesz rozważyć uruchomienie pliku EXE w wirtualnej maszynie. W ten sposób możesz oddzielić aplikację od systemu głównego, co minimalizuje ryzyko wpływu na twoje dane i system operacyjny.

6. Przeczytaj dokumentację aplikacji: Jeśli aplikacja jest dostarczana z dokumentacją, warto ją przeczytać. W instrukcjach mogą być zawarte wskazówki dotyczące instalacji i uruchomienia aplikacji, które pomogą uniknąć problemów.

7. Monitoruj zachowanie aplikacji: Po uruchomieniu aplikacji warto monitorować jej zachowanie. Jeśli zauważysz jakiekolwiek niezwykłe lub podejrzane działanie, zamknij aplikację i skonsultuj się z dostawcą lub specjalistą ds. bezpieczeństwa.

Pamiętaj, że bezpieczeństwo komputerowe jest priorytetem, dlatego należy zachować ostrożność, nawet jeśli nadawca i wiadomość wydają się być wiarygodne.

Odpowiedź Bard

Oto kilka rozwiązań, które użytkownik może wykorzystać do bezpiecznego uruchomienia pliku EXE:

1. Skanowanie pliku za pomocą oprogramowania antywirusowego. Przed uruchomieniem pliku EXE należy przeskanować go za pomocą oprogramowania antywirusowego, aby upewnić się, że nie zawiera złośliwego oprogramowania.

2. Uruchomienie pliku w trybie bezpiecznym. Tryb bezpieczny to tryb uruchamiania systemu Windows, w którym uruchomione są tylko podstawowe usługi i programy. Uruchamianie pliku w trybie bezpiecznym może pomóc w zidentyfikowaniu i rozwiązaniu problemów z plikiem EXE.

3. Uruchomienie pliku w wirtualnej maszynie. Wirtualna maszyna to program, który tworzy wirtualny komputer na komputerze fizycznym. Wirtualną maszynę można wykorzystać do uruchomienia pliku EXE w bezpiecznym środowisku.

4. Skontaktowanie się z dostawcą usługi. Jeśli użytkownik nadal obawia się uruchomienia pliku EXE, może skontaktować się z dostawcą usługi, z którego pochodzi plik. Dostawca usługi może udzielić użytkownikowi informacji o pliku EXE i pomóc w bezpiecznym jego uruchomieniu.

Należy pamiętać, że pliki EXE mogą zawierać złośliwe oprogramowanie, które może uszkodzić komputer. Dlatego ważne jest, aby przed uruchomieniem pliku EXE podjąć kroki w celu zapewnienia jego bezpieczeństwa.

Komentarz AVLab:

W obu odpowiedziach znalazło się wskazanie użycie maszyny wirtualnej, co jest odpowiednim krokiem. Niestety ta porada nie znalazła się na pierwszym miejscu. Natomiast kolejny raz odpowiedź wygenerowana przez Bard jest zwyczajnie bardziej odpowiednia. Wzmianka o trybie awaryjnym nie ma co prawda uzasadnienia, ale pozostałe opisy są oczywiście właściwe.

Oprócz maszyny wirtualnej można użyć także sandbox, dzięki czemu aplikacja zostanie uruchomiona w odizolowanym środowisku w ramach naszego systemu. Osobiście jednak wybrałbym wirtualizację, ponieważ to wygodniejsza opcja.

Pytania z kategorii: Praca Administratora IT

Pytanie nr 1:

Do serwera VPS z systemem Debian został dodany osobny dysk twardy przeznaczony na bazy danych MySQL. Usługa MySQL nie została jeszcze zainstalowana. Opisz kroki, które należy wykonać, aby dane były zapisywane na dedykowanym dysku.

Odpowiedź ChatGPT

Aby skonfigurować serwer VPS z systemem Debian w celu przechowywania danych MySQL na dedykowanym dysku, musisz podjąć następujące kroki:

1. Podłączanie dysku twardego:

  • Podłącz fizycznie dysk twardy do serwera VPS. Upewnij się, że dysk jest poprawnie zamontowany i gotowy do użycia.
  • Sprawdź, czy dysk został rozpoznany przez system. Możesz to zrobić, wykonując polecenie lsblk lub fdisk -l. Dysk powinien być widoczny jako nowe urządzenie blokowe, np. /dev/sdb.

2. Inicjalizacja dysku:

  • Jeśli dysk nie jest jeszcze sformatowany, musisz go zainicjalizować. Możesz to zrobić za pomocą narzędzia fdisk. Uruchom polecenie fdisk /dev/sdb (zastąp /dev/sdb odpowiednim urządzeniem dyskowym).
  • W narzędziu fdisk utwórz nową partycję na dysku, wybierając opcję n. Wybierz rozmiar partycji i postępuj zgodnie z instrukcjami na ekranie.
  • Zapisz zmiany i wyjdź z narzędzia fdisk za pomocą opcji w.

3. Tworzenie systemu plików:

  • Teraz, gdy dysk ma partycję, możesz utworzyć na niej system plików. Najczęściej używanym systemem plików dla Linuksa jest ext4. Wykonaj polecenie mkfs.ext4 /dev/sdb1 (zastąp /dev/sdb1 odpowiednim urządzeniem partycji).
  • System plików zostanie teraz utworzony na partycji dysku.

4. Montowanie dysku:

  • Stwórz katalog, który będzie punktem montowania dla dysku. Na przykład, wykonaj polecenie mkdir /mnt/mysql.
  • Następnie zamontuj nowo utworzone urządzenie partycji w tym katalogu. Wykonaj polecenie mount /dev/sdb1 /mnt/mysql.

5. Konfiguracja MySQL:

  • Zainstaluj serwer MySQL, jeśli jeszcze tego nie zrobiłeś. Możesz to zrobić za pomocą menedżera pakietów, na przykład poleceniem apt install mysql-server.
  • Otwórz plik konfiguracyjny MySQL. Zazwyczaj znajduje się on pod ścieżką /etc/mysql/mysql.conf.d/mysqld.cnf.
  • Znajdź sekcję dotyczącą konfiguracji ścieżki do danych i katalogu tymczasowego. Najprawdopodobniej będzie to linia zaczynająca się od datadir i tmpdir.
  • Zmień wartość datadir na ścieżkę montowania dysku, którą utworzyłeś wcześniej. Na przykład, datadir = /mnt/mysql.
  • Zapisz plik konfiguracyjny i zamknij go.

6. Restartowanie usługi MySQL:

  • Uruchom ponownie usługę MySQL, aby wczytać nową konfigurację. Możesz to zrobić poleceniem service mysql restart lub systemctl restart mysql.

Po wykonaniu tych kroków MySQL będzie zapisywać dane na dedykowanym dysku twardym. Upewnij się, że dysk jest zamontowany przy każdym uruchomieniu systemu, dodając wpis do pliku /etc/fstab, aby system automatycznie montował dysk na odpowiednią ścieżkę.

Odpowiedź Bard

Jasne, oto kroki, które należy wykonać, aby dane były zapisywane na dedykowanym dysku:

  1. Zainstaluj usługę MySQL.
  2. Utwórz nowy katalog dla baz danych MySQL.
  3. Zmień właściciela i uprawnienia do nowego katalogu.
  4. Edytuj plik my.cnf i ustaw zmienną datadir na nowy katalog.
  5. Uruchom ponownie usługę MySQL.

Oto szczegółowe instrukcje krok po kroku:

1. Zainstaluj usługę MySQL:

sudo apt-get install mysql-server

2. Utwórz nowy katalog dla baz danych MySQL:

sudo mkdir /var/lib/mysql

3. Zmień właściciela i uprawnienia do nowego katalogu:

sudo chown mysql:mysql /var/lib/mysql

sudo chmod 700 /var/lib/mysql

4. Edytuj plik my.cnf i ustaw zmienną datadir na nowy katalog:

sudo nano /etc/mysql/my.cnf

Znajdź sekcję [mysqld] i dodaj następującą linię:

datadir=/var/lib/mysql

5. Uruchom ponownie usługę MySQL:

sudo service mysql restart

Po wykonaniu tych kroków dane MySQL będą zapisywane na dedykowanym dysku.

Komentarz AVLab:

Oba rozwiązania przedstawiły zbyt wiele czynności, które nie są potrzebne. Ogólne rozwiązanie tej sytuacji jest wyjątkowo proste. W pytaniu zaznaczyłem, że dysk został już dodany do serwera VPS (ChatGPT sugeruje go jednak z jakiegoś powodu fizycznie podłączyć). Wystarczy sprawdzić poleceniem fdisk -l, czy dysk jest widoczny w systemie, a następnie ponownie z użyciem polecenia fdisk utworzyć na nim pustą partycję. Dalej poleceniem mkfs formatujemy ją na system plików ext4, tworzymy katalog /var/lib/mysql i jedynie montujemy urządzenie blokowe /dev/sdX1 w tej lokalizacji. Oczywiście należy też zmodyfikować plik /etc/fstab i dodać wpis dla nowej partycji, aby była automatycznie montowana po restarcie systemu (w innym wypadku usługa MySQL nie zostanie uruchomiona).

Tymczasem ChatGPT montuje nowy dysk w lokalizacji /mnt/mysql. Wtedy rzeczywiście konieczna jest zmiana ustawienia datadir. Nie widzę jednak przyczyny, dla której nie należy korzystać z domyślnych lokalizacji (/var/lib/mysql). Bard z kolei nie wspomina nic o montowaniu dysku. Twierdzi, że po zainstalowaniu MySQL wystarczy utworzyć katalog, zmienić datadir (niepotrzebnie) i zrestartować usługę. ChatGPT lepiej poradził sobie z tym pytaniem, chociaż za bardzo skomplikował cały proces.

Inna sprawa, że w Debianie nie zainstalujemy ot tak pakietu mysql-server. Domyślnie w repozytorium jest mariadb-server, a do instalacji MySQL potrzebujemy dodać inne repozytorium.

Pytanie nr 2:

W sieci działa serwer z systemem Debian pełniący rolę routera. Posiada on dwa interfejsy sieciowe:

– WAN (adresy 100.0.0.1/24 i 100.0.0.100/24)

– LAN (adres 10.0.0.1/24)

Na lokalnym hoście o adresie 10.0.0.25 działa serwer OpenVPN (port 1194 UDP) dla pracowników.

Podaj parametry polecenia iptables, które umożliwią korzystanie z tego serwera VPN poprzez łączenie z drugim adresem WAN (100.0.0.100), a tym samym dostęp do sieci LAN z zewnątrz.

Odpowiedź ChatGPT

Aby umożliwić korzystanie z serwera VPN poprzez drugi adres WAN (100.0.0.100) oraz zapewnić dostęp do sieci LAN z zewnątrz, można skorzystać z poniższego zestawu poleceń iptables:

1. Ustalanie domyślnych zasad dla łańcuchów INPUT, FORWARD i OUTPUT:

iptables -P INPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -P OUTPUT ACCEPT

2. Akceptowanie ruchu lokalnego:

iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

3. Pozwolenie na przychodzące połączenia związane z już nawiązanymi połączeniami:

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

4,. Przekazywanie pakietów między interfejsami sieciowymi:

iptables -A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT

Gdzie eth0 oznacza interfejs WAN, a tun0 to interfejs OpenVPN.

5. Przekierowanie ruchu VPN na serwer OpenVPN:

iptables -t nat -A PREROUTING -d 100.0.0.100 -p udp --dport 1194 -j DNAT --to-destination 10.0.0.25:1194

6. Ustalenie reguły POSTROUTING dla przekierowanego ruchu VPN:

iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE

To jest tylko przykładowy zestaw poleceń i może wymagać dostosowania do konkretnej konfiguracji sieci. Upewnij się, że dostosowujesz je do swoich wymagań i uwzględniasz odpowiednie interfejsy sieciowe oraz adresy IP.

Odpowiedź Bard

Oto parametry polecenia iptables, które umożliwią korzystanie z serwera OpenVPN poprzez łączenie z drugim adresem WAN (100.0.0.100) i dostęp do sieci LAN z zewnątrz:

iptables -t nat -A PREROUTING -p udp --dport 1194 -j DNAT --to-destination 10.0.0.25:1194

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Pierwsze polecenie przekierowuje ruch przychodzący na port 1194 na adres 10.0.0.25. Drugie polecenie maskuje adres IP klienta VPN, aby wyglądał jak adres IP routera.

Po wprowadzeniu tych zmian klienci VPN będą mogli łączyć się z serwerem OpenVPN za pośrednictwem adresu 100.0.0.100 i uzyskiwać dostęp do zasobów w sieci LAN.

Komentarz AVLab:

ChatGPT poprawne polecenie przedstawił na samym końcu, zaczynając od podstawowych reguł. Nie było to potrzebne, bo skoro system już funkcjonuje jako router, to wcześniej i tak należało dodać pewne reguły iptables (m.in. aktywacja MASQUERADE, o której ChatGPT zapomniał).

W praktyce wystarczy dodać jedynie tę regułę:

iptables -t nat -A PREROUTING -p udp -d 100.0.0.100 --dport 1194 -j DNAT --to-destination 10.0.0.25:1194

vBard przedstawił podobne polecenie, jednak nie uwzględnił warunku z pytania — VPN miał być dostępny z drugiego adresu IP, a nie ze wszystkich przypisanych do karty. .

Pytanie nr 3:

Serwer Apache z PHP nasłuchuje na lokalnym porcie 8000 i ma skonfigurowany virtual host dla pewnej witryny WordPress. Za ruch HTTP i HTTPS odpowiada NGINX działający jako reverse proxy (na domyślnych portach 80 i 443). Po odwiedzeniu witryny niektóre jej elementy nie są poprawnie ładowane, a w konsoli przeglądarki pojawiają się błędy mixed-content. Podaj rozwiązanie tego problemu zakładając, że administrator witryny ma dostęp do serwera jako root.

Odpowiedź ChatGPT

Aby rozwiązać problem mixed-content i umożliwić poprawne ładowanie elementów na stronie WordPress, administrator witryny powinien podjąć następujące kroki:

  1. Edycja pliku konfiguracyjnego NGINX:
  2. Znajdź plik konfiguracyjny dla witryny wirtualnej NGINX, zwykle znajduje się w katalogu /etc/nginx/sites-available/.
  3. Otwórz ten plik konfiguracyjny do edycji.
  4. Znajdź sekcję server odpowiadającą dla witryny WordPress.
  5. Dodaj poniższe linie konfiguracyjne wewnątrz sekcji server:

location / {

proxy_pass http://localhost:8000;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

# Rozwiązanie mixed-content

proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "Upgrade";

}

Powyższe linie konfiguracyjne ustawiają nagłówki, które przekazują odpowiednie informacje z reverse proxy (NGINX) do serwera Apache z PHP. W szczególności X-Forwarded-Proto ustawia protokół używany przez klienta, co umożliwia serwerowi Apache dostosowanie odpowiedzi do poprawnego protokołu (HTTP lub HTTPS).

  1. Zapisz plik konfiguracyjny NGINX i zamknij go.
  2. Zrestartuj usługę NGINX:
  3. Uruchom następujące polecenie jako root lub administrator systemu, aby zrestartować usługę NGINX:

systemctl restart nginx

To spowoduje ponowne uruchomienie NGINX i wczytanie nowej konfiguracji.

Po wykonaniu tych kroków, serwer NGINX będzie przekazywał odpowiednie nagłówki do serwera Apache, umożliwiając prawidłowe ładowanie elementów na stronie WordPress i unikając błędów mixed-content.

Odpowiedź Bard

Błędy mixed-content występują, gdy strona internetowa łączy się z zasobami, które są dostępne tylko po HTTP, podczas gdy sama strona jest dostępna po HTTPS. W przypadku witryn WordPress często przyczyną tego problemu są skrypty uruchamiane przez serwer Apache, takie jak skrypty Akismet, Contact Form 7 lub TinyMCE. Aby rozwiązać ten problem, należy skonfigurować serwer NGINX tak, aby przesyłał te skrypty na porcie 8000. Można to zrobić, dodając następujące reguły do pliku konfiguracyjnego NGINX:

upstream wordpress {

server localhost:8000;

}

server {

listen 80;

server_name example.com;

location / {

proxy_pass http://wordpress;

location ~* ^/wp-admin/ {

proxy_pass http://wordpress;

}

}

Po wprowadzeniu tych zmian należy ponownie uruchomić serwer NGINX. Po ponownym uruchomieniu serwera strona internetowa powinna być dostępna bez błędów mixed-content.

Jeśli problem nadal występuje, należy sprawdzić inne skrypty lub pliki zasobów, które mogą być dostępne tylko po HTTP. Należy również sprawdzić ustawienia serwera Apache, aby upewnić się, że wszystkie skrypty i pliki zasobów są ładowane przez serwer NGINX.

Komentarz AVLab:

Bardzo dobre pytanie, ponieważ żadna z wygenerowanych odpowiedzi nie jest poprawna. Nagłówki, o których wspomina ChatGPT, niestety nie rozwiązują tego problemu.

Gorzej z tym zadaniem poradził sobie jednak Bard, ponieważ przedstawiona konfiguracja jest całkowicie błędna.

Po pierwsze NGINX ma obsługiwać zarówno ruch HTTP jak i HTTPS, więc brakuje bloku server z listen 443 ssl;. Reguła location dla wp-admin sprawi natomiast, że strona przestanie poprawnie działać (wp-admin zwróci kod 404).

Rozwiązaniem jest konfiguracja "dwóch" virtual host w Apache: jednego dla HTTP, drugiego dla HTTPS (można to wykonać w tym samym pliku). Należy, co oczywiste, uruchomić je pod dwoma różnymi lokalnymi portami. Wtedy w konfiguracji witryny w NGINX ustawiamy przekierowanie ruchu HTTP na port Apache z HTTP, a HTTPS analogicznie na port Apache z HTTPS.

Jeśli jednak nie zamierzamy zmieniać konfiguracji, wystarczy też dodać do wp-config.php poniższą instrukcję:

if ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') { $_SERVER['HTTPS'] = 'on'; }

Pytania z kategorii: DevOps

Pytanie nr 1:

Przygotowany został obraz Docker o nazwie dhcp-prod:latest z usługą DHCP dla całej sieci lokalnej. Podaj odpowiednie parametry polecenia docker run, aby uruchomić kontener z tym obrazem.

Odpowiedź ChatGPT

Aby uruchomić kontener z obrazem Docker o nazwie "dhcp-prod:latest" i skonfigurować usługę DHCP dla całej sieci lokalnej, należy użyć polecenia docker run z odpowiednimi parametrami. Oto przykładowe polecenie:

docker run --name dhcp-container --network=host --privileged dhcp-prod:latest

Wyjaśnienie parametrów:

  • –name dhcp-container nadaje kontenerowi nazwę "dhcp-container". Możesz zmienić tę nazwę na dowolną inną, jeśli preferujesz.
  • –network=host korzysta z trybu sieciowego host, co oznacza, że kontener będzie korzystać bezpośrednio z interfejsów sieciowych hosta. Umożliwi to udostępnienie usługi DHCP dla całej sieci lokalnej.
  • –privileged nadaje kontenerowi uprawnienia pełnej kontroli nad systemem hosta, co może być wymagane dla usługi DHCP.

Pamiętaj, że powyższe polecenie zakłada, że obraz "dhcp-prod:latest" jest już dostępny lokalnie. Jeśli nie jest, należy najpierw pobrać ten obraz za pomocą polecenia docker pull dhcp-prod:latest. Upewnij się również, że masz zainstalowany Docker na swoim systemie.

Odpowiedź Bard

Oto odpowiednie parametry polecenia docker run, aby uruchomić kontener z obrazem dhcp-prod:latest:

docker run -d --name dhcp-server -p 67:67/udp dhcp-prod:latest

Parametry:

  • -d – uruchamia kontener w trybieDetached, czyli w tle.
  • –name – nadaje kontenerowi nazwę dhcp-server.
  • -p 67:67/udp – mapuje port 67 kontenera na port 67 hosta. Port 67 jest używany przez usługę DHCP.
  • dhcp-prod:latest – wskazuje obraz Dockera, z którego ma zostać uruchomiony kontener.

Po uruchomieniu kontenera usługa DHCP będzie dostępna na porcie 67 hosta.

Komentarz AVLab:

Odpowiedź ChatGPT jest prawidłowa. Kluczowe jest użycie parametru --network=host, ponieważ bez tej opcji serwer DHCP nie będzie mógł przydzielać konfiguracji pozostałym hostom w sieci (wtedy też nie ma potrzeby użycia opcji -p, ponieważ i tak zostanie zignorowana). Dodatkowo podanie wersji obrazu, gdy mamy na myśli latest, nie jest wymagane.

Samo wystawienie portu 67 UDP nie będzie wystarczające — Bard nie poradził sobie z tym zagadnieniem.

Pytanie nr 2:

W konfiguracji GitLab CI/CD zdefiniowano dwa stage: build i deploy. W jaki sposób ograniczyć wykonywanie stage deploy wyłącznie do gałęzi master (aby nie był wykonywany dla pozostałych branchy)?

Odpowiedź ChatGPT

Aby ograniczyć wykonanie stage deploy wyłącznie do gałęzi master w konfiguracji GitLab CI/CD, można skorzystać z warunkowych bloków (rules) w definicji deploy stage.

Poniżej przedstawiam przykład, jak można zdefiniować taką konfigurację w pliku .gitlab-ci.yml:

stages:

- build

- deploy

build_job:

stage: build

# Konfiguracja zadania budowania

deploy_job:

stage: deploy

rules:

- if: '$CI_COMMIT_REF_NAME == "master"'

when: on_success

# Konfiguracja zadania deploy dla gałęzi master

- when: never

# Wyłączanie wykonania zadania deploy dla innych branchy

W powyższym przykładzie:

  • Stage build jest definiowany jako pierwszy, a deploy jako drugi.
  • Zadanie build_job jest przypisane do stage build i musisz skonfigurować je zgodnie z wymaganiami dotyczącymi procesu budowania.
  • Zadanie deploy_job jest przypisane do stage deploy.
  • W bloku rules dla zadania deploy_job są zdefiniowane dwa warunki.
  • Pierwszy warunek sprawdza, czy nazwa aktualnie wykonywanej gałęzi ($CI_COMMIT_REF_NAME) jest równa "master". Jeśli tak, to zadanie deploy_job zostanie wykonane po pomyślnym zakończeniu zadania build_job (when: on_success).
  • Drugi warunek (when: never) oznacza, że zadanie deploy_job nie zostanie nigdy wykonane dla innych branchy.

Dzięki powyższej konfiguracji stage deploy będzie wykonywany tylko dla gałęzi master, a dla innych branchy nie będzie uruchamiane zadanie deploy_job.

Odpowiedź Bard

Aby ograniczyć wykonywanie stage deploy wyłącznie do gałęzi master, możesz użyć klauzuli only w definicji stage. Klauzula only przyjmuje listę branchy, dla których stage ma być wykonywany. Na przykład, aby ograniczyć stage deploy do gałęzi master, możesz użyć następującej definicji:

stages:

- build

- deploy

deploy:

stage: deploy

only:

- master

Jeśli stage zostanie wywołany dla innej gałęzi niż master, zostanie on pominięty.

Oto przykład konfiguracji GitLab CI/CD z definicją dwóch stage: build i deploy, z których stage deploy jest ograniczony do gałęzi master:

.gitlab-ci.yml

stages:

- build

- deploy

build:

stage: build

script:

- echo "Building..."

deploy:

stage: deploy

only:

- master

script:

- echo "Deploying to production..."

Jeśli wykonasz polecenie gitlab-runner run, stage build zostanie wykonany dla wszystkich branchy, ale stage deploy zostanie wykonany tylko dla gałęzi master.

Komentarz AVLab:

Odpowiedź Bard jest bardzo dobra — korzystając z reguły only możemy określić branche, dla których dany stage w CI/CD ma się wykonywać.

Rozwiązanie zaprezentowane przez ChatGPT będzie działać (tagi only i except nie są już rozwijane), ale nie widzę powodu, dla których konfiguracja ma być tak rozbudowywana, skoro starsze sposoby cały czas są dostępne.

Pytanie nr 3:

Przygotowany został obraz Docker o nazwie php-ci:8.2. Nie korzystam z żadnego container registry. Obraz został przesłany na poszczególne runnery GitLab. W jaki sposób zmodyfikować ich konfigurację, aby korzystały z lokalnych obrazów (aktualnie próbują pobierać je z container registry)?

Odpowiedź ChatGPT

Aby zmodyfikować konfigurację runnerów GitLab tak, aby korzystały z lokalnych obrazów Docker, musisz zaktualizować plik konfiguracyjny runnera. Poniżej przedstawiam kroki, które należy podjąć:

  1. Zaloguj się na serwerze, na którym zainstalowany jest runner GitLab.
  2. Zlokalizuj plik konfiguracyjny runnera. Domyślnie plik ten znajduje się w katalogu /etc/gitlab-runner/config.toml. Możesz użyć edytora tekstowego, takiego jak nano lub vim, aby otworzyć ten plik.
  3. Znajdź sekcję [runners.docker] w pliku konfiguracyjnym. W tej sekcji znajdują się ustawienia związane z Dockerem.
  4. W sekcji [runners.docker] znajdź klucz image i zmodyfikuj jego wartość, aby wskazywała na lokalny obraz Docker php-ci:8.2. Na przykład:

image = "php-ci:8.2"

  1. Zapisz plik konfiguracyjny.
  2. Zrestartuj runner GitLab, aby zastosować wprowadzone zmiany. Możesz użyć odpowiedniej komendy, np. sudo gitlab-runner restart.

Po wykonaniu tych kroków runner GitLab będzie korzystał z lokalnego obrazu Docker php-ci:8.2 zamiast próbować pobierać go z kontenerowego rejestru. Upewnij się, że obraz php-ci:8.2 jest dostępny na każdym runnerze, na którym chcesz go używać. Możesz go zbudować lokalnie na każdym runnerze lub przesłać go na każdy runner zewnętrznymi środkami, takimi jak SCP lub innymi narzędziami do przesyłania plików.

Odpowiedź Bard

Aby zmodyfikować konfigurację runnerów GitLab, aby korzystały z lokalnych obrazów Docker, możesz użyć następujących kroków:

  1. Otwórz plik .gitlab-ci.yml w edytorze tekstu.
  2. Znajdź sekcję image w definicji każdego joba.
  3. Zmień wartość parametru image na ścieżkę do lokalnego obrazu Docker.
  4. Zapisz plik i zamknij go.
  5. Uruchom polecenie gitlab-runner restart.

Po wykonaniu tych kroków runnery GitLab będą teraz korzystać z lokalnych obrazów Docker.

Na przykład, jeśli obraz Docker znajduje się w lokalnym katalogu /home/user/images/php-ci:8.2, możesz zmodyfikować definicję joba w następujący sposób:

image: /home/user/images/php-ci:8.2

Po uruchomieniu polecenia gitlab-runner restart runnery GitLab będą teraz korzystać z lokalnego obrazu Docker.

Jeśli masz problemy z konfiguracją runnerów GitLab, możesz zapoznać się z dokumentacją GitLab.

Komentarz AVLab:

To nie są poprawne odpowiedzi. Właściwym rozwiązaniem byłoby dodanie ustawienia pull_policy = "if-not-present" w sekcji [runners.docker] w pliku /etc/gitlab-runner/config.toml

Czy AI daje radę? Podsumowanie

Można zauważyć, że AI nie do końca radzi sobie z rozwiązywaniem problemów należących do zakresu podanej tutaj tematyki. Twierdzenie, że "AI zastąpi programistów" czy innych specjalistów IT, jest więc wyjątkowo mało prawdopodobne. Na teraz.

O ile testowane rozwiązania potrafią czasem wygenerować działający kod (szczególnie przy niezwykle dokładnie sprecyzowanych wymaganiach), to jednak wątpię, żeby napisały (a potem rozwijały) całą aplikację i opisały kroki prowadzące do zbudowania środowiska hostującego takową aplikację. Może to być pewne ułatwienie w codziennej pracy — raz użyłem ChatGPT do napisania skryptu Bash automatyzującego pewną bardzo żmudną czynność — ale wciąż nie do przecenienia jest wykształcenie i edukacja z innych źródeł.

Michał Giza, dziennikarz avlab.pl

Programy

Zobacz więcej
Źródło artykułu:avlab.pl
Wybrane dla Ciebie
Komentarze (16)