Jak používat klepání portů na Linuxu (a proč byste neměli)

Brány firewall běžně chrání servery tím, že uzavírají síťové porty, a to i ty, které považujete za potřebné pro provoz. Klepání portů je mechanismus, který umožňuje dynamické otevírání těchto portů. Port se otevře jen tehdy, pokud příchozí pokus o spojení zahrnuje specifickou, tajnou sekvenci klepání.

Klepání portů jako tajný signál

Představte si situaci, kdy v době prohibice bylo nutné znát tajné zaklepání, abyste se mohli dostat do ilegálního baru. Klepání portů funguje na podobném principu. Pokud chcete umožnit přístup ke službám na vašem serveru, ale nechcete mít trvale otevřené porty na bráně firewall, je klepání portů ideální řešení. Porty zůstávají zavřené, ale pokud příchozí požadavek o připojení zahrnuje správnou sekvenci, port se dočasně otevře. Tato sekvence funguje jako tajné klepání. Stejně tak může jiná sekvence port opět uzavřít.

Přestože je klepání portů zajímavým konceptem, je nutné si uvědomit, že spadá do kategorie „zabezpečení skrze neprůhlednost“, což je z principu nespolehlivá metoda. Zabezpečení založené na tajnosti funguje pouze do doby, než je tajemství odhaleno. Jakmile se tak stane, zabezpečení přestane fungovat. Je proto mnohem lepší použít silnější metody, například ověřování pomocí klíčů pro SSH přístup.

Nejlepší strategie kybernetické bezpečnosti jsou vícevrstvé, a klepání portů může tvořit jednu z těchto vrstev. I když je více vrstev obecně lepší, je diskutabilní, zda klepání portů výrazně přispívá k bezpečnosti již dostatečně zabezpečeného systému.

Kybernetická bezpečnost je obsáhlé a složité téma. Nicméně, klepání portů by nemělo být vaší jedinou linií obrany.

Instalace potřebného softwaru

Pro demonstraci klepání portů budeme ovládat port 22, který se používá pro SSH. K tomu použijeme nástroj knockd. Pro Ubuntu a další distribuce založené na Debianu jej nainstalujete pomocí příkazu apt-get. Pokud používáte jinou distribuci Linuxu, použijte příslušný nástroj pro správu balíčků.

sudo apt-get install knockd

Většina systémů již má nainstalovaný firewall iptables. Nicméně, možná budete potřebovat nainstalovat balíček iptables-persistent, který zajistí automatické načítání uložených pravidel.

sudo apt-get install iptables-persistent

Po zobrazení konfigurační obrazovky IPV4, stiskněte mezerník pro výběr „Ano“.

Stejně tak potvrďte možnost „Ano“ na obrazovce konfigurace IPv6 stisknutím mezerníku.

Následující příkaz říká iptables, aby umožnil pokračování navázaných a probíhajících spojení. Následně uzavřeme port SSH.

Důležité je, že pokud je někdo připojený přes SSH v momentě, kdy zadáváme tento příkaz, nechceme jeho spojení přerušit:

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

Tento příkaz přidá do brány firewall pravidlo, které definuje:

-A: Přidání pravidla na konec seznamu pravidel brány firewall.
INPUT: Pravidlo se týká příchozích spojení.
-m conntrack: Iptables použije modul conntrack pro zpracování síťových připojení.
–ctstate ESTABLISHED,RELATED: Platí pro navázaná a související spojení. Navázaná spojení jsou již existující. Související spojení jsou vytvořená na základě navázaných spojení.
-j ACCEPT: Pokud provoz odpovídá pravidlu, je přijat a povolen přes bránu firewall.

Nyní můžeme port uzavřít:

sudo iptables -A INPUT -p tcp --dport 22 -j REJECT

Tento příkaz říká:

-A: Přidat pravidlo do tabulky pravidel brány firewall, a to na konec.
INPUT: Toto pravidlo se týká příchozích spojení.
-p tcp: Platí pro provoz využívající TCP.
–dport 22: Platí pro TCP provoz na portu 22 (SSH).
-j REJECT: Pokud provoz odpovídá pravidlu, je odmítnut a nepovolí se přes bránu firewall.

