Jak korzystać z funkcji Port Knocking w systemie Linux (i dlaczego nie powinieneś)

Opublikowany: 2022-01-29
Ręka puka do zamkniętych drzwi.
Photographee.eu/Shutterstock

Pukanie portów to sposób na zabezpieczenie serwera przez zamknięcie portów zapory — nawet te, o których wiesz, że będą używane. Porty te są otwierane na żądanie wtedy i tylko wtedy, gdy żądanie połączenia zapewnia tajne pukanie.

Pukanie do portu to „sekretne pukanie”

W latach dwudziestych, kiedy prohibicja była w pełnym rozkwicie, jeśli chciałeś dostać się do schronienia, musiałeś znać sekretne pukanie i wystukać go poprawnie, aby dostać się do środka.

Pukanie do portu to współczesny odpowiednik. Jeśli chcesz, aby ludzie mieli dostęp do usług na Twoim komputerze, ale nie chcesz otwierać zapory sieciowej do Internetu, możesz użyć funkcji „port knocking”. Pozwala na zamknięcie portów na zaporze, które zezwalają na połączenia przychodzące i ich automatyczne otwieranie po wykonaniu ustalonego wzorca prób połączenia. Sekwencja prób połączenia działa jak tajne pukanie. Kolejne tajne pukanie zamyka port.

Pukanie do portów jest czymś nowym, ale ważne jest, aby wiedzieć, że jest to przykład bezpieczeństwa poprzez ukrywanie, a ta koncepcja jest zasadniczo błędna. Sekret dostępu do systemu jest bezpieczny, ponieważ znają go tylko osoby z określonej grupy. Ale kiedy ten sekret zostanie ujawniony – albo dlatego, że został ujawniony, zaobserwowany, odgadnięty lub rozwiązany – twoje bezpieczeństwo jest nieważne. Lepiej jest zabezpieczyć swój serwer w inny, silniejszy sposób, na przykład wymaganie logowania opartego na kluczu dla serwera SSH.

Reklama

Najbardziej niezawodne podejścia do cyberbezpieczeństwa są wielowarstwowe, więc być może jedną z tych warstw powinno być stukanie portów. Im więcej warstw, tym lepiej, prawda? Można jednak argumentować, że stukanie portów nie dodaje wiele (jeśli w ogóle) do odpowiednio utwardzonego, bezpiecznego systemu.

Cyberbezpieczeństwo to rozległy i skomplikowany temat, ale nie powinieneś używać stukania portów jako jedynej formy obrony.

POWIĄZANE: Jak tworzyć i instalować klucze SSH z powłoki systemu Linux

Instalowanie zapukał

Aby zademonstrować stukanie portów, użyjemy go do kontrolowania portu 22, który jest portem SSH. Użyjemy narzędzia o nazwie knockd. Użyj apt-get aby zainstalować ten pakiet w swoim systemie, jeśli używasz Ubuntu lub innej dystrybucji opartej na Debianie. W innych dystrybucjach Linuksa zamiast tego użyj narzędzia do zarządzania pakietami dystrybucji Linuksa.

Wpisz następujące polecenie:

 sudo apt-get install knockd 

Prawdopodobnie masz już zainstalowaną zaporę iptables w swoim systemie, ale może być konieczne zainstalowanie pakietu iptables-persistent . Obsługuje automatyczne ładowanie zapisanych reguł iptable .

Wpisz następujące polecenie, aby go zainstalować:

 sudo apt-get install iptables-persistent 

Gdy pojawi się ekran konfiguracji IPV4, naciśnij spację, aby zaakceptować opcję „Tak”.

Naciśnij spację, aby zaakceptować opcję „Tak” na ekranie iptables-persistent IPV4.

Ponownie naciśnij spację na ekranie konfiguracji IPv6, aby zaakceptować opcję „Tak” i przejść dalej.

Naciśnij spację, aby zaakceptować opcję „Tak” na ekranie konfiguracji IPv6.

Reklama

Następujące polecenie mówi iptables , aby zezwolił na kontynuację nawiązanych i trwających połączeń. Wydamy teraz kolejne polecenie, aby zamknąć port SSH.

