Debian Iptables: Unterschied zwischen den Versionen
Erich (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Erich (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
(10 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 4: | Zeile 4: | ||
'''Optionale Voraussetzung:''' | '''Optionale Voraussetzung:''' | ||
* [[Debian_Postfix_und_Cyrus_Imapd|Mailserver]] für Mailbenachrichtigung | * [[Debian_Postfix_und_Cyrus_Imapd|Mailserver]] für Mailbenachrichtigung | ||
{{Hinweis| | |||
Falls im DSL-Router bereits eine Firewall aktiviert ist, ist eine zusätzliche iptables-Firewall auf dem Server nicht mehr nötig. Der DSL-Router schirmt den Server bereits sehr gut gegen Internetangriffe ab, da für die Serverdienste nur bestimmte Ports im DSL-Router freigegeben werden und die restlichen abgeblockt werden. Mehr Funktionalität und Sicherheit bietet das iptables Firewall-Script auch nicht. Deshalb ist es ausreichend [[Debian_Iptables#Installation Fail2ban|Fail2ban]] ohne iptables-Firewall einzurichten.}} | |||
Zeile 395: | Zeile 399: | ||
/etc/init.d/iptables start | /etc/init.d/iptables start | ||
{{ | {{Hinweis|Sollten Proleme mit der Firewall auftreten, kann diese mit dem Befehlt '''"/etc/init.d/iptables stop"''' wieder beendet werden.}} | ||
Sollten Proleme mit der Firewall auftreten, kann diese mit dem Befehlt '''"/etc/init.d/iptables stop"''' wieder beendet werden.}} | |||
Es sollte kein Fehler ausgegeben werden und weiterhin Zugriff auf den Server bestehen. | Es sollte kein Fehler ausgegeben werden und weiterhin Zugriff auf den Server bestehen. | ||
Zeile 405: | Zeile 408: | ||
Nachdem im vorhergehenden Schritt sichergestellt wurde, dass alle gewünschten und nötigen Services erreichbar sind, kann die Firewall eingerichtet werden, dass diese bei jedem Neustart des Servers mitstartet. | Nachdem im vorhergehenden Schritt sichergestellt wurde, dass alle gewünschten und nötigen Services erreichbar sind, kann die Firewall eingerichtet werden, dass diese bei jedem Neustart des Servers mitstartet. | ||
{{ | {{Achtung| | ||
Sollte die Firewall automatisch starten, und SSH nicht erreichbar sein, ist keinerlei Zugriff mehr auf die Server möglich, außer es steht lokal Maus- und Tastatur zur Verfügung. D.h. um wieder Zugriff zu erhalten, kann unter Umständen eine komplette Neuinstallation nötig werden. Deshalb unbedingt sicher stellen, dass der Server mindestens via SSH erreichbar ist, '''BEVOR''' der folgende Befehl ausgeführt wird.}} | |||
update-rc.d iptables defaults | update-rc.d iptables defaults | ||
Zeile 448: | Zeile 451: | ||
festgelegt. Durch ersetzen von '''''action_''''' mit '''''action_mw''''' bzw. '''''action_mwl''''' kann der Versand einer Benachrichtigungs Email erreicht werden - voraussgesetzt ein Mailserver ist installiert. | festgelegt. Durch ersetzen von '''''action_''''' mit '''''action_mw''''' bzw. '''''action_mwl''''' kann der Versand einer Benachrichtigungs Email erreicht werden - voraussgesetzt ein Mailserver ist installiert. | ||
{{ | {{Hinweis|Nach jeder Änderung an der jail.conf bzw. jail.local muß fail2ban neu gestartet werden, um die Änderungen zu übernehmen.}} | ||
Nach jeder Änderung an der jail.conf bzw. jail.local muß fail2ban neu gestartet werden, um die Änderungen zu übernehmen.}} | |||
Zeile 468: | Zeile 470: | ||
==Mediawiki== | ===Webserver Apache=== | ||
Mediawiki kann ebenfalls überwacht werden. Für Mediawiki muß zunächst eine Extension installiert werden, die gescheiterte Login-Versuche in ein Log-File schreibt. Fail2ban kann schließlich dieses Logfile überwachen und einen evtl. Angreifer aussperren. | vi /etc/fail2ban/jail.local | ||
Die Jails [Apache] , [apache-noscript] und [apache-overflows] aktivieren (enabled=true). | |||
Um bösartige Bots abzuweheren, folgende Jail (nach [apache-overflows] einfügen: | |||
[apache-badbots] | |||
enabled = true | |||
port = http,https | |||
filter = apache-badbots | |||
logpath = /var/log/apache*/*access.log | |||
maxretry = 1 | |||
===Mediawiki=== | |||
Mediawiki kann ebenfalls überwacht werden. Für Mediawiki muß zunächst eine Extension installiert werden (siehe auch http://www.mediawiki.org/wiki/Extension:Fail2banlog), die gescheiterte Login-Versuche in ein Log-File schreibt. Fail2ban kann schließlich dieses Logfile überwachen und einen evtl. Angreifer aussperren. | |||
'''Mediawiki Extension installieren:''' | '''Mediawiki Extension installieren:''' | ||
cd /var/ | cd /var/www/mediawiki/ | ||
mkdir log | mkdir log | ||
chown www-data:www-data log | chown www-data:www-data log | ||
mkdir | mkdir extensions/fail2banlog | ||
cd | cd extensions/fail2banlog | ||
vi fail2banlog.php | |||
Folgende Zeilen einfügen: | |||
<?php | |||
$wgExtensionCredits['other'][] = array( | |||
'name' => 'fail2banlog', | |||
'author' =>'Laurent Chouraki', | |||
'url' => 'http://www.security-database.com', | |||
'description' => 'This extension writes a text file with IP of failed login as an input to fail2ban.' | |||
); | |||
$wgHooks['LoginAuthenticateAudit'][] = 'logBadLogin'; | |||
function logBadLogin($user, $password, $retval) { | |||
global $fail2banfile; | |||
global $fail2banid; | |||
if ( $retval == "SUCCESS" | |||
or $retval == "RESET_PASS" | |||
or $retval == "ABORTED" | |||
{ return true; // Do not log success or password send request, continue to next hook | |||
$time = date ("Y-m-d H:i:s T"); | |||
$ip = $_SERVER['REMOTE_ADDR']; // wfGetIP() may yield different results for proxies $name = $user->getName(); | |||
// append a line to the log error_log("$time Authentication error for $name from $ip on $fail2banid\n",3,$fail2banfile); | |||
return true; // continue to next hook | |||
} | |||
'''Mediawiki Extension aktivieren:''' | '''Mediawiki Extension aktivieren:''' | ||
vi / | vi /var/www/mediawiki/LocalSettings.php | ||
Nach der Zeile | Nach der Zeile | ||
require_once( "$IP/includes/DefaultSettings.php" ); | require_once( "$IP/includes/DefaultSettings.php" ); | ||
Zeile 502: | Zeile 543: | ||
port = http,https | port = http,https | ||
filter = mediawiki | filter = mediawiki | ||
logpath = /var/ | logpath = /var/www/mediawiki/log/mediawiki.log | ||
maxretry = 3 | maxretry = 3 | ||
Zeile 511: | Zeile 552: | ||
/etc/init.d/fail2ban restart | /etc/init.d/fail2ban restart | ||
{{ | {{Hinweis| | ||
Falls die Action '''''action_mw''''' bzw. '''''action_mwl''''' gewählt wurde, sollte der Emailempfänger eine (bzw. mehere Mail) erhalten haben, die besagt, dass fail2ban gestartet wurde.}} | * Falls die Action '''''action_mw''''' bzw. '''''action_mwl''''' gewählt wurde, sollte der Emailempfänger eine (bzw. mehere Mail) erhalten haben, die besagt, dass fail2ban gestartet wurde. | ||
* Für Fail2ban wurde bei der Installation ein wöchentlicher Logrotate Job eingerichtet, der verhindert, dass das Logfile zu gross wird. Dabei wird das Logfile fail2ban.log -> fail2ban.log.1 umbenannt, fail2ban.log.1 -> fail2ban.log.2.gz gepackt ... fail2ban.log.4.gz. Dadurch sind alte Logeinträge erhalten und das aktuelle Logfile bleibt übersichtlich. Bei diesem Logrotate muss Fail2ban neu gestartet werden, wodurch einmal wöchentlich emails von Fail2ban zugestellt werden, dass dieser gestoppt und wieder gestartet wurde.}} | |||
Status von fail2ban abfragen: | Status von fail2ban abfragen: |
Aktuelle Version vom 22. Oktober 2010, 05:28 Uhr
Allgemein
Falls der Debian-Server hinter einem DSL-Router mit aktivierter Firewall hängt, ist dieser bereits relativ gut gegen Angriffe aus dem Internet abgeschirmt. Dennoch sind sog. Brute-Force-Attacken gegen die Serverdienste wie z.B. [Debian_OpenSSH|SSH]], FTP- und Webserver sowie aus dem Internet erreichbare Mailserver möglich. Dabei wird meist per automatisch ablaufenden Scripts versucht, Passwörter mittels Durchprobieren zu ermitteln. Um dies zu unterbinden, wird die Linux-Standardfirewall "iptables" (http://www.netfilter.org) aktiviert. On Top wird Fail2ban (http://fail2ban.org) installiert, mit dessen Hilfe es möglich ist, IP-Adressen von Angreifern, die mehrmals ein Passwort z.B des FTP-Server falsch eingegben haben, komplett auszusperren. Eine erneute Anmeldung ist erst nach einer frei definierbaren Zeit wieder möglich.
Optionale Voraussetzung:
- Mailserver für Mailbenachrichtigung
Hinweis: | |
Falls im DSL-Router bereits eine Firewall aktiviert ist, ist eine zusätzliche iptables-Firewall auf dem Server nicht mehr nötig. Der DSL-Router schirmt den Server bereits sehr gut gegen Internetangriffe ab, da für die Serverdienste nur bestimmte Ports im DSL-Router freigegeben werden und die restlichen abgeblockt werden. Mehr Funktionalität und Sicherheit bietet das iptables Firewall-Script auch nicht. Deshalb ist es ausreichend Fail2ban ohne iptables-Firewall einzurichten. |
Installation von iptables
Iptables ist normalerweise unter Debian bereits installiert. Falls nicht, dies nun nachholen:
apt-get update apt-get install iptables
Zum aktivieren der Firewall wird noch ein Satz von Firewall-Regeln benötigt. Als Startpunkt kann das folgende Script verwendet werden, bei dem Regeln für die in den Howtos beschriebenen Programme enthält, die standardmäßig auskommentiert sind.
vi /etc/init.d/iptables
Folgende Zeilen einfügen:
#!/bin/sh ############################################################################### # # Local Settings # # IPTables Location - adjust if needed IPT="/sbin/iptables" IPTS="/sbin/iptables-save" IPTR="/sbin/iptables-restore" # Internet Interface INET_IFACE="eth0" # CHANGE THIS TO MATCH YOUR SERVER IP ADDRESS # currently not used INET_ADDRESS="192.168.0.219" # Localhost Interface LO_IFACE="lo" LO_IP="127.0.0.1" # Save and Restore arguments handled here if [ "$1" = "save" ] then echo -n "Saving firewall to /etc/iptables ... " $IPTS > /etc/iptables echo "done" exit 0 elif [ "$1" = "restore" ] then echo -n "Restoring firewall from /etc/iptables ... " $IPTR < /etc/iptables echo "done" exit 0 fi # Flush Any Existing Rules or Chains echo "Flushing Tables ..." # Reset Default Policies $IPT -P INPUT ACCEPT $IPT -P FORWARD ACCEPT $IPT -P OUTPUT ACCEPT # Flush all rules $IPT -F # Erase all non-default chains $IPT -X if [ "$1" = "stop" ] then echo "Firewall completely flushed! Now running with no firewall." exit 0 fi ############################################################################### # Rules Configuration # Filter Table # Set Policies $IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP # User-Specified Chains echo "Create and populate custom rule chains ..." # Create a chain to filter INVALID packets $IPT -N bad_packets # Create another chain to filter bad tcp packets $IPT -N bad_tcp_packets # Create separate chains for icmp, tcp (incoming and outgoing), # and incoming udp packets. $IPT -N icmp_packets # Used for UDP packets inbound from the Internet $IPT -N udp_inbound # Used to block outbound UDP services from internal network # Default to allow all $IPT -N udp_outbound # Used to allow inbound services if desired # Default fail except for established sessions $IPT -N tcp_inbound # Used to block outbound services from internal network # Default to allow all $IPT -N tcp_outbound # Populate User Chains # bad_packets chain # Drop INVALID packets immediately # needs conntrack #$IPT -A bad_packets -p ALL -m state --state INVALID -j DROP # Then check the tcp packets for additional problems $IPT -A bad_packets -p tcp -j bad_tcp_packets # All good, so return $IPT -A bad_packets -p ALL -j RETURN # bad_tcp_packets chain # # All tcp packets will traverse this chain. # Every new connection attempt should begin with # a syn packet. If it doesn't, it is likely a # port scan. This drops packets in state # NEW that are not flagged as syn packets. # needs conntrack #$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG \ #--log-prefix "New not syn: " #$IPT -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP # Stealth scans $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL NONE -j DROP $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL ALL -j DROP $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP $IPT -A bad_tcp_packets -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP $IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,RST SYN,RST -j DROP $IPT -A bad_tcp_packets -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP # All good, so return $IPT -A bad_tcp_packets -p tcp -j RETURN # icmp_packets chain # ICMP packets should fit in a Layer 2 frame, thus they should # never be fragmented. Fragmented ICMP packets are a typical sign # of a denial of service attack. #$IPT -A icmp_packets --fragment -p ICMP -j LOG \ #--log-prefix "ICMP Fragment: " $IPT -A icmp_packets --fragment -p ICMP -j DROP # Echo - uncomment to allow your system to be pinged. # Uncomment the LOG command if you also want to log PING attempts # # $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j LOG \ # --log-prefix "Ping detected: " $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT # comment out above and uncomment below to drop pings without logging. #$IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j DROP # see ping reply packets $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 0 -j ACCEPT # Time Exceeded $IPT -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT # Not matched, so return so it will be logged $IPT -A icmp_packets -p ICMP -j RETURN # TCP & UDP # Identify ports at: # http://www.chebucto.ns.ca/~rakerman/port-table.html # http://www.iana.org/assignments/port-numbers # # ADD UDP-based services here # # udp_inbound chain # ports you want to accept udp packets on # netbios/samba $IPT -A udp_inbound -p UDP -s 0/0 --destination-port 137 -j ACCEPT $IPT -A udp_inbound -p UDP -s 0/0 --destination-port 138 -j ACCEPT # Network Time Protocol (NTP) Server $IPT -A udp_inbound -p UDP -s 0/0 --destination-port 123 -j ACCEPT # External DHCP Server # Allow DHCP client request packets inbound from external network $IPT -A udp_inbound -p UDP -s 0/0 --source-port 68 --destination-port 67 -j ACCEPT # DNS in #$IPT -A udp_inbound -p UDP -s 0/0 --destination-port 53 -j ACCEPT $IPT -A udp_inbound -p UDP -s 0/0 --source-port 53 -j ACCEPT # DCC for Spamassassin UDP reply packets #$IPT -A udp_inbound -p UDP -m udp --destination-port 1024:65535 --source-port 6277 -j ACCEPT
# Not matched, so return for logging $IPT -A udp_inbound -p UDP -j RETURN # udp_outbound chain # all udp outbound traffic will be accepted $IPT -A udp_outbound -p UDP -s 0/0 -j ACCEPT # tcp_inbound chain # # This chain is used to allow inbound connections to the SLUG # smb $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 137 -j ACCEPT $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 139 -j ACCEPT $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 445 -j ACCEPT # HTTP #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 80 -j ACCEPT #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 443 -j ACCEPT # Webmin #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 10000 -j ACCEPT # Funambol #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 8080 -j ACCEPT #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 8443 -j ACCEPT # FTP #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port ftp -j ACCEPT # Passive FTP #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 60019:60049 -j ACCEPT # DNS $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 53 -j ACCEPT # sshd $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 22 -j ACCEPT #smtp #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 25 -j ACCEPT #IMAPd #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 143 -j ACCEPT #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 993 -j ACCEPT #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 406 -j ACCEPT #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 674 -j ACCEPT #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 2000 -j ACCEPT #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 2003 -j ACCEPT #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 4201 -j ACCEPT #CUPS #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 631 -j ACCEPT #SIS-PM #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 2638 -j ACCEPT # Not matched, so return so it will be logged $IPT -A tcp_inbound -p TCP -j RETURN # tcp_outbound chain # all outbound traffic will be accepted $IPT -A tcp_outbound -p TCP -s 0/0 -j ACCEPT ############################################################################### # INPUT Chain echo "process INPUT chain ..." # Allow all on localhost interface $IPT -A INPUT -p ALL -i $LO_IFACE -j ACCEPT # Drop bad packets $IPT -A INPUT -p ALL -j bad_packets # ****************************** # Inbound Internet Packet Rules # Accept Established Connections # Needs conntrack module # $IPT -A INPUT -p ALL -i $INET_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT # packet filter accepts inbound packets that are replies to an outbound connection # use until conntrack is available # this blocks all new connection attempts except to those allowed below $IPT -A INPUT -p TCP -i $INET_IFACE ! --syn -j ACCEPT # Route the rest to the appropriate user chain $IPT -A INPUT -p TCP -i $INET_IFACE -j tcp_inbound $IPT -A INPUT -p UDP -i $INET_IFACE -j udp_inbound $IPT -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets # Drop without logging broadcasts that get this far. # Comment this line if testing new rules that impact # broadcast protocols. #$IPT -A INPUT -m pkttype --pkt-type broadcast -j DROP ############################################################################### # # OUTPUT Chain # echo "Process OUTPUT chain ..." # Generally trust the firewall on output # However, invalid icmp packets need to be dropped # to prevent a possible exploit. # needs conntrack #$IPT -A OUTPUT -m state -p icmp --state INVALID -j DROP # Localhost $IPT -A OUTPUT -p ALL -s $LO_IP -j ACCEPT $IPT -A OUTPUT -p ALL -o $LO_IFACE -j ACCEPT # If you want to block outbound connections, uncomment first section below, comment # out second section, and add rules to tcp_outbound/udp_outbound # To internet - filtered #$IPT -A OUTPUT -p TCP -o $INET_IFACE -j tcp_outbound #$IPT -A OUTPUT -p UDP -o $INET_IFACE -j udp_outbound # To internet (unfiltered) $IPT -A OUTPUT -p ALL -o $INET_IFACE -j ACCEPT
Firewall-Script ausführbar machen:
chmod +x /etc/init.d/iptables
Konfiguration iptables
Oben angeführtes Script enthält bereits eine Menge an Firewall-Regeln. Einige sind bereits aktiviert, die anderen sind auskommentiert. Standardmäßgi werden alle ausgehenden Datenpakete erlaubt, eingehende nur diejenigen, die explizit freigegeben wurden.
Mailserver
Mailserver arbeiten Standardmäßig mit den Ports 25 (SMTP), 143 (IMAP) und 993 (IMAPS). Zur Freigabe dieser Ports die Kommentarzeichen vor folgenden Zeilen entfernen, die mit #$IPT beginnen:
#smtp #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 25 -j ACCEPT #IMAPd #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 143 -j ACCEPT #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 993 -j ACCEPT #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 406 -j ACCEPT #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 674 -j ACCEPT #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 2000 -j ACCEPT #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 2003 -j ACCEPT #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 4201 -j ACCEPT
Freigabe der Ports je nach Bedarf (z.B. Port 993 nur nötig für SSL-Zugriff auf Cyrus Imap, die anderen Service-ports sollten erlaubt werden:
#smtp $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 25 -j ACCEPT #IMAPd $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 143 -j ACCEPT $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 993 -j ACCEPT $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 406 -j ACCEPT $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 674 -j ACCEPT $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 2000 -j ACCEPT $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 2003 -j ACCEPT $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 4201 -j ACCEPT
Webserver
Die Weboberfläche der NSLU wurde gemäß Anleitung uNSLUng auf Port 8282 gesetzt. Dieser Port wird bereits standardmäßig freigegeben. Falls dem internen Webserver ein anderer Port zugewiesen wurde, bitte den Port entsrechend anpassen. Falls →Webserver installiert wurde, den Port 80 durch auskommentieren der Zeile freigeben:
# HTTP #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 80 -j ACCEPT
Freigeben Port 80 für Webserver:
# HTTP $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 80 -j ACCEPT
FTP-server
FTP verwendet Standardmäßig Port 21 für aktives FTP und einen beliebigen Port >1024 für passives FTP. Hier werden die Ports aus dem Bereich 60019 bis 60049 freigegeben, aus dem sich der FTP-Server einen für die passive Verbindung auswählen kann.
# FTP #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port ftp -j ACCEPT # Passive FTP #$IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 60019:60049 -j ACCEPT
FTP-Server freigeben:
# FTP $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port ftp -j ACCEPT # Passive $IPT -A tcp_inbound -p TCP -s 0/0 --destination-port 60019:60049 -j ACCEPT
Funktionscheck
Starten der Firewall-Regeln:
/etc/init.d/iptables start
Hinweis: | |
Sollten Proleme mit der Firewall auftreten, kann diese mit dem Befehlt "/etc/init.d/iptables stop" wieder beendet werden. |
Es sollte kein Fehler ausgegeben werden und weiterhin Zugriff auf den Server bestehen. Den Zugriff via ssh und alle anderen konfigurierten Services und Server wie Web-, FTP- und Mailserver.
Firewall Autostart
Nachdem im vorhergehenden Schritt sichergestellt wurde, dass alle gewünschten und nötigen Services erreichbar sind, kann die Firewall eingerichtet werden, dass diese bei jedem Neustart des Servers mitstartet.
update-rc.d iptables defaults
Installation Fail2ban
apt-get install fail2ban apt-get install whois
Konfiguration fail2ban
Allgemeine Hinweise und Einstellungen
Die sog. Jails (/etc/fail2ban/jail.conf bzw. /etc/fail2ban/jail.local) definieren die anzuwendenden Regeln (Filter) und die entsprechenden Aktionen daraus. Die Filter sind jeweils in einer Konfig-Datei im Verzeichnis /etc/fail2ban/filter.d/ Für viele Tools sind bereits Filter-Files vordefiniert.
Desweiteren sind bereits zahlreiche Beispiele von Konfigurationen in der jail.conf vorgegeben, die allerdings alle deaktiviert sind (enabled=false).
Genereller Aufbau jeder Fail2ban-Definition (Jail) in der jail.conf:
- enabled: true: Regel aktiviert / false: Regel inaktiv
- filter: Filterfile, das ein Log-File analysiert
- action: Aktion, die ausgeführt wird, wenn der Filter einen Einbruchsversuch detektiert hat.
- logpath: Logfile, das analysiert weren soll
- maxretry:Anzahl der Fehlversuche, bis die Sperre aktiv wird
- bantime: Dauer der Sperre in s
Kopieren der Konfiguratonsdatei jail.conf nach jail.local.
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Allgemeine Einstellungen:
vi /etc/fail2ban/jail.local
Die Einstellungen unter [DEFAULT]] sind Standardeinstellungen, die zur Anwendung kommen, falls diese nicht durch eine abweichende Einstellungen in den eigentlichen jails überschrieben werden.
- ignoreip: Ip-oder Host-Adresse eines Rechners, der nie geblockt werden soll. Dies verhindert, dass man sich versehentlich selbst aussperrt. Hier sollte immer der Localhost (127.0.0.1) angegeben werden und evtl. durch Leerzeichen getrennt, weitere lokale PC's. Zum Funktionstest ist allerdings später ein PC nötig, der nicht in dieser Liste enthalten sein darf.
- bantime: Zeit in Sekunden für die ein Angreifer ausgesperrt wird, bis er sich erneut anmelden darf. Für die Erstmalige Einrichtung und anschließende Funktionstests sollte diese Zeit auf ein paar Minuten (z.B. 120s) gesetzt werden, da ansonsten 10 Minuten (Standardwert=600s) gewartet werden muß, bevor ein erneuter Loginversuch möglich ist. Sollte später deutlich erhöht werden, z.B. 3600s
- maxretry: Anzahl der Login Fehlversuche bis der User gesperrt werden soll
- destemail: Mailempfänger, der benachrichtigt werden soll, wenn jemand von fail2ban gesperrt wurde
Die Default Action, die ergriffen werden soll, nachdem ein Einbruchversuch festgestellt wurde:
- action_: Der Angreifer wird gebannt
- action_mw: Der Angreifer wird gebannt und zusätzlich wird eine Email versendet, die Details zur angreifenden IP-Adresse enthält. Diese wird via whois-Abfrage ermittelt
- action_mwl: Zusätzlich zu action_mw werden noch die relevanten Zeilen des Logfiles an die Mail angehängt.
Die Standard action wird mit der Zeile:
action = %(action_)s
festgelegt. Durch ersetzen von action_ mit action_mw bzw. action_mwl kann der Versand einer Benachrichtigungs Email erreicht werden - voraussgesetzt ein Mailserver ist installiert.
Hinweis: | |
Nach jeder Änderung an der jail.conf bzw. jail.local muß fail2ban neu gestartet werden, um die Änderungen zu übernehmen. |
OpenSSH
Falls der SSH-Zugang aus dem Internet zugreifbar ist, ist es essenziell, diesen zu schützen. Die meisten Angriffsversuche erfolgen auf SSH- und FTP-Server. Für SSH ist bereits eine jail definiert, die lediglich aktiviert werden muss (normalerweise standardmäßig aktiviert):
vi /etc/fail2ban/jail.local
Im Bereich ssh folgende Einstellungen vornehmen:
enabled=true maxretry nach Bedarf z.B. 3
FTP-Server
Für ProFTPd ist bereits eine jail definiert. Diese muß lediglich aktiviert werden.
vi /etc/fail2ban/jail.local
Im Bereich [proftpd] folgende Einstellungen vornehmen:
enabled=true maxretry nach Bedarf z.B. 3
Webserver Apache
vi /etc/fail2ban/jail.local
Die Jails [Apache] , [apache-noscript] und [apache-overflows] aktivieren (enabled=true).
Um bösartige Bots abzuweheren, folgende Jail (nach [apache-overflows] einfügen:
[apache-badbots] enabled = true port = http,https filter = apache-badbots logpath = /var/log/apache*/*access.log maxretry = 1
Mediawiki
Mediawiki kann ebenfalls überwacht werden. Für Mediawiki muß zunächst eine Extension installiert werden (siehe auch http://www.mediawiki.org/wiki/Extension:Fail2banlog), die gescheiterte Login-Versuche in ein Log-File schreibt. Fail2ban kann schließlich dieses Logfile überwachen und einen evtl. Angreifer aussperren.
Mediawiki Extension installieren:
cd /var/www/mediawiki/ mkdir log chown www-data:www-data log mkdir extensions/fail2banlog cd extensions/fail2banlog vi fail2banlog.php
Folgende Zeilen einfügen:
<?php $wgExtensionCredits['other'][] = array( 'name' => 'fail2banlog', 'author' =>'Laurent Chouraki', 'url' => 'http://www.security-database.com', 'description' => 'This extension writes a text file with IP of failed login as an input to fail2ban.' ); $wgHooks['LoginAuthenticateAudit'][] = 'logBadLogin'; function logBadLogin($user, $password, $retval) { global $fail2banfile; global $fail2banid; if ( $retval == "SUCCESS" or $retval == "RESET_PASS" or $retval == "ABORTED" { return true; // Do not log success or password send request, continue to next hook $time = date ("Y-m-d H:i:s T"); $ip = $_SERVER['REMOTE_ADDR']; // wfGetIP() may yield different results for proxies $name = $user->getName(); // append a line to the log error_log("$time Authentication error for $name from $ip on $fail2banid\n",3,$fail2banfile); return true; // continue to next hook }
Mediawiki Extension aktivieren:
vi /var/www/mediawiki/LocalSettings.php
Nach der Zeile
require_once( "$IP/includes/DefaultSettings.php" );
Folgende Zeilen einfügen:
$fail2banfile = "$IP/log/mediawiki.log"; // the file fail2ban will read $fail2banid = $wgSitename; // some info if you use the same file for many wiki require_once( "$IP/extensions/fail2banlog/fail2banlog.php" );
Fail2ban Filter
vi /etc/fail2ban/filter.d/mediawiki.conf
Folgende Zeilen einfügen:
[Definition] failregex = Authentication error .* from <HOST> on
Fail2ban Jail
vi /etc/fail2ban/jail.local
Folgende Zeilen im Jails-Bereich einfügen (z.B. vor #FTP Servers)
[mediawiki] enabled = true port = http,https filter = mediawiki logpath = /var/www/mediawiki/log/mediawiki.log maxretry = 3
Funktionscheck
Start und Statuscheck
Neustart von fail2ban
/etc/init.d/fail2ban restart
Status von fail2ban abfragen:
fail2ban-client status
Dieser Befehl sollte eine Ausgabe in der folgenden Form liefern (abhängig von den aktivierten Jails):
Status |- Number of jail: 2 `- Jail list: ssh, proftpd
Check, ob fail2ban neue Chains in der iptables Firewall korrekt hinterlegt hat:
iptables -L | grep fail2ban
Ja nach Anzahl aktivierter jails, sollten hier pro Jail zwei Zeilen ausgegeben werden - z.B. für SSH:
fail2ban-ssh tcp -- anywhere anywhere multiport dports ssh Chain fail2ban-ssh (1 references)
Falls Fail2ban nicht korrekt funktionieren sollte, empfiehlt es sich, den Loglevel zu erhöhen:
vi /etc/fail2ban/fail2ban.conf
Loglevel erhöhen:
loglevel = 4
Fail2ban anschließend neu starten, um die Änderung zu übernehmen. Fail2ban verwendet standardmäßig des Logfile /var/log/fail2ban.log, das auf Hinweise zur Fehlerursache durchforstet werden sollte.
Ban eines Dienstes
- Auf einem Client-PC eine Verbindung zum Server mit einem Tool, für das eine Jail konfiguriert wurde, aufbauen z.B. FTP. Falls Jails für andere außer ssh definiert und aktiviert wurden, empfiehlt es sich diese zu erst zu prüfen, da dann immer noch die SSH-Verbindung für evtl. Fehlerbereinigungen zur Verfügung steht. Desweiteren kann via SSH das Logfile von fail2ban verfolgt online werden:
tail -f /var/log/fail2ban.log
- Mehrmals falsches Passwort eingeben (Anzahl>maxretry der jeweiligen Jail). Sobald Anzahl=maxretry, muß die Verbindung zum Server abreißen bzw. keine neue hergestellt werden.
- Im Logfile sollte nun ein Eintrag in der Form erscheinen:
fail2ban.actions:WARNING [proftpd] BAN IP-Adresse des TestPC's
- Falls konfiguriert, sollte eine Benachrichtigungsmail an die eingestellte emailadresse (destmail) versendet werden.
- Es darf nun auch keine Verbindung mehr mit korrektem Passwort möglich sein.
UnBan eines Dienstes
- Die konfigurierte Wartezeit bantime abwarten
- Verbingung erneut aufbauen. Login sollte nun mit korrektem Passwort möglich sein.
- Im Logfile sollte nun ein Eintrag in der Form erscheinen:
fail2ban.actions:WARNING [proftpd] UNBAN IP-Adresse des TestPC's
Optimierung der Konfiguration
Nachdem während der → Konfiguration Optionen gewählt wurden, die einen einfache und problemlosen Funktionscheck erlauben, sollten diese nach bestandenem Funktionscheck auf operationelle Belange geändert werden.
vi /etc/fail3ban/jail.local
- ignoreip: Ergänzen der IP-Adressen (durch Leerzeichen getrennt), der lokalen PC's, die nicht gesperrt werden sollen
- bantime: Hochsetzen den Bantime z.B. auf 3600 um ungebetene Gäste für eine Stunde auszusperren
- banaction: Bestimmt die Art und Weise wie ein Angreifer ausgesperrt werden soll. Standardmäßig kommt iptables-multiport zum Einsatz, das alle Ports für den Angreifer sperrt, die in der Jail definiert sind. Ein Zugriff auf andere Ports ist aber weiterhin für die IP-Adresse des Angreifers erlaubt. Um eine IP-Adresse eines Angreifers komplett zu sperren, kann iptables-allports anstelle von iptables-multiport verwendet werden.