====== Eindringversuche unterbinden mit denyhosts bzw. fail2ban ======
Der Zugriff mittels //ssh// auf einen Server eröffnet Hackern viele Möglichkeiten. Daher wird speziell der Port 22 regelmäßig Ziel von Eindringversuchen. Das Tool //denyhosts// überwacht Zugriffsversuche und sperrt IP-Adressen, die zu häufig abgewiesen werden.
Alternativ kann auch //fail2ban// eingesetzt werden.
Das Tool wird in Ubuntu mit
$ sudo apt install denyhosts
installiert.
Die Standardeinstellungen sind ok, können aber auch in ''/etc/denyhosts.conf'' angepasst werden. Eine Einführung in das Thema bietet [[http://www.christian-hoenick.com/blog/2012/01/10/angreifende-ip-adressen-mit-denyhosts-sperren/|dieser Link]]
Die gesperrten IP Adressen werden in die Datei ''/etc/hosts.deny'' geschrieben.
Informationen zu den gesperrten IP-Adressen können mit ''whois'' oder [[https://ip-info.org|IP Info]] ermittelt werden.
====== Oktober 2017: fail2ban ersetzt denyhosts ======
Leider scheint //denyhosts// nicht weiter entwickelt zu werden. Künftig wird es ist daher notwendig, //fail2ban// näher zu betrachten. Gute Informationen sind in [[https://wiki.ubuntuusers.de/fail2ban/|Ubuntuuser]] und diesem [[https://www.chrissearle.org/2015/06/16/replacing-denyhosts-with-fail2ban-for-debian/|Blog]] zu finden.
Erste Gehversuche auf lion machen einen guten Eindruck von //fail2ban//. Typisches Linux-Tool, aber mit vielen Voreinstellungen.
===== Konfiguration von fail2ban =====
Die Konfiguration von fail2ban wird in ''/etc/fail2ban'' durchgeführt. Alle Dateien mit dem Suffix //.conf// sind vorgegeben und können bei Aktualisierung des Tools überschrieben werden. Eingene Anpassungen werden daher immer in Dateien mit dem Suffix //.local// durchgeführt. Dabei reicht es, nur die Änderungen gegenüber der //.conf// Dateien in den //.local// Dateien zu speichern.
Inforamtionen hierzu sind z. B. in [[https://www.digitalocean.com/community/tutorials/how-to-protect-an-nginx-server-with-fail2ban-on-ubuntu-14-04|How to protect an NGINX Server with fail2ban]]
==== Aktivieren / Erstellen von Jails ====
In fail2ban werden sogenannte Jails erstellt, die log-Files nach Angriffsmustern untersuchen und IP-Adressen sperren, wenn die Muster binnen vorgegebener Zeit n-mal angesprochen werden.
Die Datei ''/etc/fail2ban/jail.conf'' enthält zahlreiche Jails, die allerdings für den jeweiligen Server angepasst freigeschaltet werden müssen. Hierzu dienen die Dateien ''/etc/fail2ban/jail.d/defaults-debian.(conf|local)'', in denen die Vorgaben aus Debian bzw. die eigenen Einstellungen enthalten sind.
Beispiel:
$ cat /etc/fail2ban/jail.d/defaults-debian.local
[sshd]
enabled = true
bantime = 86400
[nginx-http-auth]
enabled = true
[nginx-botsearch]
enabled = true
[nginx-noscript]
enabled = true
port = http,https
filter = nginx-noscript
logpath = /var/log/nginx/access.log
maxretry = 4
In dem Beispiel werden die vorgegebenen Jails [sshd], [nginx-http-auth] und [nginx-botsearch] aktiviert. Mit [nginx-noscript] wird ein eigenes Jail hinzugefügt.
==== Filtereinstellungen ====
Die Filter, nach denen die Log-Files untersucht werden befinden sich in ''/etc/fail2ban/filter.d''. Auch hier werden eigene Einstellungen in //.local// Dateien gespeichert.
$ cat nginx-noscript.local
# fail2ban filter für nginx
[Definition]
failregex = ^ -.*GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi)
ignoreregex =
Vorgegebene Filter können auch erweitert werden, wie z. B. nginx-http-auth
$ nl nginx-http-auth.local
1 # fail2ban filter configuration for nginx
2 [Definition]
3 failregex = ^ \[error\] \d+#\d+: \*\d+ user "\S+":? (password mismatch|was not found in ".*"), client: , server: \S*, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"(, referrer: "\S+")?\s*$
4 ^ \[error\] \d+#\d+: \*\d+ no user/password was provided for basic authentication, client: , server: \S+, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"\s*$
5 ignoreregex =
6 # DEV NOTES:
7 # Based on samples in https://github.com/fail2ban/fail2ban/pull/43/files
8 # Extensive search of all nginx auth failures not done yet.
9 #
10 # Author: Daniel Black
Hier wurde Zeile 4 ergänzt, damit auch Fehlversuche ohne Passwort Eingabe gefiltert werden.
==== fail2ban administrieren ====
fail2ban läuft als Service, daher müssen alle Veränderungen durch einen Restart des Service aktiviert werden.
$ sudo systemctl restart fail2ban
Den Zustand von fail2ban und der Jails kann man mit fail2ban-client ansehen.
$ sudo fail2ban-client status
Status
|- Number of jail: 4
`- Jail list: nginx-botsearch, nginx-http-auth, nginx-noscript, sshd
$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 3
|- Total banned: 3
`- Banned IP list: 35.198.154.247 5.188.10.179 84.139.127.3
$ sudo iptables --list
Chain INPUT (policy ACCEPT)
target prot opt source destination
f2b-nginx-noscript tcp -- anywhere anywhere multiport dports http,https
f2b-nginx-botsearch tcp -- anywhere anywhere multiport dports http,https
f2b-nginx-http-auth tcp -- anywhere anywhere multiport dports http,https
f2b-sshd tcp -- anywhere anywhere multiport dports ssh
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain f2b-nginx-botsearch (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
Chain f2b-nginx-http-auth (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
Chain f2b-nginx-noscript (1 references)
target prot opt source destination
RETURN all -- anywhere anywhere
Chain f2b-sshd (1 references)
target prot opt source destination
REJECT all -- p548B7F03.dip0.t-ipconnect.de anywhere reject-with icmp-port-unreachable
REJECT all -- 5.188.10.179 anywhere reject-with icmp-port-unreachable
REJECT all -- 247.154.198.35.bc.googleusercontent.com anywhere reject-with icmp-port-unreachable
RETURN all -- anywhere anywhere