Jeśli ktoś jest połączony przez SSH, gdy wydajemy to polecenie, nie chcemy, aby został odcięty:

 sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 

To polecenie dodaje do zapory regułę, która mówi:

  • -A : Dołącz regułę do tabeli reguł zapory. Oznacza to, że dodaj go na dole.
  • INPUT : To jest reguła dotycząca połączeń przychodzących.
  • -m conntrack : reguły zapory działają na ruch sieciowy (pakiety), który spełnia kryteria w regule. Parametr -m powoduje, że iptables używa dodatkowych modułów dopasowujących pakiety — w tym przypadku ten o nazwie conntrack współpracuje z możliwościami jądra śledzenia połączeń sieciowych.
  • –cstate ESTABLISHED,RELATED : Określa typ połączenia, do którego ma zastosowanie reguła, a mianowicie połączenia ESTABLISHED i RELATED. Ustanowione połączenie to takie, które już trwa. Powiązane połączenie to takie, które zostało nawiązane w wyniku działania z nawiązanego połączenia. Być może ktoś, kto jest podłączony, chce pobrać plik; może się to zdarzyć w przypadku nowego połączenia zainicjowanego przez hosta.
  • -j AKCEPTUJ : Jeśli ruch jest zgodny z regułą, przejdź do celu AKCEPTUJ w zaporze. Innymi słowy, ruch jest akceptowany i przepuszczany przez zaporę.

Teraz możemy wydać polecenie zamknięcia portu:

 sudo iptables -A WEJŚCIE -p tcp --dport 22 -j ODRZUCENIE 

To polecenie dodaje do zapory regułę, która mówi:

  • -A : Dołącz regułę do tabeli reguł zapory, tj. dodaj ją na dole.
  • INPUT : Ta reguła dotyczy połączeń przychodzących.
  • -p tcp : ta reguła dotyczy ruchu korzystającego z protokołu kontroli transmisji.
  • –dport 22 : ta reguła dotyczy w szczególności ruchu TCP, którego celem jest port 22 (port SSH).
  • -j REJECT : Jeśli ruch jest zgodny z regułą, przejdź do celu REJECT w zaporze. Tak więc, jeśli ruch zostanie odrzucony, nie będzie przepuszczany przez zaporę.

Musimy uruchomić demona netfilter-persistent . Możemy to zrobić za pomocą tego polecenia:

 sudo systemctl start netfilter-persistent 

Chcemy, aby netfilter-persistent przeszedł cykl zapisywania i ponownego ładowania, więc ładuje i kontroluje reguły iptable .

Wpisz następujące polecenia:

 sudo netfilter-persistent save 

 sudo netfilter-persistent reload 

Reklama

Zainstalowałeś teraz narzędzia, a port SSH jest zamknięty (miejmy nadzieję, bez przerywania nikomu połączenia). Teraz czas na skonfigurowanie tajnego pukania.

Konfiguracja zapukania

Istnieją dwa pliki, które edytujesz, aby skonfigurować knockd . Pierwszym z nich jest następujący plik konfiguracyjny knockd :

 sudo gedit /etc/knockd.conf 

Edytor gedit otwiera się z załadowanym plikiem konfiguracyjnym knockd .

Plik konfiguracyjny knockd w edytorze gedit.

Zmodyfikujemy ten plik do własnych potrzeb. Interesujące nas sekcje to „openSSH” i „closeSSH”. W każdej sekcji znajdują się następujące cztery wpisy:

  • sekwencja : sekwencja portów, które ktoś musi uzyskać, aby otworzyć lub zamknąć port 22. Domyślne porty to 7000, 8000 i 9000, aby go otworzyć oraz 9000, 8000 i 7000, aby go zamknąć. Możesz je zmienić lub dodać więcej portów do listy. Dla naszych celów będziemy trzymać się wartości domyślnych.
  • seq_timeout : Okres czasu, w którym ktoś musi uzyskać dostęp do portów, aby wywołać otwarcie lub zamknięcie.
  • polecenie : Polecenie wysyłane do zapory iptables po uruchomieniu akcji otwierania lub zamykania. Te polecenia dodają regułę do zapory (aby otworzyć port) lub ją usuwają (aby zamknąć port).
  • tcpflags : Typ pakietu, który każdy port musi odebrać w tajnej sekwencji. Pakiet SYN (synchronizacja) jest pierwszym w żądaniu połączenia TCP, nazywanym uzgadnianiem trójstronnym.

