Port knocking: zaklepejte na svůj server

Petr Krčmář 11. 9. 2009

Internetových útoků přibývá a nechávat některé služby na serveru veřejně by nemusel být dobrý nápad. Jak ale ukrýt některé porty před zraky kolemjdoucích zvědavců a robotů zkoušejících své finty? Šikovnou, ale ne všem známou technikou je takzvaný port knocking. Nainstalujte si také svého dveřníka.

Minulý týden jsem psal o tom, jak vyhodit útočníky, kteří se snaží automaticky hádat hesla. Použít k tomu můžeme například DenyHosts, který umí hlídat přihlášení a podezřelé pokusy umí automaticky zablokovat. Dokáže zabránit mnoha nepříjemnostem.

Přesto nedokáže takový postup zabránit všem druhům útoků. Pokud se například objeví problém už v samotné implementaci, může útočník napáchat škodu a hesla hádat vůbec nemusí.

Pokud jste administrátorem serveru, můžete jít ale ještě dál a to nejen u SSH. Můžete před nenechavci skrýt vše, co nechcete, aby viděli. Náhodný kolemjdoucí, který oskenuje vaše porty, uvidí jen ty, které mu chcete ukázat a ostatní jsou pro něj zavřené. Přesto se vy jako administrátor k nim můžete kdykoliv připojit. Technika, o které si tu budeme povídat, se jmenuje port knocking (klepání na porty).

Dveřník na tajné heslo

Samozřejmě je možné kritický port ukrýt za firewall a striktně omezit IP adresy, ze kterých je možné se k němu připojit. To ovšem znamená další komplikace, především v případě, že se vaše IP adresa mění nebo potřebujete cestovat. Port knocking řeší tento problém velmi elegantně.

Pomocí firewallu zakážete porty úplně. Pro běžného návštěvníka budou zcela zavřené a vůbec nepozná, že na serveru běží nějaká konkrétní služba. Nainstalujeme si speciální port knocking server, který bude sledovat pokusy o přístup k zavřeným portům. Naprogramujeme mu konkrétní sekvenci, která identifikuje regulérního uživatele.

Taková sekvence může být například: „připoj se na porty 1000, 1256, 865, 22565 během pěti sekund“. Pokud se taková sekvence objeví, firewall automaticky otevře port IP adrese, ze které přišlo zaklepání.

Z hlediska uživatele je vše poměrně jednoduché. Před samotným spuštěním (třeba SSH) klienta spustí skript, který zaťuká na příslušné porty serveru. Pak se mu otevře příslušný port a on se připojí běžným způsobem.

Je to bezpečné? Co odposlech?

Port knocking samozřejmě není náhradou za běžné bezpečnostní mechanismy, ale je jejich účinným doplňkem. Kdyby někdo odhalil vaši klepací sekvenci (tedy pořadí portů), nemělo by to nijak vadit a bezpečnost to neohrozí. Útočník pak stojí před klasickým bezpečnostním mechanismem – RSA nebo heslem.

Je ale jasné, že knocking je možné odhalit pomocí odposlechu spojení. Někdo na trase může o vašem serveru vědět a sledovat, na které porty se dobýváte předtím, než se připojíte k SSH. I proti tomuto postupu ale existuje účinná obrana v podobě šifrovaného port knockingu.

Přestože nemůžete se serverem komunikovat (on zásadně na zavřených portech neodpovídá), můžete mu pomocí ťukání na různé porty předávat jednosměrně nějakou informaci. Obvykle se to provádí tak, že v prostoru portů (0–65535) zvolíte blok 256 z nich, které tvoří hodnoty předávaných bajtů. Takto jste schopni serveru předat libovolná data.

Obvykle jako klient použijete předem daná data jako vlastní IP adresu, port na druhé straně, aktuální čas a datum a podobně a tyto údaje zašifrujete předem daným klíčem. Zašifrovaný výsledek pak vyťukáte serveru na zavřené porty. Druhá strana celý algoritmus včetně dešifrovacího klíče zná, a tak vás opět rozpozná a otevře vám. Se změnou časové značky a dalších údajů v zašifrované zprávě se mění i zadávaná sekvence, kterou není možné později znovu využít.

Jak to implementovat?

Základem je takzvaný knockd server, který nainstalujete na stroj, na kterém si přejete chránit konkrétní porty. Software najdete pravděpodobně ve své distribuci, v Debianu je a má jen několik desítek kilobajtů. Tento program zajistí vše potřebné na straně serveru.

Celá konfigurace se nachází v souboru /etc/knockd.conf. Syntaxe je velmi jednoduchá:

[options]
    logfile = /var/log/knockd.log

 [SSH]
    sequence    = 7000,8000,9000
    seq_timeout = 5
    command     = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags    = syn
    cmd_timeout   = 10
    stop_command  = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT

