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.