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:

$ 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é příspěvky e-mailem
Měšec.cz: Nové tarify? Výsměch všem šetřílkům

Nové tarify? Výsměch všem šetřílkům

120na80.cz: Obrázky na cigaretách mají odradit od kouření

Obrázky na cigaretách mají odradit od kouření

Podnikatel.cz: Kontrola ze sociálky se nedozvonila, má průšvih

Kontrola ze sociálky se nedozvonila, má průšvih

Podnikatel.cz: Daň z příjmů: online formulář

Daň z příjmů: online formulář

Vitalia.cz: Pozor na potraviny s atropinem

Pozor na potraviny s atropinem

Vitalia.cz: Proč si černý kašel cestu zpátky našel

Proč si černý kašel cestu zpátky našel

Lupa.cz: Oracle končí s Java pluginem v prohlížečích

Oracle končí s Java pluginem v prohlížečích

Vitalia.cz: Manipulace odpůrců GMO

Manipulace odpůrců GMO

Lupa.cz: Stream koupil Červeného trpaslíka a další seriály

Stream koupil Červeného trpaslíka a další seriály

Měšec.cz: Vše o dani z nemovitých věcí

Vše o dani z nemovitých věcí

Lupa.cz: Vlhký sen vnitra se splnil: vznikl státní podnik pro IT

Vlhký sen vnitra se splnil: vznikl státní podnik pro IT

Lupa.cz: Google navádí, jak krást fotky, stěžuje si ČTK

Google navádí, jak krást fotky, stěžuje si ČTK

Podnikatel.cz: Legální fotka za cenu kávy. Na to máte, ne?

Legální fotka za cenu kávy. Na to máte, ne?

Lupa.cz: Jak na wifi zdarma? Praha 11 se spojila s komunitou

Jak na wifi zdarma? Praha 11 se spojila s komunitou

Měšec.cz: Katalogoví šmejdi. Oberou vás o 30 tisíc a legálně.

Katalogoví šmejdi. Oberou vás o 30 tisíc a legálně.

Podnikatel.cz: Babiš chce zrušit daňový bonus na dítě

Babiš chce zrušit daňový bonus na dítě

Měšec.cz: Braňte se zdražování elektřiny. Pošlete úřadu svůj názor

Braňte se zdražování elektřiny. Pošlete úřadu svůj názor

Root.cz: EU chce zrušit anonymní platby

EU chce zrušit anonymní platby

Vitalia.cz: Levnější pivo? Babiš neví, co činí

Levnější pivo? Babiš neví, co činí

Podnikatel.cz: Podal přiznání, má přeplatek. Nevrátí mu ho

Podal přiznání, má přeplatek. Nevrátí mu ho

Ušetřete