|
|
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt) |
Zeile 1: |
Zeile 1: |
| <div style="text-align=right; float: right; clear: none; background: none; padding-left:20px">
| | Dieses Tutorial wurde nach Gargi.org verschoben: https://www.gargi.org/index.php?title=Firewalling:_iptables_und_Fail2Ban |
| __TOC__
| |
| </div><noinclude>
| |
| ==fail2ban auf Debian Squeeze installieren und konfigurieren==
| |
| Um Bruteforce Attacken auf ssh oder ftp Servern Paroli zu bieten, empfiehlt sich unter anderem der Einsatz von [http://www.fail2ban.org 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.<br>
| |
| <br>
| |
| <br>
| |
| <br>
| |
| Ihr installiert fail2ban über<br>
| |
| <code><pre>apt-get install fail2ban</pre></code>
| |
| Zudem falls noch nicht geschehen das Paket whois:
| |
| <code><pre>apt-get install whois</pre></code>
| |
| Als nächstes kopiert die Konfigurationsdatei '''jail.conf''' nach '''jail.local'''
| |
| <code><pre>cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local</pre></code>
| |
| Danach kann die Datei '''jail.local''' editiert und auf die eigenen Bedürfnisse angepasst werden. Per default ist nur der ssh "scharf" geschaltet.
| |
| <code><pre>nano /etc/fail2ban/jail.local</pre></code>
| |
| Wenn Ihr Euch die Datei anseht, stehen bereits schon entsprechende Sections wie der proftp zur Verfügung. Um eine bestimmte Section zu aktivieren fügt im jeweiligen Bereich Folgendes ein:
| |
| | |
| <code><pre>enabled = true</pre></code>
| |
| | |
| Alternativ gibt es im Unterverzeichnis '''jail.d''' die Datei '''debian_default.conf'''. Dort schreibt zum Aktivieren einzelner zu überwachende Dienste den Dienstnamen in eckige Klammern und den enable Befehl:
| |
| | |
| <code><pre>[proftpd]
| |
| enabled = true
| |
| </pre></code>
| |
| | |
| 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
| |
| <code><pre>bantime = XYZ</pre></code>
| |
| '''XYZ''' in Sekunden<br>
| |
| <br>
| |
| Der Wert maxretry gibt an, ab wieviel Fehlversuche gesperrt wird. 5 bis 6 Fehlversuche gehen in der Regel in Ordnung.<br>
| |
| <br>
| |
| Nach jeder Änderung muss fail2ban neu gestartet werden:
| |
| <code><pre>/etc/init.d/fail2ban restart</pre></code>
| |
| 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 ;-)<br>
| |
| <br>
| |
| 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:
| |
| <code><pre>destemail = meine@email.adresse</pre></code>
| |
| 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.<br>
| |
| <br>
| |
| 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.<br>
| |
| <br>
| |
| Um einen Smarthost einzurichten startet die Konfiguration mit einem
| |
| <code><pre>dpkg-reconfigure exim4-config</pre></code>
| |
| <br>
| |
| ''Folgende Konfigurationsschritte:''<br>
| |
| 1.) Versand über Sendezentrale (Smarthost); '''Empfang mit SMTP oder Fetchmail'''<br>
| |
| <br>
| |
| 2.) Email Name des Systems: '''Lasst einfach den voreingestellten Domänen Name stehen'''<br>
| |
| <br>
| |
| 3.) IP-Adressen, dan denen eingehende SMTP-Verbindungen erwartet werden: '''127.0.0.1'''<br>
| |
| <br>
| |
| 4.) Weitere Ziele, für die die E-Mails angenommen werden sollen: '''Auch hier den default Domän Namen stehen lassen'''<br>
| |
| <br>
| |
| 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.'''<br>
| |
| <br>
| |
| 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!'''
| |
| <br>
| |
| 7.) Lokalen E-Mail Namen in ausgehende Mails verbergen: '''Ja'''<br>
| |
| <br>
| |
| 8.) Sichtbarer Domänennamen für lokalen Benutzer: '''Hier gebt eine Adresse ein, die Ihr besitzt (in der Form meinepage.de)'''<br>
| |
| <br>
| |
| 9.) DNS Anfrage minimieren: '''Nein'''<br>
| |
| <br>
| |
| 10.) Versandart bei lokaler Mailzustellung: '''Mbox Format in /var/mail/'''<br>
| |
| <br>
| |
| 11.) Einstellungen auf kleine Dateien aufteilen: '''Nein'''<br>
| |
| <br>
| |
| 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'''<br>
| |
| <br>
| |
| Hier das Passwort wie folgt hinterlegen:
| |
| <code><pre>IP_des_Mailserver_oder_Name:LOGIN:PASSWORT</pre></code>
| |
| Die Datei sollte nur lesbar für root sein.<br>
| |
| <br>
| |
| Startet danach den MTA neu:
| |
| <code><pre>/etc/init.d/exim4 restart</pre></code>
| |
| Jetzt könnt Ihr auch Mails verschicken.
| |
| <br>
| |
| Danach geben wir noch in der '''/etc/fail2ban/jail.local''' an, dass auch E-Mails verschickt werden sollen. Ändert hierfür die Zeile
| |
| <code><pre>action = %(action_)s</pre></code>
| |
| in
| |
| <code><pre>action = %(action_mwl)s</pre></code>
| |
| Jetzt den fail2ban neu starten:
| |
| <code><pre>/etc/init.d/fail2ban restart</pre></code>
| |
| Nun sollte es nicht mehr lange dauern, bis Ihr eine Mail bekommt.<br>
| |
| <br>
| |
| Die Logfile könnt Ihr an der Konsole mit einem<br>
| |
| <code><pre>tail -f /var/log/fail2ban.log</pre></code>
| |
| überwachen.<br>
| |
| <br>
| |
| Damit ist ein Geschützturm für Euren Server aufgestellt.
| |
| <br>
| |
| <br>
| |
| | |
| ==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:<br>
| |
| <br>
| |
| a) Spezielle IP Nummern sperren (Blacklisting)<br>
| |
| b) Alle Ports dicht machen<br>
| |
| c) Spezielle Ports öffnen<br>
| |
| <br>
| |
| Zuerst legen wir unsere Blacklistdatei an:<br>
| |
| <code><pre>touch /usr/local/etc/blacklist.txt</pre></code>
| |
| Solltet Ihr bereits IP Nummern haben, denen Ihr generell den Zugriff verwehren wollt, dann schreibt diese in die Blacklist Datei einfach untereinander rein.<br>
| |
| <br>
| |
| Zu einer Blacklist gehört natürlich auch eine Whitelist:<br>
| |
| <code><pre>touch /usr/local/etc/whitelist.txt</pre></code>
| |
| Hier kommen die IP Nummern rein, die nicht geblockt werden sollen, also immer Zugriff haben werden.<br>
| |
| <br>
| |
| Dann legen wir unter '''/etc/init.d/''' unser Firewallscript an:<br>
| |
| <code><pre>touch /etc/init.d/firewall</pre></code>
| |
| Das machen wir ausführbar:
| |
| <code><pre>chmod +x /etc/init.d/firewall</pre></code>
| |
| Wir editieren nun das Skript mit
| |
| <code><pre>nano /etc/init.d/firewall</pre></code>
| |
| und füllen die Datei mit folgenden Inhalt:
| |
| <code><pre>
| |
| #!/bin/sh
| |
| ### BEGIN INIT INFO
| |
| # Provides: custom firewall
| |
| # Required-Start: $remote_fs $syslog $network
| |
| # Required-Stop: $remote_fs $syslog $network
| |
| # Default-Start: 2 3 4 5
| |
| # Default-Stop: 0 1 6
| |
| # Short-Description: firewall initscript
| |
| # Description: Custom Firewall, placed in /etc/init.d.
| |
| # script written by Gargi 2009 http://www.gargi.org
| |
| ### END INIT INFO
| |
| | |
| #needed modules
| |
| modprobe ip_conntrack_ftp
| |
| | |
| BLACKLIST=/usr/local/etc/blacklist.txt
| |
| WHITELIST=/usr/local/etc/whitelist.txt
| |
| | |
| #PORTDESCRIPTION
| |
| #21:FTP 22:SSH 25:SMTP 53:DNS 80:HTTP 443:HTTPS 123:NTP
| |
| | |
| #trigger for your ports
| |
| IN_ALLOWED_TCP="21 22 25 53 80 443"
| |
| OUT_ALLOWED_TCP="21 22 25 53 80 443"
| |
| IN_ALLOWED_UDP="53 123"
| |
| OUT_ALLOWED_UDP="53 123"
| |
| 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 $1}'`; do
| |
| echo "Blocking $x..."
| |
| iptables -A INPUT -t filter -s $x -j DROP
| |
| done
| |
| | |
| # Allow whitelisted IPs
| |
| for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
| |
| echo "Allowing $x..."
| |
| iptables -A INPUT -t filter -s $x -j ACCEPT
| |
| 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
| |
| </pre></code>
| |
| 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:
| |
| <code><pre>cd /etc/init.d
| |
| update-rc.d firewall defaults</pre></code>
| |
| 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:
| |
| <code><pre>/etc/init.d/firewall restart</pre></code>
| |
| Hierbei wird zudem jedes Mal auch der Fail2ban neu gestartet. Um zu sehen, welche Regeln vorliegen ruft einfach
| |
| <code><pre>iptables -L -v</pre></code>
| |
| auf.<br>
| |
| <br>
| |
| [[Bild:firewall.jpg|Firewall beim Start]]<br>
| |
| ''Gargi's Skript beim Systemstart''<br><br>
| |
| | |
| ==Portforwarding==
| |
| | |
| Wenn von außen ein anderer Port als der Dienst es standardmäßig vorsieht, der Server aber den Port unbeding behalten muss, dann kann man auch recht einfach auf der gleichen Maschine ein Portforwarding mittels den iptables einrichten. Wir möchten beispielsweise den Port 180 auf den HTTP Port 80 legen, sodass beispielsweise am Router der Port 180 freigegeben werden kann und dieser dann auf den Server auf Port 80 geschoben wird. Fügt in das Script dann folgende Zeile ein:
| |
| | |
| <code><pre>iptables -t nat -A PREROUTING -p tcp --dport 180 -j REDIRECT --to-ports 80</pre></code>
| |
| <br><br>
| |
| | |
| ==Port für spezielle Hardware MAC freigeben==
| |
| | |
| Möchtet Ihr, dass nur spezielle Rechner Zugriff auf einen Port haben sollen, dann kann das in den Sript auch einfach integriert werden. Wir wollen, dass zwei Rechner im Netz auf ssh Zugriff haben, sonst niemand. Schreibt dazu oben in das Script folgende Variable, in der Ihr dann alle MAC Adressen erfasst:
| |
| | |
| <code><pre>MAC_SSH="12:12:12:EE:EE:EE 23:23:23:23:CC:CC"</pre></code>
| |
| (die MACs natürlich entsprechend ändern)
| |
| <br /><br />
| |
| In das Script weiter unten dann die Schleifen zusätzlich einbauen:
| |
| | |
| <code><pre> # TCP rules in by MAC
| |
| for mac in $MAC_SSH; do
| |
| echo "Accepting device $mac on ssh"
| |
| iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source $mac -j ACCEPT
| |
| done</pre></code>
| |
| | |
| Startet danach Eure Firewall neu.
| |
| <br><br>
| |
| ==Fail2ban : wie man einen Ban aufhebt==
| |
| Wenn Ihr Euch ausgesperrt habt und Ihr möchtet den Ban aufheben, dann geht wie folgt vor. Z.B. ist beim Einloggen in den FTP der Ban passiert. Lasst Euch dann die '''IPTABLES''' anzeigen:
| |
| <code><pre>
| |
| iptables -L</pre></code>
| |
| Jetzt sucht den Bereich, wo Eure IP auftaucht. Z.B.:
| |
| | |
| <code><pre>
| |
| Chain fail2ban-proftpd (1 references)
| |
| target prot opt source destination
| |
| DROP all -- 192.168.1.2 anywhere
| |
| RETURN all -- anywhere anywhere</pre></code>
| |
| Das erste, was gedroppt wird ist dann die gesuchte IP Nummer. Diese steht sozusagen in der ersten Drop Zeile des Abschnittes. Es könnten da theoretisch mehr IPs stehen, dann zählt die entsprechende Zeile ab. In unserem Beispiel ist es die Zeile 1.
| |
| <br><br>
| |
| Dann gebt folgendes ein:
| |
| | |
| <code><pre>
| |
| iptables -D fail2ban-proftpd 1</pre></code>
| |
| Die 1 am Ende bedeutet eben die IP in der ersten Dropzeile. Jetzt solltet Ihr wieder zugreifen können.
| |
| <br><br>
| |
| Bei einem Restart des fail2ban kann es aber bei manchen Jail-Arten sein, dass eine IP wieder auf die Banliste gelangt, wenn eine entsprechende log Datei eingelesen wird. Hier muss dann die betroffene Log-Datei bearbeitet werden.
| |
| <br><br>
| |
| ==Version 0.8.6 : htaccess Fehlversuche werden nicht gebannt==
| |
| Falls Fehlversuche auf einen htaccess (Apache Webserver) nicht gebannt werden, kann es sein, dass die '''apache-auth.conf''' bearbeitet werden muss:
| |
| <code><pre>nano /etc/fail2ban/filter.d/apache-auth.conf</pre></code>
| |
| Kommentiert die folgende Zeile aus:<br><br>
| |
| '''failregex = ^%(_apache_error_client)s user .* (authentication failure|not found|password mismatch)\s*$'''<br><br>
| |
| in<br><br>
| |
| '''# failregex = ^%(_apache_error_client)s user .* (authentication failure|not found|password mismatch)\s*$'''<br><br>
| |
| Setzt dafür folgende Zeilen darunter ein:
| |
| <code><pre>failregex = ^%(_apache_error_client)s user .* authentication failure for "\S*": Password Mismatch$
| |
| ^%(_apache_error_client)s user .* not found: \S*\s*$</pre></code>
| |
| Speichert die Änderung ab und startet den '''fail2ban''' neu durch.
| |
| <br><br>
| |
| | |
| ==fail2ban versendet Mails mit Datum 1.1.1970==
| |
| Falls fail2ban anfängt, Mails mit dem Datum 1.1.1970 zu verschicken, dann könnt Ihr den Fehler wie folgt beheben:
| |
| | |
| Editiert die '''/etc/init.d/fail2ban''' und fügt als erstes nach dem Info Bereich folgende Zeile ein:
| |
| | |
| <code><pre>export LC_TIME=C</pre></code>
| |
| | |
| Startet danach den fail2ban neu:
| |
| | |
| <code><pre>/etc/init.d/fail2ban restart</pre></code>
| |
| | |
| Oder mit dem kompletten Firewallscript
| |
| | |
| <code><pre>/etc/init.d/firewall restart</pre></code>
| |
| | |
| Die Stopp Meldungen kommen noch mit dem falschen Datum, die Startmeldung wieder mit dem korrekten.
| |
| | |
| <br><br>
| |
| Viele Grüße!<br>
| |
| Pierre "Gargi" Kretschmer
| |