Pam abl & iptables

Aus Fedorawiki.de

Wechseln zu: Navigation, Suche
Dieser Artikel ist Teil der HOWTO Sammlung

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 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).


Anmerkung Anmerkung: Sonst ist es möglich, dass ein System durch eine vorhergehende Regel akzeptiert wird. In unserer Sicherheitsprüfung wollen wir als erstes wissen, ob das System bereits versucht hat in unser System einzubrechen und falls dies der Fall ist, dieses System einfach ignorieren.


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 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).


Anmerkung Anmerkung: Es kann eine Liste von sicheren Systemen angegeben werden (durch Variable 'okhosts', z.b. das Lokale Netzwerk). Diese werden anschliessend nicht in die iptables-Tabelle aufgenommen. Diese Variable darf nie auf '*' gesetzt werden, da sonst alle Systeme vor dem einfügen in die crackerlist entfernt werden (als 'ok' betrachtet).

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 


Anmerkung Anmerkung: Damit das Skript korrekt arbeitet, muss es mit den Benutzerrechten von root ausgeführt werden. D.h. es sollte entweder in die Benutzercrontab von root oder in die Systemcrontab (/etc/crontab) eingetragen werden.

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)