Spusťte démona netfilter-persistent:

sudo systemctl start netfilter-persistent

Chceme, aby netfilter-persistent prošel cyklem ukládání a opětovného načítání, aby se načetla a spravovala pravidla iptables.

Zadejte tyto příkazy:

sudo netfilter-persistent save

sudo netfilter-persistent reload

Nyní jsou nástroje nainstalovány a port SSH je uzavřen. Nyní je čas nakonfigurovat tajné klepání.

Konfigurace knockd

Pro konfiguraci knockd upravíte dva soubory. První je konfigurační soubor knockd:

sudo gedit /etc/knockd.conf

Otevře se editor gedit s konfiguračním souborem knockd.

Tento soubor upravíme dle potřeby. Důležité jsou sekce „openSSH“ a „closeSSH“. Každá z nich obsahuje následující čtyři položky:

sequence: Pořadí portů, na které je nutné odeslat požadavek pro otevření nebo uzavření portu 22. Výchozí porty jsou 7000, 8000 a 9000 pro otevření a 9000, 8000 a 7000 pro uzavření. Můžete je změnit nebo přidat další. Pro naše účely zůstaneme u výchozích hodnot.
seq_timeout: Časové okno, v rámci kterého je nutné odeslat požadavky na porty, aby došlo k otevření nebo uzavření portu.
command: Příkaz odeslaný do brány firewall iptables, když dojde k otevření nebo uzavření portu. Příkazy buď přidají pravidlo do firewallu (pro otevření), nebo ho odstraní (pro uzavření).
tcpflags: Typ paketu, který musí každý port přijmout v tajné sekvenci. Paket SYN (synchronizace) je prvním paketem v TCP požadavku na spojení, tzv. třístranné podání ruky.

Sekci „openSSH“ lze číst jako „na porty 7000, 8000 a 9000 je nutné v tomto pořadí a do 5 sekund odeslat požadavek na TCP spojení, aby byl do brány firewall odeslán příkaz pro otevření portu 22“.

Sekci „closeSSH“ lze číst jako „na porty 9000, 8000 a 7000 je nutné v tomto pořadí a do 5 sekund odeslat požadavek na TCP spojení, aby byl do brány firewall odeslán příkaz pro uzavření portu 22“.

Pravidla brány firewall

Položky „command“ v sekcích openSSH a closeSSH zůstávají stejné, kromě jednoho parametru. Jsou složeny takto:

-A: Přidej pravidlo na konec seznamu pravidel brány firewall (pro příkaz openSSH).
-D: Odstranit pravidlo ze seznamu pravidel brány firewall (pro příkaz closeSSH).
INPUT: Toto pravidlo se týká příchozího síťového provozu.
-s %IP%: IP adresa zařízení, které odesílá požadavek na připojení.
-p: Síťový protokol; v tomto případě TCP.
–dport: Cílový port; v našem příkladu je to port 22.
-j ACCEPT: Přeskoč na cíl přijetí v bráně firewall. Jinými slovy, propusť paket, aniž bys na něj reagoval.

Úpravy konfiguračního souboru

Změny, které provedeme v souboru, jsou zvýrazněny červeně:

Zvýšíme hodnotu „seq_timeout“ na 15 sekund. To je štědrá hodnota, ale pokud někdo manuálně odesílá požadavky na připojení, může potřebovat více času.

V sekci „openSSH“ změníme volbu -A (append) v příkazu na -I (insert). Tento příkaz vloží nové pravidlo brány firewall na začátek seznamu. Pokud necháte volbu -A, pravidlo se připojí na konec seznamu.

Příchozí provoz se testuje podle pravidel brány firewall od shora dolů. Již máme pravidlo, které uzavírá port 22. Pokud je tedy příchozí provoz otestován dle tohoto pravidla dříve, než uvidí pravidlo, které provoz povoluje, spojení se odmítne. Pokud ale vidí jako první nové pravidlo, spojení se povolí.

Příkaz close odstraní pravidlo přidané příkazem openSSH z pravidel brány firewall. Provoz SSH se opět řídí pravidlem „port 22 je uzavřen“.

Po dokončení těchto úprav uložte konfigurační soubor.

