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. Porty te 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, aby dostać się do speakeasy, trzeba było znać sekretne pukanie i dobrze je wybić, żeby dostać się do środka.
Pukanie do portów jest nowoczesnym odpowiednikiem tej praktyki. 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 ona 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 stosunkowo nowym rozwiązaniem, ale ważne jest, aby wiedzieć, że to przykład bezpieczeństwa poprzez zaciemnienie, a ta koncepcja jest zasadniczo błędna. Sekret dostępu do systemu wydaje się bezpieczny, ponieważ wiedzą o tym tylko osoby z określonej grupy. Jednak gdy ten sekret wyjdzie na jaw – na przykład poprzez ujawnienie, zaobserwowanie, odgadnięcie lub opracowanie – twoje bezpieczeństwo przestaje być skuteczne. Lepiej jest zabezpieczyć serwer innymi, silniejszymi metodami, 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. 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, dlatego 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 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 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 swoim systemie, ale może być konieczne zainstalowanie pakietu iptables-persistent. Obsługuje on automatyczne ładowanie zapisanych reguł iptables.
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”.
Ponownie naciśnij spację na ekranie konfiguracji IPv6, aby zaakceptować opcję „Tak” i przejdź dalej.
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 ją 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.
-j ACCEPT: 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 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 działał cykl zapisywania i ponownego ładowania, więc ładuje i kontroluje reguły iptables.
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.
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:
- sequence: 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ąć.
- command: 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ą usuwają (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 protokole TCP żądania połączenia, zwanym potrójnym uściskiem 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 „command” 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 ACCEPT: Skok do akceptowanego celu w zaporze. Innymi słowy, pozwól pakietowi przejść przez pozostałe reguły bez wykonywania na nich działań.
Edycja pliku konfiguracyjnego knockd
Zmiany, które wprowadzimy w pliku, są zaznaczone na czerwono poniżej:
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.
Edycja pliku sterującego knockd
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
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.
Kilka zmian, które musimy wprowadzić, jest zaznaczonych na czerwono:
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 systemctl 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 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 dave@192.168.4.24
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
Wprawdzie nie była to szczególnie owocna sesja zdalna, ale pokazuje otwieranie i zamykanie portu za pomocą pukania portów.
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
Widzisz trzy wpisy openSSH. Są one rejestrowane, 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, co pozwala na dostęp przez SSH na porcie 22 z określonego adresu IP komputera, który podał poprawną sekwencję (192.168.4.23).
Użytkownik „dave” łączy się tylko na kilka sekund, a następnie rozłącza. Widzisz trzy wpisy closeSSH. Są one rejestrowane, gdy każdy port jest kierowany przez narzędzie zdalnego knock – informuje host pukanego portu, 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.