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