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

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

Pukanie do portu to „sekretne pukanie”

W latach dwudziestych XX wieku, kiedy zakaz był w pełnym rozkwicie, jeśli chcesz dostać się do speakeasy, trzeba było znać sekretne pukanie i dobrze go wybić, żeby dostać się do środka.

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

Pukanie do portu jest czymś w rodzaju nowości, ale ważne jest, aby wiedzieć, że to przykład bezpieczeństwo poprzez zaciemnienie, i ta koncepcja jest zasadniczo błędna. Sekret dostępu do systemu jest bezpieczny, ponieważ wiedzą o tym tylko osoby z określonej grupy. Ale kiedy ten sekret wyjdzie na jaw – albo dlatego, że został ujawniony, zaobserwowany, odgadnięty lub opracowany – twoje bezpieczeństwo jest nieważne. Lepiej jest zabezpieczyć serwer innymi, silniejszymi sposobami, na przykład wymagając logowania opartego na kluczach dla serwera SSH.

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

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

Instalowanie knockd

Aby zademonstrować pukanie portów, użyjemy go do sterowania portem 22, który jest portem SSH. Użyjemy narzędzie zwane pukaniem. 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 użyj zamiast tego narzędzia do zarządzania pakietami dystrybucji Linuksa.

Wpisz następujące informacje:

sudo apt-get install knockd

Prawdopodobnie masz już iptables firewall zainstalowany w twoim systemie, ale może być konieczne zainstalowanie pakietu iptables-persistent. Obsługuje automatyczne ładowanie zapisanych reguł iptable.

Wpisz następujące informacje, 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ć

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

Naciśnij spację, aby zaakceptować

Następujące polecenie mówi iptables, aby zezwolić na kontynuowanie ustanowionych i trwających połączeń. Wydamy teraz kolejne polecenie zamknięcia portu 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 regułę do zapory, która mówi:

-A: Dołącz regułę do tabeli reguł zapory. Oznacza to, że dodaj go na dole.
INPUT: Jest to reguła dotycząca połączeń przychodzących.
-m conntrack: Reguły zapory działają na ruch sieciowy (pakiety), który spełnia kryteria reguły. Parametr -m powoduje, że iptables używa dodatkowych modułów dopasowujących pakiety – w tym przypadku moduł o nazwie conntrack działa z możliwościami jądra śledzenia połączeń sieciowych.
–Cstate ESTABLISHED, RELATED: określa typ połączenia, do którego będzie stosowana reguła, a mianowicie połączenia USTAWIONE i POWIĄZANE. 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 nawiązanego połączenia. Być może ktoś połą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 INPUT -p tcp --dport 22 -j REJECT

To polecenie dodaje regułę do zapory, 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óry jest skierowany do portu 22 (port SSH).
-j ODRZUĆ: Jeśli ruch jest zgodny z regułą, przejdź do celu ODRZUĆ 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 działał cykl zapisywania i ponownego ładowania, więc ładuje i kontroluje iptable reguły.

Wpisz następujące polecenia:

sudo netfilter-persistent save

sudo netfilter-persistent reload

Teraz zainstalowałeś narzędzia, a port SSH jest zamknięty (miejmy nadzieję, że nie przerywa niczyjego połączenia). Teraz nadszedł czas, aby skonfigurować tajne pukanie.

Konfigurowanie knockd

Istnieją dwa pliki, które edytujesz, aby skonfigurować knockd. Pierwszy to następujący plik konfiguracyjny knockd:

sudo gedit /etc/knockd.conf

Otworzy się edytor gedit z załadowanym plikiem konfiguracyjnym knockd.

Plik konfiguracyjny knockd w edytorze gedit.

Zmodyfikujemy ten plik zgodnie z naszymi potrzebami. Sekcje, które nas interesują, to „openSSH” i „closeSSH”. W każdej sekcji znajdują się następujące cztery wpisy:

sekwencja: sekwencja portów, do których ktoś musi uzyskać dostęp, 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, w którym ktoś musi uzyskać dostęp do portów, aby otworzyć lub zamknąć.
polecenie: Polecenie wysyłane do zapory sieciowej iptables po uruchomieniu akcji otwierania lub zamykania. Te polecenia dodają regułę do zapory (w celu otwarcia portu) lub ją usuną (w celu zamknięcia portu).
tcpflags: typ pakietu, który każdy port musi odebrać w tajnej kolejności. Pakiet SYN (synchronizacja) jest pierwszym pakietem w pliku TCP żądanie połączenia, zwane a potrójny uścisk dłoni.

Sekcję „openSSH” można odczytać 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.”

Sekcja „closeSSH” może być odczytywana jako „żądanie połączenia TCP musi być 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.”

