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.