Na začátku je definován log soubor, do kterého knockd zapisuje informace o své činnosti. Poté následuje definice pravidel pro SSH port. Samozřejmě je možno definovat libovolný počet sekvencí nebo jednou sekvencí otevřít více portů.

Na prvním řádku je otevírací sekvence (čísla portů), následuje časový interval ve kterém musí být zaťukání provedeno. Poté následuje příkaz pro otevření příslušného portu v iptables, za ním je časový údaj, po kterém se provede zavírací příkaz. Poslední část je samozřejmě možné vynechat, port pak zůstane pro IP adresu otevřený navždy.

Pokud jsou porty určeny takto, jedná se o TCP porty, můžete ale využít také UDP, stačí za čísla portů přidat :udp. Příklad:  1000:udp,2000:udp,3000:udp.

Jednorázové sekvence

Démon knockd umí také jednorázové sekvence. Do zvláštního souboru zadáte libovolný počet sekvencí, které budou postupně očekávány shora dolů. Po každém úspěšném zaťukání se aktuální sekvence zahodí a v budoucnu zůstane neplatná.

Implementace je opět velmi jednoduchá, místo direktivy sequence s konkrétními porty zadáte:

one_time_sequences = /etc/knockd/smtp_sequences

s názvem souboru, ze kterého budou sekvence načítány.

Jak zaklepat?

Server máme nastavený, ale ještě jsme si neřekli, jak na něj můžeme zaklepat. K tomu slouží utilitka knock, která je součástí balíčku knockd. Její použití je velmi jednoduché, na náš server zaťukáme:

widgety

$ knock 192.168.1.1 7000 8000 9000

případně

$ knock 192.168.1.1 7000:udp 8000:udp 9000:udp

Co dál?

Pokud se chcete dozvědět o knockingu více, navštivte server PortKnocking.org. K dispozici je samozřejmě mnoho implementací celé techniky, včetně výše zmíněného šifrovaného ťukání. Informace o dalších implementací najdete na speciální stránce stejného webu.

Ohodnoťte jako ve škole:

Průměrná známka 2,76

Našli jste v článku chybu?
Zasílat nově přidané názory e-mailem
Lupa.cz: Roaming se mění. Co byste o něm měli vědět?

Roaming se mění. Co byste o něm měli vědět?

Podnikatel.cz: Marodí méně, ale když už, tak skoro 40 dnů

Marodí méně, ale když už, tak skoro 40 dnů

Podnikatel.cz: Platba hotově? U paušálu musíte vést evidenci

Platba hotově? U paušálu musíte vést evidenci

120na80.cz: 10 nejžádanějších bylinných čajů

10 nejžádanějších bylinných čajů

Vitalia.cz: SZPI uzavřela Lidl. Takhle to tam vypadalo

SZPI uzavřela Lidl. Takhle to tam vypadalo

Lupa.cz: Jaký bude Motejlek.com bez Miroslava Motejlka?

Jaký bude Motejlek.com bez Miroslava Motejlka?

DigiZone.cz: Přechod na DVB-T2 nabírá zpoždění

Přechod na DVB-T2 nabírá zpoždění

120na80.cz: Pánové, odřené bradavky při běhu nejsou nutné

Pánové, odřené bradavky při běhu nejsou nutné

Měšec.cz: Banky umí platby na kartu, jen to neříkají

Banky umí platby na kartu, jen to neříkají

Podnikatel.cz: Cizinci v českém eshopu nechají miliardy

Cizinci v českém eshopu nechají miliardy

Vitalia.cz: Očkování a autismus ve světle vědeckého objevu

Očkování a autismus ve světle vědeckého objevu

Lupa.cz: Pokus o český PayPal nevyšel. PaySec končí

Pokus o český PayPal nevyšel. PaySec končí

Lupa.cz: Další útok: po webu ČSSD je pod palbou i ČTK

Další útok: po webu ČSSD je pod palbou i ČTK

Podnikatel.cz: Kašlali na předpisy, byznys jim zavřeli

Kašlali na předpisy, byznys jim zavřeli

Vitalia.cz: Pomóc! Obyčejný knoflík je dohání k šílenství

Pomóc! Obyčejný knoflík je dohání k šílenství

Podnikatel.cz: Když si reklamou "zabíjíte" zákazníky

Když si reklamou "zabíjíte" zákazníky

Podnikatel.cz: Obavy z EET? Nejvíc se bojí, aby na to měli

Obavy z EET? Nejvíc se bojí, aby na to měli

Podnikatel.cz: Google PageRank nadobro zmizel

Google PageRank nadobro zmizel

Vitalia.cz: Nový festival Street Food Rocks: jídlo i hudba!

Nový festival Street Food Rocks: jídlo i hudba!

Vitalia.cz: Galerie: Kulajda – jak na to

Galerie: Kulajda – jak na to

Ušetřete