iptables – Finn Christiansen https://blogarchive.finnchristiansen.de Softwareentwickler mit einer Vorliebe für freie Software und GNU / Linux Sat, 08 Dec 2018 16:50:58 +0000 de-DE hourly 1 https://wordpress.org/?v=5.1.1 https://blogarchive.finnchristiansen.de/wp-content/uploads/2017/01/cropped-FinnsBlog512-32x32.png iptables – Finn Christiansen https://blogarchive.finnchristiansen.de 32 32 Brute Force Angriffe mit Fail2Ban abwehren https://blogarchive.finnchristiansen.de/2016/04/26/brute-force-angriffe-mit-fail2ban-abwehren/ https://blogarchive.finnchristiansen.de/2016/04/26/brute-force-angriffe-mit-fail2ban-abwehren/#comments Tue, 26 Apr 2016 16:47:29 +0000 https://www.finnchristiansen.de/?p=102 Continue reading ]]> Wie ich in einem vorherigen Beitrag ja bereits erwähnt hatte, ist eine (Software-) Firewall ein wichtiges Werkzeug, mit dem die Sicherheit eines Linux Servers erhöht werden kann. Problematisch sind aber Dienste, die generell für alle aus dem Internet verfügbar sein müssen, wie beispielsweise Mail- und Web-Dienste. Oft kann ein Angreifer tage- oder gar wochenlang automatisiert und systematisch Passwörter für beispielsweise einen SSH Zugang oder ein E-Mail Konto durchprobieren. Abhilfe schafft hier Fail2Ban, welches nach fehlerhaften Anmeldeversuchen in Log-Dateien sucht und bei einem Fund die entsprechende IP Adresse mit Hilfe der Firewall sperrt.

Installation

Unter Debian 8 Jessie ist die Installation leicht und es sind bereits ebenfalls viele nützliche Filter vorhanden:

# Installation
apt-get install fail2ban
# In das Konfigurationsverzeichnis wechseln
cd /etc/fail2ban
# Die Standard-Konfiguration jail.conf studieren
vim jail.conf
# oder mit more 
more jail.conf 
# jail.local für eigene Einstellungen im nächsten Schritt anlegen
touch jail.local

Konfiguration

Die Standard-Konfigurationsdatei jail.conf sollte aufgrund späterer Paketaktualisierungen nicht verändert werden, stattdessen wird eine jail.local angelegt, in der Parameter überschrieben und neue hinzugefügt werden können. Meine jail.local auf dem Mail-Server sieht so aus:

[DEFAULT]
ignoreip = 127.0.0.1/8
bantime  = 86400
findtime = 600
maxretry = 3

[ssh-ddos]
enabled  = true
port     = ssh
filter   = sshd-ddos
logpath  = /var/log/auth.log
maxretry = 6

[postfix]
enabled  = true
port     = smtp,ssmtp,submission
filter   = postfix
logpath  = /var/log/mail.log

[dovecot]
enabled = true
port    = smtp,ssmtp,submission,imap2,imap3,imaps,pop3,pop3s
filter  = dovecot
logpath = /var/log/mail.log

Roundcube und Apache Filter

Wenn in 10 Minuten (findtime) 3 Zeilen mit fehlerhaften Login (maxretry) gefunden wurden, wird die entsprechende IP Adresse für einen Tag (bantime) blockiert. Auf dem Webserver verwende ich andere Regeln, u.a.:

[roundcube-auth]
enabled  = true
filter   = roundcube-auth
port     = http,https
logpath  = /var/log/apache2/webmail.pimux.de_access.log

