SSH ochrana před roboty
Aby se ve scriptu dalo dobře číst, tak jsem jej ještě trošku upravil. Stačí, když všechny bloky vložíte do jednoho skriptu a necháte jej provádět pomocí cronu třeba každých 15 minut. Taky jsem právě upravil takovou malou drobnost, aby script poslal e-mail, jen když blokuje nějakou IP adresu.
Ještě pro ty stroje, které používají Shorewall a nebo při každém restartu serveru načíst blokované IP ze souboru block_ip.
Aktuální verzi skriptu naleznete na: Ochrana ssh
Co se musí ještě vylepšit
Dneska jsem zjistil, že skript není až tak dobrý, jak se zdálo. Selhala funkce uniq, který má vyfiltrovat duplicitní položky. Zdá se, že uniq funguje pouze tehdy, když jsou ty IP adresy za sebou. Dneska na mé servery útočily 2 roboti zároveň a tím pádem se po vykonání skriptu přidalo do firewallu asi 20 pravidel (stejných). Dále musí skript ještě testovat, zda adresáře a soubory existují a když ne, tak je musí vytvořit. Tyto problémy jsou snad již vyřešeny. Zatím to testuji na 3 strojích, takže budu postupně přidávat zkušenosti.
Upraven název souboru, který mi zálohuje auth.log pro každý den. Vždy naleznete auth.log pro konkrétní datum zde (pro 8. 5. 2008):
/var/log/auth/auth_080511.log
Skript
#!/bin/bash DIR="var/log" DAY=`date +%y%m%d` FILE="auth_$DAY.log" EMAIL="info@lepsiweb.cz" MAXLOG=10
# testovani na zacatek if [ ! -e /$DIR/auth ] ; then mkdir /$DIR/auth fi if [ -e /$DIR/auth/tmp ] ; then touch /$DIR/auth/tmp fi
# unikatni IP ze souboru + pridani do block_ip (jen pokud jsou nove zaznamy) if [ -s /$DIR/auth.log ] ; then grep "Invalid user" /$DIR/auth.log |awk '{print $10}' |uniq > /$DIR/auth/tmp; cat /$DIR/auth.log >> /$DIR/auth/$FILE rm -f /$DIR/auth.log touch /$DIR/auth.log cat /$DIR/auth/tmp >> /$DIR/auth/block_ip # blokovani nalezenych IP SIZE=`wc -l /$DIR/auth/tmp |awk '{print $1}'`; SIZE=`expr $SIZE + 1`; I=1 ATTACK=0 while test $I -lt $SIZE do IP=`sed -n "$I"p /$DIR/auth/tmp`; I=`expr $I + 1`; POCET=`cat /$DIR/auth/$FILE |grep $IP |wc -l |awk '{print $1}'`; if [ $POCET -gt $MAXLOG ] ; then iptables -A INPUT -s $IP -j DROP ATTACK=1 fi done #mail if [ $ATTACK -eq 1 ] ; then cat /$DIR/auth/tmp |mail -s "Blokovane IP" $EMAIL fi rm - /$DIR/auth/tmp fi
Znovu zavedení pravidel do firewallu
Pokud tento skript již máte spuštěny, je dobré pamatovat na to, aby po restartu systému nějaký skriptík prošel block_ip a přidal pravidla do firewallu. Tady je ten skriptík:
# blokovani nalezenych IP BLOCK="/var/log/auth/block_ip" SIZE=`wc -l $BLOCK |awk '{print $1}'`; SIZE=`expr $SIZE + 1`; I=1 while test $I -lt $SIZE do IP=`sed -n "$I"p $BLOCK`; I=`expr $I + 1`; iptables -A INPUT -s $IP -j DROP done
Pokud používáte shorewall, je nejsnažší vložit tento kod do souboru start. Protože shorewall při každém (re)startu smaže všechny pravidla v iptables, tak si s tím zajistíte znovu nahrání pravidel. Jinak si samozřejmě můžete přidat kod do libovolného souboru a pokus chcete aby se Vám spustil při startu, je nejsnažší přidat do crontabu řádek
@reboot root sh cesta/ke/skriptu.sh
Jak zabezečit ssh
- povolit přihlášení pouze s certifikátem
- v sshd.conf nastavit uživatele, kteří se mohou přihlašovat pomocí ssh (předejdeme tomu, že by nějaký daemon (uživatel) měl povoleno připojení přes ssh)
- používat tento super skript