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