Sekcja "openSSH" może być odczytana jako "żądanie połączenia TCP musi zostać wysłane do portów 7000, 8000 i 9000 - w tej kolejności i w ciągu 5 sekund - aby polecenie otwarcia portu 22 zostało wysłane do zapory".

Reklama

Sekcja „closeSSH” może być odczytana jako „żądanie połączenia TCP musi zostać wysłane do portów 9000, 8000 i 7000 — w tej kolejności i w ciągu 5 sekund — aby polecenie zamknięcia portu 22 zostało wysłane do zapory sieciowej”.

Zasady zapory

Wpisy „polecenia” w sekcjach openSSH i closeSSH pozostają takie same, z wyjątkiem jednego parametru. Oto jak się składają:

  • -A : Dołącz regułę na dole listy reguł zapory (dla polecenia openSSH).
  • -D : Usuń polecenie z listy reguł zapory (dla polecenia closeSSH).
  • INPUT : Ta reguła dotyczy przychodzącego ruchu sieciowego.
  • -s %IP% : Adres IP urządzenia żądającego połączenia.
  • -p : protokół sieciowy; w tym przypadku jest to TCP.
  • –dport : port docelowy; w naszym przykładzie jest to port 22.
  • -j AKCEPTUJ : Przeskocz do celu akceptacji w obrębie zapory. Innymi słowy, pozwól pakietowi przejść przez pozostałe reguły bez działania na niego.

Wybite edycje pliku konfiguracyjnego

Zmiany, które wprowadzimy w pliku, są poniżej zaznaczone na czerwono:

Odrzucony plik konfiguracyjny w edytorze gedit z podświetlonymi zmianami.

Wydłużamy „seq_timeout” do 15 sekund. To jest hojne, ale jeśli ktoś ręcznie uruchamia żądania połączenia, może potrzebować tyle czasu.

W sekcji „openSSH” zmieniamy opcję -A (append) w poleceniu na -I (insert). To polecenie wstawia nową regułę zapory na górze listy reguł zapory. Jeśli zostawisz opcję -A , dołącza ona listę reguł zapory i umieszcza ją na dole .

Ruch przychodzący jest testowany pod kątem każdej reguły zapory na liście od góry do dołu. Mamy już regułę, która zamyka port 22. Jeśli więc ruch przychodzący jest testowany pod kątem tej reguły, zanim zobaczy regułę zezwalającą na ruch, połączenie zostanie odrzucone; jeśli najpierw zobaczy tę nową regułę, połączenie jest dozwolone.

Polecenie close usuwa regułę dodaną przez openSSH z reguł zapory. Ruch SSH jest ponownie obsługiwany przez istniejącą wcześniej regułę „port 22 jest zamknięty”.

Po wprowadzeniu tych zmian zapisz plik konfiguracyjny.

POWIĄZANE: Jak edytować pliki tekstowe graficznie w systemie Linux za pomocą gedit

Wybite edycje pliku kontrolnego

Plik kontrolny knockd jest całkowicie prostszy. Zanim jednak zanurkujemy i zmienimy to, musimy znać wewnętrzną nazwę naszego połączenia sieciowego; aby go znaleźć, wpisz to polecenie:

 adres IP 

Reklama

Połączenie, którego używa ta maszyna do badania tego artykułu, nazywa się enp0s3 . Zanotuj nazwę swojego połączenia.

Następujące polecenie edytuje knockd plik kontrolny:

 sudo gedit /etc/default/knockd 

Oto knockd plik w gedit .

Odrzucony plik kontrolny w gedit.

Kilka zmian, które musimy wprowadzić, jest podświetlonych na czerwono:

Wybity plik kontrolny w gedit z podświetlonymi zmianami.

