Firewalling: iptables und Fail2Ban
fail2ban auf Debian Lenny installieren und konfigurieren
Um Bruteforce Attacken auf ssh oder ftp Servern Paroli zu bieten, empfiehlt sich unter anderem der Einsatz von fail2ban. Über die iptables sperrt fail2ban Quell-IPs, über die versucht wird, ein Passwort zu erraten. Je nach Konfiguration wird die IP nach einer bestimmten Anzahl von Fehlversuchen für eine gewisse Zeit gesperrt.
Ihr installiert fail2ban über
apt-get install fail2ban
Zudem falls noch nicht geschehen das Paket whois:
apt-get install whois
Als nächstes kopiert die Konfigurationsdatei jail.conf nach jail.local
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Danach kann die Datei jail.local editiert und auf die eigenen Bedürfnisse angepasst werden. Per default ist nur der ssh "scharf" geschaltet.
nano /etc/fail2ban/jail.local
Wenn Ihr Euch die Datei anseht, stehen bereits schon entsprechende Sections wie der proftp zur Verfügung. Um eine bestimmte Section zu aktivieren stellt im jeweiligen Bereich das
enabled = false
auf
enabled = true
Die Standart bantime (= die Zeit, die eine IP gesperrt ist) steht auf 600 Sekunden = 10 Minuten. Sollte ein besonderer Dienst länger gesperrt werden, schreibt in die Section
bantime = XYZ
XYZ in Sekunden
Der Wert maxretry gibt an, ab wieviel Fehlversuche gesperrt wird. 5 bis 6 Fehlversuche gehen in der Regel in Ordnung.
Nach jeder Änderung muss fail2ban neu gestartet werden:
/etc/init.d/fail2ban restart
Achso: Der Wert ignoreip ist auch wichtig. Gebt hier die IP Eures Rechners ein, der keinesfalls gesperrt werden soll. Nichts schlimmeres, als wenn Eure eigene Maschine nicht mehr ran kann ;-)
Wer zudem sich den Luxus gönnen möchte, dass man per Mail verständigt wird, sobald ein Einbruchsversuch geblockt wurde, kann dies natürlich auch einrichten. Gebt dazu den Parameter destemail in der jail.local an:
destemail = meine@email.adresse
Als Standard MTA ist sendmail angegeben. Die heutigen Debianserver haben als Standard MTA den exim4 hinterlegt. Dieser funktioniert als Ersatz auch und es muss hier in der jail.local nichts umgebogen werden.
Solltet Ihr eigentlich keinen Webserver aktiviert haben, könnt Ihr aber dennoch den exim dazu verwenden, via eines sogenannten Smarthosts (= externer Mailserver) Eure fail2ban Mail verschicken zu lassen.
Um einen Smarthost einzurichten startet die Konfiguration mit einem
dpkg-reconfigure exim4-config
Folgende Konfigurationsschritte:
1.) Versand über Sendezentrale (Smarthost); Empfang mit SMTP oder Fetchmail
2.) Email Name des Systems: Lasst einfach den voreingestellten Domänen Name stehen
3.) IP-Adressen, dan denen eingehende SMTP-Verbindungen erwartet werden: 127.0.0.1
4.) Weitere Ziele, für die die E-Mails angenommen werden sollen: Auch hier den default Domän Namen stehen lassen
5.) Rechner für die die E-Mails weitergeleitet werden sollen (Relay): Leer lassen, wenn nicht ein weiterer Rechner DIESEN Rechner als Smarthost verwendet. Also normal leer lassen.
6.) IP Adresse oder Rechnername der Sendezentrale für ausgehende E-Mails:
Hier und genau hier kommt die IP Adresse oder der Rechnername (mail/smtp.xyz) Eures ISP rein!
7.) Lokalen E-Mail Namen in ausgehende Mails verbergen: Ja
8.) Sichtbarer Domänennamen für lokalen Benutzer: Hier gebt eine Adresse ein, die Ihr besitzt (in der Form meinepage.de)
9.) DNS Anfrage minimieren: Ja
10.) Versandart bei lokaler Mailzustellung: Mbox Format in /var/mail/
11.) Einstellungen auf kleine Dateien aufteilen: Nein
Danach startet der MTA neu. Jetzt kann es auch sein, dass Euer Smarthost eine Authentifizierung abverlangt. Diese hinterlegt in der folgenden Datei: /etc/exim4/passwd.client
Hier das Passwort wie folgt hinterlegen:
IP_des_Mailserver_oder_Name:LOGIN:PASSWORT
Die Datei sollte nur lesbar für root sein.
Startet danach den MTA neu:
/etc/init.d/exim4 restart
Jetzt könnt Ihr auch Mails verschicken.
Danach geben wir noch in der /etc/fail2ban/jail.local an, dass auch E-Mails verschickt werden sollen. Ändert hierfür die Zeile
action = %(action_)s
in
action = %(action_mwl)s
Jetzt den fail2ban neu starten:
/etc/init.d/fail2ban restart
Nun sollte es nicht mehr lange dauern, bis Ihr eine Mail bekommt.
Die Logfile könnt Ihr an der Konsole mit einem
tail -f /var/log/fail2ban.log
überwachen.
Damit ist ein Geschützturm für Euren Server aufgestellt.
Firewall Script mit iptables
Parallel zur Fail2Ban Installation macht es Sinn, noch seinen Server über ein Firewall Script abzudichten. Hierbei soll das Script folgendes machen:
a) Spezielle IP Nummern sperren (Blacklisting)
b) Alle Ports dicht machen
c) Spezielle Ports öffnen
Zuerst legen wir unsere Blacklistdatei an:
touch /usr/local/etc/blacklist.txt
Solltet Ihr bereits IP Nummern haben, denen Ihr generell den Zugriff verwehren wollt, dann schreibt diese in die Blacklist Datei einfach untereinander rein.
Dann legen wir unter /etc/init.d/ unser Firewallscript an:
touch /etc/init.d/firewall
Das machen wir ausführbar:
chmod +x /etc/init.d/firewall
Wir editieren nun das Skript mit
nano /etc/init.d/firewall
und füllen die Datei mit folgenden Inhalt:
#!/bin/sh
# script written by Gargi 2009 http://www.gargi.org
#needed modules
modprobe ip_conntrack_ftp
BLACKLIST=/usr/local/etc/blacklist.txt
#trigger for your ports
IN_ALLOWED_TCP="21 22 25 53 80"
OUT_ALLOWED_TCP="21 22 25 53 80"
IN_ALLOWED_UDP="53 7878"
OUT_ALLOWED_UDP="53"
IN_ALLOWED_ICMP=" "
OUT_ALLOWED_IMCP=" "
case "$1" in
start)
# Stopping IP trap
/etc/init.d/fail2ban stop
echo "Stopping fail2ban IP trap ..."
# Clear iptables
iptables -F
#Defaults
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# loopback communication
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# persist on connections
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Ban blacklisted IPs
for x in `grep -v ^# $BLACKLIST | awk '{print 41}'`; do
echo "Blocking $x..."
iptables -A INPUT -t filter -s $x -j DROP
done
# TCP rules in
for port in $IN_ALLOWED_TCP; do
echo "Accepting TCP port $port"
iptables -A INPUT -t filter -p tcp --dport $port -j ACCEPT
done
# TCP rules out
for port in $OUT_ALLOWED_TCP; do
echo "Allowing sending over TCP port $port"
iptables -A OUTPUT -t filter -p tcp --dport $port -j ACCEPT
done
# UDP rules in
for port in $IN_ALLOWED_UDP; do
echo "Accepting UDP port $port"
iptables -A INPUT -t filter -p udp --dport $port -j ACCEPT
done
# UDP rules out
for port in $OUT_ALLOWED_UDP; do
echo "Allowing sending over UDP port $port"
iptables -A OUTPUT -t filter -p udp --dport $port -j ACCEPT
done
# ICMP rules in
for port in $IN_ALLOWED_ICMP; do
echo "Accepting ICMP port $port"
iptables -A INPUT -t filter -p icmp --dport $port -j ACCEPT
done
# ICMP rules out
for port in $OUT_ALLOWED_ICMP; do
echo "Allowing sending over ICMP port $port"
iptables -A OUTPUT -t filter -p icmp --dport $port -j ACCEPT
done
# Dropping startup requests
iptables -A INPUT -t filter -p tcp --syn -j DROP
# Restarting IP trap
/etc/init.d/fail2ban start
echo "Fire up IP trap again ..."
;;
stop)
/etc/init.d/fail2ban stop
iptables -F
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
echo "Warning! Firewall is stopped, server is unprotected now!"
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "Usage $0 {start|stop|restart}"
;;
esac
Ihr seht, dass Ihr oben einfach die gewünschten Ports für TCP / UDP In- und Outgoing eintragen könnt wie Ihr sie benötigt. Mit obigen Ports funktioniert FTP, DNS, SSH und HTTP. Jetzt müssen wir nur noch Debian beibringen, dass das Script in den Runlevels aktiviert ist:
cd /etc/init.d
update-rc.d firewall defaults
Danach startet das Script bei jedem Serverstart automatisch. Wenn Ihr neue Ports einfügt, dann müsst Ihr nicht jedes Mal den Server neu starten, sondern es genügt ein:
/etc/init.d/firewall restart
Hierbei wird zudem jedes Mal auch der Fail2ban neu gestartet. Um zu sehen, welche Regeln vorliegen ruft einfach
iptables -L -v
auf.
Viele Grüße!
Gargi