Ochrana SSH démona proti útokům (5)

Následující způsob ochrany SSH démona proti útokům je založen na modulu pro iptables, který se nazývá recent. Tento modul jsem již jednou pro ochranu SSH démona použil a to v souvislosti s otevíráním portů na základě zaťukání (port knocking) na příslušné porty (viz 3. díl).

Princip

Pomocí modulu recent můžeme v Linuxovém firewallu snadno vytvořit pravidlo, díky kterému jádro Linuxu povolí limitovaný počet packetů za danou časovou jednotku a další nadlimitní packety bude dočasně zahazovat. Tímto způsobem lze výrazně snížit počet pokusů o přihlášení přes SSH protokol.

Výhodou tohoto řešení je, že není potřeba instalovat další software, vše potřebné (modul recent) je standardní součástí jádra Linuxu. Mezi další výhody patří snadná konfigurace.

Menší nevýhodou tohoto řešení je, že firewall nerozlišuje mezi úspěšnými a neúspěšnými pokusy o přihlášení, pouze sleduje počet packetů jdoucích z dané IP adresy, což může při neopatrnosti vést k tomu, že si sami dočasně zablokujeme přístup k danému SSH serveru v případě, kdy se k tomuto serveru připojíme vícekrát než máme povoleno v pravidle firewallu. Zablokování se bude týkat pouze nových pokusů o připojení, stávající spojení přes SSH protokol zůstane otevřené - nebude firewallem nijak blokováno.

Nastavení

Ve firewallu Linuxu vytvořím pomocí obslužného programu iptables nový řetězec s názvem CHECK_SSH. Do tohoto řetězce budu směrovat všechen provoz jdoucí na port 22 protokolu TCP - viz poslední řádek ve výpisu níže. Pomocí modulu recent se bude vytvářet seznam zdrojových IP adres, který bude mít název SSH. Tento seznam naleznete v souboru /proc/net/ipt_recent/SSH. Následně definováním třetího pravidla povolím pouze jeden packet ve stavu NEW za dvě minuty, takže další packety bude firewall (jádro Linuxu) zahazovat. Pokud nepřijde z dané IP adresy žádný packet do dvou minut od posledního packetu, tak se pravidlo uvolní a další packet jádro zase přijme. Výsledkem této konfigurace je, že útočníkovi povolíme pouze jeden packet ve stavu NEW směřující na port 22 za dvě minuty, tzn. jinak řečeno 3 pokusy o uhodnutí hesla daného uživatele za dvě minuty. Pokud bude útočník používat skript, který se bude snažit o co největší počet pokusů o připojení k SSH serveru, tak se sám bude trvale blokovat, což je pro nás žádoucí.

iptables -N CHECK_SSH
iptables -A CHECK_SSH -m recent --set --name SSH
iptables -A CHECK_SSH -m recent --update --seconds 120 --hitcount 1 --name SSH -j DROP

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j CHECK_SSH

Výše uvedenou konfiguraci lze snadno zapracovat do stávajících pravidel firewallu, takže například pro CentOS by výsledný soubor /etc/sysconfig/iptables mohl vypadat následovně (některé řádky jsou pro větší přehlednost zalomené):

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT 
-A FORWARD -j RH-Firewall-1-INPUT 
-A RH-Firewall-1-INPUT -i lo -j ACCEPT 
-A RH-Firewall-1-INPUT -p icmp -m icmp --icmp-type any -j ACCEPT 
-A RH-Firewall-1-INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent 
    --update --seconds 120 --hitcount 1 --name SSH --rsource -j DROP
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent 
    --set --name SSH --rsource -j ACCEPT 
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited 
COMMIT

Seznam IP adres, který je uložen v souboru /proc/net/ipt_recent/jmeno_seznamu lze snadno upravovat, tzn. lze do něj přidávat IP adresy, odebírat je nebo lze kompletně celý seznam smazat pomocí následujících tří příkazů:

echo 195.59.44.134 > /proc/net/ipt_recent/SSH

echo -10.0.0.1 > /proc/net/ipt_recent/SSH

echo clear > /proc/net/ipt_recent/SSH
Naposledy změněno: 13.12.2008 20:15