SSH ochrana před roboty: Porovnání verzí

Z Wiki UnArt Slavičín
Skočit na navigaciSkočit na vyhledávání
Bez shrnutí editace
Bez shrnutí editace
 
(Není zobrazeno 11 mezilehlých verzí od 2 dalších uživatelů.)
Řádek 3: Řádek 3:
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.
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.


Nezapomeňte si vytvořit adresář /var/log/auth, který je potřeba pro běh skriptu.
Aktuální verzi skriptu naleznete na: [http://upload.lepsiweb.cz/script/ http://upload.lepsiweb.cz/script/]


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. Takže zatím počkejte s aplikací na Vaše stroje, skript se bude ještě upravovat.
== 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
  #!/bin/bash
  DIR="var/log"
  DIR="var/log"
  DAY=`date |awk '{print $1}'`
  DAY=`date +%y%m%d`
  FILE="auth_$DAY.log"
  FILE="auth_$DAY.log"
  EMAIL="muj@mail.cz"
  EMAIL="info@lepsiweb.cz"
  POKUS=10
  MAXLOG=10


  # uklid na zacatek
  # testovani na zacatek
  rm -f /$DIR/auth/$FILE
  if [ ! -e /$DIR/auth ] ; then
  touch /$DIR/auth/tmp
        mkdir /$DIR/auth
  fi
if [ -e /$DIR/auth/tmp ] ; then
        touch /$DIR/auth/tmp
fi


  # zaloha auth.log
  # unikatni IP ze souboru + pridani do block_ip (jen pokud jsou nove zaznamy)
cat /$DIR/auth.log >> /$DIR/auth/$FILE
if [ -s /$DIR/auth.log ] ; then
rm -f /$DIR/auth.log
        grep "Invalid user" /$DIR/auth.log |awk '{print $10}' |uniq > /$DIR/auth/tmp;
touch /$DIR/auth.log
        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 -f /$DIR/auth/tmp
fi


# unikatni IP ze souboru + pridani do block_ip
== Znovu zavedení pravidel do firewallu ==
grep "Invalid user" /$DIR/auth/$FILE |awk '{print $10}' |uniq > /$DIR/auth/tmp;
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:
cat /$DIR/auth/tmp >> /$DIR/auth/block_ip


  # blokovani nalezenych IP
  # blokovani nalezenych IP
  SIZE=`wc -l /$DIR/auth/tmp |awk '{print $1}'`;
BLOCK="/var/log/auth/block_ip"
  SIZE=`wc -l $BLOCK |awk '{print $1}'`;
  SIZE=`expr $SIZE + 1`;
  SIZE=`expr $SIZE + 1`;
  I=1
  I=1
  while test $I -lt $SIZE
  while test $I -lt $SIZE
  do
  do
IP=`sed -n "$I"p /$DIR/auth/tmp`;
        IP=`sed -n "$I"p $BLOCK`;
I=`expr $I + 1`;
        I=`expr $I + 1`;
POCET=`cat /$DIR/auth/$FILE |grep $IP |wc -l |awk '{print $1}'`;
        iptables -A INPUT -s $IP -j DROP
if [ $POCET -gt $POKUS ] ; then
                iptables -A INPUT -s $IP -j DROP
                ATTACK=1
        fi
  done
  done


#mail
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
  if [ $ATTACK -eq 1 ] ; then
 
        cat /$DIR/auth/tmp |mail -s "Blokovane IP" $EMAIL
  @reboot        root        sh cesta/ke/skriptu.sh
fi
 
== 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

Aktuální verze z 11. 5. 2008, 10:53

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: http://upload.lepsiweb.cz/script/

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 -f /$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