Reguły 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 końcu 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: Skok do akceptowanego celu w zaporze. Innymi słowy, pozwól pakietowi przejść przez pozostałe reguły bez wykonywania na nich działań.

Knockd Edycja pliku konfiguracyjnego

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

Plik konfiguracyjny knockd w edytorze gedit z podświetlonymi zmianami.

Przedł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 (dołącz) w poleceniu na -I (wstaw). To polecenie wstawia nową regułę zapory na górze listy reguł zapory. Jeśli opuścisz opcję -A, dopisze listę reguł zapory i umieści 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. Tak więc, jeśli ruch przychodzący jest testowany pod kątem tej reguły, zanim zobaczy regułę zezwalającą na ruch, połączenie jest odrzucane; 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.

Knockd Control File Edits

Plik kontroli pukania jest znacznie prostszy. Zanim jednak zagłębimy się w to i edytujemy, musimy znać wewnętrzną nazwę naszego połączenia sieciowego; aby go znaleźć, wpisz to polecenie:

ip addr

Plik

Połączenie używane przez tę maszynę do badania tego artykułu nazywa się enp0s3. Zanotuj nazwę swojego połączenia.

Następujące polecenie edytuje plik sterujący knockd:

sudo gedit /etc/default/knockd

Oto plik knockd w gedit.

Plik kontroli pukania w gedit.

Kilka zmian, które musimy wprowadzić, jest zaznaczonych na czerwono:

Plik kontroli stukania 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 tego.

Dowód jest w budyniu

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

sudo systemctrl start knockd

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ć pukanie portów, ale dlatego, że pakiet knockd udostępnia inne narzędzie o nazwie knock. Użyjemy tej maszyny, by wystrzelić w naszej sekretnej sekwencji i pukać za nas.

Użyj następującego polecenia, aby wysłać tajną sekwencję żądań połączenia do portów komputera hosta z funkcją przełączania portów o adresie IP 192.168.4.24:

knock 192.168.4.24 7000 8000 9000 -d 500

To mówi Knockowi, aby skierował się do komputera pod adresem IP 192.168.4.24 i wysłał żądanie połączenia do portów 7000, 8000 i 9000, z kolei z -d (opóźnieniem) 500 milisekund między nimi.

Następnie użytkownik o imieniu „dave” wysyła żądanie SSH pod numer 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 @ newsblog.pl. Aby wylogować się ze zdalnego komputera, pisze:

exit

Jego wiersz poleceń powraca do lokalnego komputera. Ponownie używa pukania i tym razem kieruje na porty w odwrotnej kolejności, aby zamknąć port SSH na zdalnym komputerze.

knock 192.168.4.24 9000 8000 7000 -d 500

Port knocking i sesja połączenia SSH w oknie terminala.

Wprawdzie nie była to szczególnie owocna sesja zdalna, ale pokazuje otwieranie i zamykanie portu za pomocą pukania portów i mieści się na jednym zrzucie ekranu.

Więc jak to wyglądało z drugiej strony? Administrator systemu na hoście z przełączaniem portów używa następującego polecenia, aby wyświetlić nowe wpisy, które pojawiają się w dzienniku systemowym:

tail -f /var/log/syslog

Dziennik syslog pokazujący zdarzenia pukania portów w oknie terminala.

Widzisz trzy wpisy openSSH. Są one podnoszone, gdy każdy port jest celem narzędzia zdalnego pukania.
Kiedy wszystkie trzy etapy sekwencji wyzwalania są spełnione, wpis mówiący „SEZAMIE, OTWÓRZ SIĘ,”Jest rejestrowany
Polecenie wstawienia reguły do ​​listy reguł iptables jest wysyłane. Zezwala na dostęp przez SSH na porcie 22 z określonego adresu IP komputera, który podał poprawną sekretną odpowiedź (192.168.4.23).
Użytkownik „dave” łączy się tylko na kilka sekund, a następnie rozłącza.
Widzisz trzy wpisy closeSSH. Są one podnoszone, gdy każdy port jest kierowany przez narzędzie zdalnego knock – informuje host pukający port, aby zamknął port 22.
Po uruchomieniu wszystkich trzech etapów ponownie otrzymujemy komunikat „OTWÓRZ SEZAM”. Polecenie jest wysyłane do zapory w celu usunięcia reguły. (Dlaczego nie „ZAMKNIJ SEZAM” podczas zamykania portu? 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. Zatem port 22 jest teraz ponownie zamknięty.

Uderz w głowę

To sztuczka z salonowym pukaniem do portu. Potraktuj to jako rozrywkę i nie rób tego w prawdziwym świecie. Lub, jeśli musisz, nie traktuj tego jako jedynej formy bezpieczeństwa.