====== 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