Úpravy konfiguračního souboru knockd

Konfigurační soubor knockd je jednodušší. Než jej začneme upravovat, musíme znát interní název našeho síťového připojení. Zjistíme ho pomocí tohoto příkazu:

ip addr

Připojení, které tento počítač používá pro účely tohoto článku, se nazývá enp0s3. Poznamenejte si název svého připojení.

Následující příkaz upraví konfigurační soubor knockd:

sudo gedit /etc/default/knockd

Zde je soubor knockd v geditu.

Několik úprav, které musíme provést, je zvýrazněno červeně:

Změnili jsme položku „START_KNOCKD=“ z 0 na 1.

Také jsme odstranili hash # ze začátku položky „KNOCKD_OPTS=“ a nahradili jsme „eth1“ názvem našeho síťového připojení, enp0s3. Pokud je vaše síťové připojení eth1, samozřejmě nic neměňte.

Test funkčnosti

Je čas zjistit, jestli vše funguje. Spustíme démona knockd pomocí tohoto příkazu:

sudo systemctrl start knockd

Nyní přejdeme na jiný počítač a zkusíme se připojit. Nainstalovali jsme na tento počítač knockd, protože balíček knockd poskytuje nástroj s názvem knock. Budeme tento počítač používat k odesílání naší tajné sekvence.

Pomocí následujícího příkazu odešlete tajnou sekvenci požadavků na připojení na porty hostitelského počítače s IP adresou 192.168.4.24:

knock 192.168.4.24 7000 8000 9000 -d 500

Tento příkaz říká, že knock zacílí počítač s IP adresou 192.168.4.24 a odešle požadavky na připojení k portům 7000, 8000 a 9000, s -d (zpožděním) 500 milisekund mezi nimi.

Uživatel s názvem „dave“ pak odešle požadavek SSH na 192.168.4.24:

ssh dave@192.168.4.24

Jeho připojení je přijato, zadá heslo a začne vzdálená relace. Jeho příkazový řádek se změní z dave@pc na dave@192.168.4.24. Pro odhlášení ze vzdáleného počítače napíše:

exit

Jeho příkazový řádek se vrátí na místní počítač. Znovu použije knock a tentokrát se zaměří na porty v opačném pořadí, aby uzavřel SSH port na vzdáleném počítači.

knock 192.168.4.24 9000 8000 7000 -d 500

Je pravda, že to nebyla nijak zvlášť dlouhá vzdálená relace, ale ukazuje otevírání a zavírání portu pomocí klepání portu a vejde se na jeden snímek obrazovky.

Jak to vypadalo z druhé strany? Správce systému na hostiteli s klepáním portů použije následující příkaz pro zobrazení nových položek v systémovém protokolu:

tail -f /var/log/syslog

Vidíte tři položky openSSH. Zobrazí se vždy, když je zacílen port obslužným programem pro vzdálené klepání.
Když jsou splněny všechny tři fáze spouštěcí sekvence, zobrazí se záznam „SEZAME, OTEVŘI SE
Odešle se příkaz pro vložení pravidla do seznamu pravidel iptables. Umožní přístup přes SSH na portu 22 ze specifické IP adresy počítače, který odeslal správné tajné zaklepání (192.168.4.23).
Uživatel „dave“ se připojí na několik sekund a poté se odpojí.
Zobrazí se tři položky closeSSH. Jsou vyvolány, když obslužný program pro vzdálené klepání zacílí na jednotlivé porty. Říkají hostiteli s klepáním portů, že má zavřít port 22.
Po spuštění všech tří fází se opět zobrazí zpráva „OPEN SESAME“. Do brány firewall se odešle příkaz pro odstranění pravidla. (Proč se při zavírání portu nevypisuje „ZAVŘÍT SEZAME“? Kdo ví?)

Nyní je v seznamu pravidel iptables jediné pravidlo týkající se portu 22, a to to, které jsme zadali na začátku pro uzavření portu. Takže port 22 je opět uzavřen.

Závěrem

Klepání portů je zajímavý trik, nicméně, neměli byste jej používat jako jedinou formu zabezpečení, a to zejména v reálném provozu. Berte jej spíše jako zajímavost.