Pam abl & iptables
Aus Fedorawiki.de
Inhaltsverzeichnis |
Einleitung
Dieses Howto beschreibt, wie man automatisierte Login-Versuche und vergleichbare Angriffe auf ein System abwehren kann mit Hilfe von pam_abl und iptables.
Das Original dieses HowTo's wurde durch den Autor des Originals LiRo hierhin kopiert.
Prinzip
pam_abl erkennt Angriffe auf ein System und erstellt eine Liste der angreifenden Systeme (und angegriffenen Accounts). Alle in diese Liste eingetragenen Systeme können sich danach auf keinem Fall mehr einloggen.
In diesem Howto wird eben dieser Schutz noch um eine Kombination mit iptables erweitert. Bei der Kombination mit iptables wird einem Angreifer der gesamte Zugriff auf den Rechner gesperrt - damit werden auch andere, nicht durch pam_abl geschützte Dienste gesichert und auch eine sonstige Belastung des Systems durch ständige Anfragen vermieden.
Durch die in diesem Artikel vorgenommene Konfiguration werden also Systeme, die von pam_abl als auffällig markiert werden, automatisch durch iptables gefiltert.
Installation der Software
Wie gewohnt einfach in Feodra Core Linux wird die Installation der Software mit yum vollzogen:
yum install pam_abl
Nach der Installation liegt im Verzeichnis /lib/security ein PAM-Modul namens pam_abl.so. Dieses ist das eigentliche PAM-Modul, welches wir wie im nächsten Abschnitt erläutert aktivieren. Nebst dem PAM-Modul wird eine Konfigurationsdatei (zum festlegen der Regeln, wann und wie lange Systeme blockiert werden) und ein Kommandozeilenprogramm zur Abfrage mitgeliefert.
Centos
Wer Centos benutzt wird schnell erfahren, das pam_abl nicht in der Standard Base enthalten ist. So mit muss man sich pam_abl dag.wieers besorgen. DagWieers Repo
Aktivieren des Moduls
Wie in der Datei /usr/share/doc/pam_abl-*/README.fedora beschrieben aktivieren wir das Modul, indem wir die bestehende system-auth pam-rules erweitern (es ist ratsam, zuerst eine Backup-Kopie zu erstellen!). Hierbei gibt es zu beachten, dass es ratsam ist die neue pam_abl-Rule vor einer sufficient-Rule einzufügen. Ansonsten ist es möglich, dass die Rule nicht abgearbeitet wird.
| |
Anmerkung: Damit nicht versehentlich die neu eingefügte Rule ingoriert wird, sollte sie vor einer sufficient-Rule in die PAM-Konfiguration integriert werden! |
Konfiguration des Moduls
Wie bereits oben erwähnt, wird pam_abl die Systeme nach gewissen Regeln blockieren. Diese sind in der Konfigurationsdatei /etc/security/pam_abl.conf eingetragen. Nebst dem blockieren von Systemen beherrscht pam_abl auch das Blockieren von lokalen Benutzern, was für die hier gewünschte Funktion jedoch nicht relevant ist.
# /etc/security/pam_abl.conf host_db=/var/lib/abl/hosts.db host_purge=5d host_rule=*:5/1h,20/1d
Mit dieser Konfiguration werden alle Systeme blockiert (host_rule=*:...), welche innerhalb einer Stunde 5 falsche benutzer/passwort Kombinationen eingeben (5/1h) oder 20 innerhalb eines Tages (20/1d). Anschliessend wird das enstprechende System für 5 Tage (host_purge=5d) in der Datenbank belassen.
Weitere Informationen zur Konfiguration von pam_abl findet man in der Offiziellen Dokumentation.
pam_abl-Tool
Nebst dem PAM-Modul wird mit der Installation von pam_abl auch ein Tool zur manuellen Bearbeitung der Datenbank mitgeliefert. Da wir als 'cracker' identfizierte Systeme nicht permanent blockieren möchten (wir blockieren IP-Addressen, diese wurden in den meisten fällen von einem Provider temporär zugewiesen), säubern wir vor dem Einfügen in die iptables-Rules die Datenbank mittels:
pam_abl -p
Damit werden Systeme, welche länger in der Datenbank existieren als definiert, gelöscht.
Vorbereitung von iptables
Falls unser System bereits eine iptables-Firewall installiert hat (Kontrolle mit iptables -L oder iptables-save), muss dort eine iptables-chain (das ist eine Kette) erstellt und eine Regel zuoberst eingefügt werden:
iptables -t filter --new crackers iptables -A INPUT -j crackers
Damit wird zuerst eine Kette (zu vergleichen wie eine Gruppe von Regeln) angelegt (iptables -t filter --new crackers). Anschliessend sollte sichergestellt werden, dass zuoberst ein Verweis auf diese Kette eingefügt wird (am besten anstelle von Option '-A' (add) die Option '-I' (insert) verwenden, dadurch wird die Regel zuoberst eingefügt).
Systeme automatisch ignorieren
Damit die Kette, welche wir in den Vorbereitungen erstellt haben, automatisch mit den durch pam_abl identifizerten Systemen aktualisiert wird nutzen wir das folgende Skript:
#!/bin/bash # # author: LiRo, http://www.liro.ch # script: update_firewall.sh - updates crackers reported by pam_abl # (http://www.hexten.net/pam_abl/) in the firwall # initalitaion # # define variables chain_name=crackers iptables=/sbin/iptables # name of hosts not to be ignored. if you doesn't need this, # set to 'none'. never set to '*'! okhosts='*.liro.local 192.168.1.*' # check access to iptables if [ ! -x $iptables ]; then echo "cannot execute iptables!" echo "please correct iptables-variable in $0" exit fi # check access to read-db-script if [ ! -x $read_dbscript ]; then echo "cannot execute read-db-script!" echo "please correct read_dbscript-variable in $0" exit fi # check if defined chain exist in current iptable-rules if [ -z "`$iptables -n -L | grep -i "chain $chain_name"`" ]; then echo "chain '$chain_name' is not defined in your iptable rules!" echo "cannot add a rule into a non-existing chain. please update your iptables-config." exit fi # checks ok, go on... # # purge old hosts from pam_abl and delete any of local subnet /usr/sbin/pam_abl -p for i in $okhosts; do /usr/sbin/pam_abl --okhost=$i done # flush crackers chain $iptables -t filter -F $chain_name # reload chain with actual crackers for i in `/usr/sbin/pam_abl | grep -v hosts: | grep -v ocking | awk '{print $1}'`; do $iptables -t filter -A $chain_name -s $i -j DROP done
| |
Anmerkung: Hier sollte zumindest der Name der Kette überprüft werden. Dieser muss mit der oben erstellen Kette übereinstimmen. |
Dieses Skript säubert die pam_abl-Datenbank und die iptables-Kette, anschliessend werden anhand der von pam_abl-generierten Liste alle Systeme in die Kette eingefügt. Jegliche Anfragen von einem System in dieser Kette werden vom Kernel schlicht ignoriert (paket dropping).
Skript automatisch ausführen
Damit das Skript nun periodisch die durch pam_abl identifizierten Systeme in die 'cracker'-Listt aufnimmt, muss das oben dargestellte Skript in gewünschten Intervallen ausgeführt werden. Dies geschieht via crontab (entweder crontab von root oder systemcrontab). Wird das Skript in das home-Verzeichnis von root gespeichert, könnte ein crontab-Eintrag folgendermassen aussehen:
# update firewall with pam_abl cracker list */10 * * * * /root/update_firewall.sh
Damit wird das Skript alle 10min ausgeführt, was einem potentiellen Angreiffer (der mit der obigen Konfiguration 5 Fehlversuche getätigt hat) maximal 10 Minuten Zeit "bietet" unser System zu kompromitieren. Anschliessend wird der Angreifer das System nicht einmal mehr per 'Ping' erreichen können.
Liro 12:11, 4. Aug 2006 (CEST)