[apache]
enabled  = true
port     = http,https
filter   = apache-auth
logpath  = /var/log/apache*/*error.log
maxretry = 6

Die Webmail Anwendung Roundcube läuft bei mir nicht auf dem Mail-, sondern auf dem etwas schnelleren Webserver, weshalb ich diese Regel an dieser Stelle verwende.

WordPress Filter

Auch für WordPress lässt sich ein Filter implementieren, allerdings ist die Log-Datei des Webservers nicht aussagekräftig genug. Deswegen muss für die jeweilige WordPress Installation noch das Plugin WP fail2ban installiert werden. Anschließend müssen die Zwei Filter-Dateien noch nach in das Fail2Ban Verzeichnis kopiert werden:

# Pfad zur Wordpress Installation muss natürlich entsprechend angepasst werden
cp /var/www/wordpress/wp-content/plugins/wp-fail2ban/wordpress-*.conf /etc/fail2ban/filter.d/

Nun müssen die Filter noch in der jail.local aktiviert werden:

[wordpress-hard]
enabled  = true
filter   = wordpress-hard
logpath  = /var/log/auth.log
port     = http,https
maxretry = 1

[wordpress-soft]
enabled  = true
filter   = wordpress-soft
logpath  = /var/log/auth.log
port     = http,https
maxretry = 3

Bedienung

Für die Bedienung von Fail2Ban kommt man mit wenigen Kommandos gut zurecht:

# Jails anzeigen
fail2ban-client status
# Den Status des Postfix Jails anzeigen (u.a. gesperrte IPs anzeigen)
fail2ban-client status postfix
# Eine IP des Postfix Jails entsperren
fail2ban-client set postfix unbanip 192.168.1.23

Wenn die Konfiguration erledigt ist, muss Fail2Ban noch einmal mit 

systemctl restart fail2ban
  neugestartet werden. Funde und Sperrungen kann man in der 
/var/log/fail2ban.log
  finden.

]]>
https://blogarchive.finnchristiansen.de/2016/04/26/brute-force-angriffe-mit-fail2ban-abwehren/feed/ 3
Firewallkonfiguration unter Debian und Ubuntu mit IPTables https://blogarchive.finnchristiansen.de/2016/04/24/firewallkonfiguration-unter-debian-und-ubuntu-mit-iptables/ https://blogarchive.finnchristiansen.de/2016/04/24/firewallkonfiguration-unter-debian-und-ubuntu-mit-iptables/#comments Sun, 24 Apr 2016 08:50:39 +0000 https://www.finnchristiansen.de/?p=70 Continue reading ]]> Häufig sehe ich Server, die gar keine Firewall verwenden. In einem kleinen internen Netz mag das vielleicht noch vertretbar sein, aber spätestens wenn der Server öffentlich erreichbar ist, sollte man sich Gedanken um eine Firewall machen. Für viele ist das zwar selbstverständlich ein alter Hut, aber viele Dienste laufen gedankenlos auf der Listen-Adresse 0.0.0.0 bzw. :: und sind damit bei Verwendung einer öffentlichen IP-Adresse oder NAT ohne Firewall für jedermann erreichbar.

Um die IPTables Firewall unter Debian oder Ubuntu zu konfigurieren, verwende ich iptables-persistent. Die Firewall-Regeln werden dabei in Textdateien gespeichert und beim Starten geladen. Nach der Installation von iptables-persistent besteht die Möglichkeit, bereits vorhandene Regeln zu speichern, was zu empfehlen ist, da somit schon eine grundlegende Konfiguration erstellt wird. Die Installation selbst ist simpel:

apt-get intall iptables-persistent

Anschließend wird jeweils eine Datei für IPv4 und IPv6 angelegt. Anbei eine einfache Beispielkonfiguration, die entsprechend den eigenen Bedürfnissen erweitert werden kann:

# Generated by iptables-save v1.4.21 on Mon Mar  7 18:13:53 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT

# SSH
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

# HTTP(S)
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

# NRPE (monitoring)
-A INPUT -p tcp -m state --state NEW -m tcp --dport 5666 -s 78.46.251.28/32 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Mon Mar  7 18:13:53 2016

Die Ketten INPUT, FORWARD und OUTPUT akzeptieren standardmäßig alle Verbindungen. Eingehender, zu anderen Verbindungen gehörender Verkehr (RELATED,ESTABLISHED) wird ebenfalls durchgelassen. Ebenso werden ICMP Pakete (Ping, -p icmp) aktzeptiert und auch Verbindungen zum lokalen Loopback Interface.

Dann werden die TCP Ports 22, 80 und 443 akzeptiert. Der Port 5666, auf welchem der NRPE Dienst hört, soll nur von einer IP Adresse erreichbar sein. Anschließend werden alle nicht vorher definierten eingehende und weiterzuleitende Verbindungen abgelehnt (-j REJECT –reject with icmp-host-prohibited). Alternativ können diese Zeilen entfernt werden, falls man die INPUT und FORWARD Kette standardmäßig auf REJECT stellt. Im Falle eines Fehlers in der Konfiguration ist es aber dann notwendig, physikalischen Zugriff auf den Server zu haben, da eventuell alle Verbindungen abgelehnt werden. Die Art der Konfiguration ist aber Geschmackssache, das Ergebnis ist gleich.

Für IPv6 sollen normalerweise etwa die gleichen Regeln gelten, ein paar Parameter (natürlich IPv6 anstatt IPv4 Adressen verwenden oder icmp6-adm-prohibited statt icmp-host-prohibited) müssen aber ausgetauscht werden. Das Ergebnis ist vergleichbar:

# Generated by iptables-save v1.4.21 on Mon Mar  7 18:13:53 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT

# SSH
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

# HTTP(S)
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

# NRPE
-A INPUT -p tcp -m state --state NEW -m tcp --dport 5666 -s 2a01:4f8:c17:34ab::2/128 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp6-adm-prohibited
-A FORWARD -j REJECT --reject-with icmp6-adm-prohibited
COMMIT
# Completed on Mon Mar  7 18:13:53 2016

Diese Regeln sind recht schlicht, aber schon ein sehr brauchbarer Anfang. Zusätzlich können noch ausgehende Verbindungen eingeschränkt werden, falls dies gewünscht ist. Spätestens wenn Datenbanken oder ähnlich sensible Dienste über Netzgrenzen hinweg erreichbar sein sollen, sollte definitiv zumindest irgendeine Art Firewall eingesetzt werden.

]]>
https://blogarchive.finnchristiansen.de/2016/04/24/firewallkonfiguration-unter-debian-und-ubuntu-mit-iptables/feed/ 2