Zmieniliśmy wpis „START_KNOCKD=” z 0 na 1.

Usunęliśmy również hash # z początku wpisu „KNOCKD_OPTS=” i zastąpiliśmy „eth1” nazwą naszego połączenia sieciowego, enp0s3 . Oczywiście, jeśli twoje połączenie sieciowe to eth1 , nie zmienisz go.

Dowód jest w budyniu

Czas sprawdzić, czy to działa. Uruchomimy demona knockd za pomocą tego polecenia:

 sudo systemctrl start knockd 

Reklama

Teraz wskoczymy na inną maszynę i spróbujemy się połączyć. Zainstalowaliśmy również narzędzie knockd na tym komputerze, nie dlatego, że chcemy skonfigurować funkcję knockdown, ale dlatego, że pakiet knockd udostępnia inne narzędzie o nazwie knock . Użyjemy tej maszyny, aby wystrzelić w naszej tajnej sekwencji i zapukać za nas.

Użyj następującego polecenia, aby wysłać tajną sekwencję żądań połączeń do portów na komputerze hosta przebijającego porty o adresie IP 192.168.4.24:

 pukanie 192.168.4.24 7000 8000 9000 -d 500

To każe knock zaatakować komputer o adresie IP 192.168.4.24 i wysłać żądanie połączenia do portów 7000, 8000 i 9000 z kolei z -d (opóźnienie) między nimi 500 milisekund.

Użytkownik o nazwie „dave” wysyła następnie żądanie SSH do 192.168.4.24:

 ssh [email protected]

Jego połączenie zostaje zaakceptowane, wprowadza hasło i rozpoczyna się jego sesja zdalna. Jego wiersz poleceń zmienia się z dave@nostromo na dave@howtogeek . Aby wylogować się ze zdalnego komputera, wpisuje:

 Wyjście

Jego wiersz polecenia wraca do jego komputera lokalnego. Ponownie używa knock i tym razem celuje w porty w odwrotnej kolejności, aby zamknąć port SSH na zdalnym komputerze.

 pukanie 192.168.4.24 9000 8000 7000 -d 500 

Reklama

Trzeba przyznać, że nie była to szczególnie owocna sesja zdalna, ale demonstruje otwieranie i zamykanie portu poprzez stukanie portu i mieści się na jednym zrzucie ekranu.

Jak to wyglądało z drugiej strony? Administrator systemu na hoście przerzucania portów używa następującego polecenia, aby wyświetlić nowe wpisy w dzienniku systemowym:

 tail -f /var/log/syslog 

  • Widzisz trzy wpisy openSSH. Są one podnoszone, gdy każdy port jest celem narzędzia Remote knock.
  • Po spełnieniu wszystkich trzech etapów sekwencji wyzwalania rejestrowany jest wpis „OPEN SESAME”
  • Wysyłane jest polecenie wstawienia reguły do ​​listy reguł iptables . Umożliwia dostęp przez SSH na porcie 22 z określonego adresu IP komputera, który dał poprawne tajne pukanie (192.168.4.23).
  • Użytkownik „dave” łączy się tylko na kilka sekund, a następnie rozłącza się.
  • Zobaczysz trzy wpisy closeSSH. Są one wywoływane, gdy każdy port jest celem narzędzia zdalnego wybijania — informuje ono hosta wybijającego porty, aby zamknął port 22.
  • Po uruchomieniu wszystkich trzech etapów ponownie otrzymujemy komunikat „OPEN SESAME”. Do zapory wysyłane jest polecenie usunięcia reguły. (Dlaczego nie „ZAMKNIJ SEZAM”, kiedy zamyka port? Kto wie?)

Teraz jedyną regułą na liście reguł iptables dotyczącą portu 22 jest ta, którą wpisaliśmy na początku, aby zamknąć ten port. Tak więc port 22 jest teraz ponownie zamknięty.

Uderz go w głowę

To jest sztuczka salonowa port knocking. Potraktuj to jako rozrywkę i nie rób tego w prawdziwym świecie. Lub, jeśli musisz, nie polegaj na tym jako jedynej formie bezpieczeństwa.