Bruteforce auf ssh verhindern

Admin

=Was ist pam_shield?=

Pam_shield ist ein PAM Modul, welches lo-Routing oder iptables Rules verwendet, um SSH-Attacken zu blockieren. Es unterscheidet, im Gegensatz zu iptables als direkten Bruteforce Schutz, zwischen erfolgreichem und nicht erfolgreichem login.

=woher?=

http://www.ka.sara.nl/home/walter/pam_shield/

oder für SUSE aus dem Buildservice:

http://software.opensuse.org/search/

=Funktionsweise=

Pam_shield erkennt nicht-erfolgreiche Login-Versuche und dokumentiert diese in einer gdbm Datenbank (default: /var/lib/pam_shield/db). Wenn die konfigurierte Anzahl Versuche von einer IP Adresse innerhalb der konfigurierten Zeiteinheit erreicht ist, wird der Blockskript aufgerufen (default: /usr/sbin/shield-trigger.sh für lo-Routing). Ich empfehle aber iptables zu benutzen. Per cron wird ein Skript periodisch aufgerufen der überprüft, ob IP-Adressen wieder frei gegeben werden sollen.

=Skripte und Config-Dateien=

/etc/security/shield.conf           Konfigurationsdatei /usr/sbin/shield-trigger.sh         Skript zum Blockieren per lo /usr/sbin/shield-trigger-iptables.sh Skript zum Blockieren per iptables (siehe unten) /etc/cron.daily/pam-shield          cron Skript

=/etc/security/shield.conf=

debug on block all-users allow_missing_dns yes allow_missing_reverse yes allow localhost allow 134.76.0.0/16 allow 10.0.0.0/8 db /var/lib/pam_shield/db trigger_cmd /usr/sbin/shield-trigger-iptables.sh max_conns 3 interval 1m retention 1m

So werden 3 Fehlversuche innerhalb 1 Minute geblockt und nach einer Minute wieder frei gegeben.

Dazu muss natürlich der Cron-Skript auch minütlich aufgerufen werden:

rm /etc/cron.daily/pam-shield echo "-*/1 * * * *   root    /usr/sbin/shield-purge -c /etc/security/shield.conf > /dev/null 2>&1" >> /etc/crontab

Ebenso soll iptables benutzt werden. Der Autor empfiehlt lo-Routing. Das ist aber auch kein Wunder, denn der mitgelieferte Skript ist so nicht wirklich brauchbar. Meiner sieht so aus (USERID@gwdg.de gegen eigene Email-Adresse ändern!):

=/usr/sbin/shield-trigger-iptables.sh=

run_iptables { IPT=`echo "$2" | sed 's/[0-9\.]//g'` if [ -z "$IPT" ] then IPT=iptables else IPT=ip6tables fi       "$IPT" "$1" INPUT -p tcp -s "$2" --destination-port 22 -j DROP
 * 1) ! /bin/sh

if [ "$1" = "-I" ]; then mail -s "[security] pam_shield blocked $2" USERID@gwdg.de <" echo echo "shield-trigger.sh is normally called by the pam_shield PAM module" exit 1 } PATH=/sbin:/usr/sbin:/bin:/usr/bin

if [ -z "$2" ] then usage fi

case "$1" in       add)                logger -i -t shield-trigger -p auth.info "blocking $2"

CMD="-I" IP=$2 ;;

del)               logger -i -t shield-trigger -p auth.info "unblocking $2"

CMD="-D" IP=$2 ;;

*)               usage                ;; esac

run_iptables "$CMD" "$IP"

=aktivieren!=

echo "auth   optional        pam_shield.so" >> /etc/pam.d/sshd