nftables und fail2ban

Um dieses Tutorial durchzuführen, braucht ihr ein aktuelles Debian, welches mit dem Internet verbunden ist. Ebenso solltet ihr bereits eine gewisse Erfahrung auf der Kommandozeile haben.

Achtung bei Fehlern kann es passieren, dass ihr euch aus eurem System aussperrt. Link zu Überschrift

Wenn ihr einen Server an Netz bringt, also mit dem Internet verbindet, dann sollte dieser entsprechend abgesichert sein. Dies gilt immer, jedoch vor allem, wenn ihr euch mittels ssh mit dem Server verbindet oder dieser als Webserver dient. Im Folgenden wird davon ausgegangen, dass der Server mittels ssh (Port 22) erreichbar sein soll und als Webserver dient.

Zu Beginn wird fail2ban und nftables installiert:

sudo apt install fail2ban nftables rsyslog

Nun kümmern wir uns um fail2ban. Dieser Dienst dient als Schutz gegen Brute-Force Angriffe. Dennoch sollte euer Passwort sicher sein!

Als erstes setzen wir den Dienst auf enable und aktivieren ihn:

sudo systemctl enable fail2ban 
sudo systemctl start fail2ban 

Dies sollte ohne Fehler durchlaufen. Nun kann fail2ban konfiguriert werden:

sudo vim /etc/fail2ban/jail.local 

Als vernünftiger Defaultwert können folgende Einstellungen genutzt werden:

# file:/etc/fail2ban/jail.local
#
# See jail.conf(5) man page for more information

# Comments: use '#' for comment lines and ';' (following a space) for inline comments


# The DEFAULT allows a global definition of the options. They can be overridden
# in each jail afterwards.

[DEFAULT]

# "ignoreself" specifies whether the local resp. own IP addresses should be ignored
# (default is true). Fail2ban will not ban a host which matches such addresses.
#ignoreself = true

# "ignoreip" can be a list of IP addresses, CIDR masks or DNS hosts. Fail2ban
# will not ban a host which matches an address in this list. Several addresses
# can be defined using space (and/or comma) separator.
ignoreip = 127.0.0.1/8 ::1

# "bantime" is the number of seconds that a host is banned.
bantime  = 10m

# A host is banned if it has generated "maxretry" during the last "findtime"
# seconds.
findtime  = 10m

# "maxretry" is the number of failures before a host get banned.
maxretry = 5

# Default banning action (e.g. iptables, iptables-new,
# iptables-multiport, shorewall, etc) It is used to define
# action_* variables. Can be overridden globally or per
# section within jail.local file
banaction = nftables-multiport
banaction_allports = nftables-allports

# JAILS

# SSH servers
[sshd]

enabled = true

# To use more aggressive sshd modes set filter parameter "mode" in jail.local:
# normal (default), ddos, extra or aggressive (combines all).
# See "tests/files/logs/sshd" or "filter.d/sshd.conf" for usage example and details.
mode   = ddos
port    = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s

Zusätzlich sollte in action.d folgende Datei angelegt werden:

sudo vim /etc/fail2ban/action.d/nftables-common.local

Dort wird folgender Inhalt hinterlegt:

[Init]
table = f2b
blocktype = drop

Dies wird für die Kombination von fail2ban und nftables gebraucht. Damit ist die Konfiguration von fail2ban abgeschlossen.

Als nächstes folgt nftables, welche als Firewall den Server absichert:

sudo systemctl enable nftables 
sudo vim /etc/nftables.conf

Als vernünftiger Defaultwert können folgende Einstellungen genutzt werden:

#!/usr/sbin/nft -f

flush ruleset

table inet filter {

	chain input {
		type filter hook input priority filter; policy drop;

		ct state { established, related } counter accept
			ct state invalid drop

			iifname "lo" counter accept
			ip protocol icmp counter accept

			tcp dport { 443, 80 } counter accept comment "HTTP/S all"
			tcp dport {22} counter accept comment "SSH all"
	}

	chain forward {
		type filter hook forward priority filter; policy drop;
	}

	chain output {
		type filter hook output priority filter; policy accept;
		tcp dport 25 counter drop comment "Drop SMTP over port 25"
	}


}

Durch diese Einstellungen werden die Ports 443, 80 und 22 freigegeben und im Output der Port 25 explizit gesperrt. So kann der Server nicht als Mailer missbraucht werden.

Als letztes wird der Server dagegen abgesichert, dass der root user sich mittels Passwort anmelden kann:

sudo vim /etc/ssh/sshd_config

Als Wert sollte PermitRootLogin prohibit-password hinterlegt sein.

Nun können alle Dienste einmal neugestartet werden:

sudo systemctl restart fail2ban
sudo systemctl restart nftables
sudo systemctl restart sshd

Überprüft werden kann dies abschließend mittels:

sudo nft list ruleset 

Nun sollten die Firewallregeln ausgegeben werden. Durch fail2ban gebannte IPs werden in table inet f2b angezeigt.

fail2ban sollte über sudo fail2ban-client status sshd eine annähernd ähnliche Ausgabe liefern:

Status for the jail: sshd
|- Filter
|  |- Currently failed:	6
|  |- Total failed:	3757
|  `- File list:	/var/log/auth.log
`- Actions
   |- Currently banned:	0
   |- Total banned:	510
   `- Banned IP list: 

Wie zu sehen, werden gebannte IPs angezeigt. In diesem Beispiel sind 510 IPs jemals gebannt worden (in 2 Tagen), dies zeigt, wieso diese Dienste so wichtig sind.