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