Fail2ban est un logiciel génial, qui permet de sécuriser un peu plus votre serveur.
Comment ?
Il lit les logs de certains service et bannit les IP qui ont obtenu le plus grand nombre d’échec !
Avec la mutliplication des services comme le login pour administrer votre serveur web, postfix etc…. vous êtes exposé à des risques.
Pour bannir automatique des IP dans un temps donné, c’est Fail2Ban qu’il vous faut !
# dnf install fail2ban
Dans Fail2ban, il y un fichier de conf et des filtres. Les filtres par défaut suffisent, néanmoins vous pouvez en créer pour certains services.
CONFIGURATION
Éditez le fichier de conf de Fail2ban.
# nano /etc/fail2ban/jail.conf
# Fail2Ban configuration file
#
# Author: Cyril Jaquier
#
# $Revision: 747 $
## The DEFAULT allows a global definition of the options. They can be override
# in each jail afterwards.[DEFAULT]
# « ignoreip » can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
# ban a host which matches an address in this list. Several addresses can be
# defined using space separator.
ignoreip = 127.0.0.1 192.168.0.240/28# « bantime » is the number of seconds that a host is banned.
bantime = 600# A host is banned if it has generated « maxretry » during the last « findtime »
# seconds.
findtime = 600# « maxretry » is the number of failures before a host get banned.
maxretry = 3# « backend » specifies the backend used to get files modification. Available
# options are « gamin », « polling » and « auto ». This option can be overridden in
# each jail too (use « gamin » for a jail and « polling » for another).
#
# gamin: requires Gamin (a file alteration monitor) to be installed. If Gamin
# is not installed, Fail2ban will use polling.
# polling: uses a polling algorithm which does not require external libraries.
# auto: will choose Gamin if available and polling otherwise.
backend = auto# This jail corresponds to the standard configuration in Fail2ban 0.6.
# The mail-whois action send a notification e-mail with a whois request
# in the body.[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
sendmail-whois[name=SSH, dest=root, sender=fail2ban@mail.com]
logpath = /var/log/secure
maxretry = 5[dovecot-iptables]
enabled = true
filter = dovecot-pop3imap
action = iptables-multiport[name=dovecot-pop3imap, port= »pop3,pop3s,imap,imaps », protocol=tcp]
sendmail-whois[name=DOVECOT, dest=root, sender=fail2ban@mail.com]
logpath = /var/log/secure
maxretry = 5[proftpd-iptables]
enabled = false
filter = proftpd
action = iptables[name=ProFTPD, port=ftp, protocol=tcp]
sendmail-whois[name=ProFTPD, dest=you@mail.com]
logpath = /var/log/proftpd/proftpd.log
maxretry = 6# This jail forces the backend to « polling ».
[sasl-iptables]
enabled = false
filter = sasl
backend = polling
action = iptables[name=dovecot, port=pop, protocol=tcp]sendmail-whois[name=dovecot, dest=root@samn0.fr]
logpath = /var/log/maillog# Here we use TCP-Wrappers instead of Netfilter/Iptables. « ignoreregex » is
# used to avoid banning the user « myuser ».[ssh-tcpwrapper]
enabled = false
filter = sshd
action = hostsdeny
sendmail-whois[name=SSH, dest=you@mail.com]
ignoreregex = for myuser from
logpath = /var/log/sshd.log# This jail demonstrates the use of wildcards in « logpath ».
# Moreover, it is possible to give other files on a new line.[apache-tcpwrapper]
enabled = false
filter = apache-auth
action = hostsdeny
logpath = /var/log/apache*/*error.log
/home/www/myhomepage/error.log
maxretry = 6# The hosts.deny path can be defined with the « file » argument if it is
# not in /etc.[postfix-tcpwrapper]
enabled = false
filter = postfix
action = hostsdeny[file=/not/a/standard/path/hosts.deny]
sendmail[name=Postfix, dest=you@mail.com]
logpath = /var/log/postfix.log
bantime = 300# Do not ban anybody. Just report information about the remote host.
# A notification is sent at most every 600 seconds (bantime).[vsftpd-notification]
enabled = false
filter = vsftpd
action = sendmail-whois[name=VSFTPD, dest=root@samn0.fr]
logpath = /var/log/vsftpd.log
maxretry = 5
bantime = 1800# Same as above but with banning the IP address.
[vsftpd-iptables]
enabled = true
filter = vsftpd
action = iptables[name=VSFTPD, port=ftp, protocol=tcp]
sendmail-whois[name=VSFTPD, dest=root@samn0.fr]
logpath = /var/log/vsftpd.log
maxretry = 5
bantime = 1800# Ban hosts which agent identifies spammer robots crawling the web
# for email addresses. The mail outputs are buffered.[apache-badbots]
enabled = false
filter = apache-badbots
action = iptables-multiport[name=BadBots, port= »http,https »]
sendmail-buffered[name=BadBots, lines=5, dest=you@mail.com]
logpath = /var/www/*/logs/access_log
bantime = 172800
maxretry = 1# Use shorewall instead of iptables.
[apache-shorewall]
enabled = false
filter = apache-noscript
action = shorewall
sendmail[name=Postfix, dest=you@mail.com]
logpath = /var/log/apache2/error_log# Ban attackers that try to use PHP’s URL-fopen() functionality
# through GET/POST variables. – Experimental, with more than a year
# of usage in production environments.[php-url-fopen]
enabled = false
port = http,https
filter = php-url-fopen
logpath = /var/www/*/logs/access_log
maxretry = 1# A simple PHP-fastcgi jail which works with lighttpd.
# If you run a lighttpd server, then you probably will
# find these kinds of messages in your error_log:
# ALERT â tried to register forbidden variable âGLOBALSâ
# through GET variables (attacker ‘1.2.3.4’, file ‘/var/www/default/htdocs/index.php’)
# This jail would block the IP 1.2.3.4.[lighttpd-fastcgi]
enabled = false
port = http,https
filter = lighttpd-fastcgi
# adapt the following two items as needed
logpath = /var/log/lighttpd/error.log
maxretry = 2# This jail uses ipfw, the standard firewall on FreeBSD. The « ignoreip »
# option is overridden in this jail. Moreover, the action « mail-whois » defines
# the variable « name » which contains a comma using « ». The characters » are
# valid too.[ssh-ipfw]
enabled = false
filter = sshd
action = ipfw[localhost=192.168.0.1]
sendmail-whois[name= »SSH,IPFW », dest=you@mail.com]
logpath = /var/log/auth.log
ignoreip = 168.192.0.1# These jails block attacks against named (bind9). By default, logging is off
# with bind9 installation. You will need something like this:
#
# logging {
# channel security_file {
# file « /var/log/named/security.log » versions 3 size 30m;
# severity dynamic;
# print-time yes;
# };
# category security {
# security_file;
# };
# };
#
# in your named.conf to provide proper logging.
# This jail blocks UDP traffic for DNS requests.[named-refused-udp]
enabled = false
filter = named-refused
action = iptables-multiport[name=Named, port= »domain,953″, protocol=udp]
sendmail-whois[name=Named, dest=you@mail.com]
logpath = /var/log/named/security.logignoreip = 168.192.0.1
# This jail blocks TCP traffic for DNS requests.
[named-refused-tcp]
enabled = false
filter = named-refused
action = iptables-multiport[name=Named, port= »domain,953″, protocol=tcp]
sendmail-whois[name=Named, dest=you@mail.com]
logpath = /var/log/named/security.log
ignoreip = 168.192.0.1
Pour commencer, ignorer les IP pour lesquelles ces règle ne s’applique pas. Localhost et votre réseau locale par exemple.
#ignoreip = 127.0.0.1 192.168.0.240/28
Une Jail se décompose ainsi :
- [LE NOM DE LA REGLE]
- enabled ou disabled
- port (sur lequel le service repose)
- filter (le nom du filtre Fail2ban)
- logpath (le chemin du log afin que Fail2ban l’analyse)
- maxretry (le nombre de fois où une IP peut recommencer
Nous allons donc créer une règle manuellement par exemple WordPress afin de bannir toutes les IP désireuses de se connecter à ma page d’administration.
Règle WORDPRESS
WordPress est géré par Apache, donc les logs de connexions c’est Apache qui les fournit.
Par conséquent, éditez le fichier /etc/fail2ban/jail.conf et ajoutez y ces éléments :
[wordpress]
enabled = true
port = http,https
filter = wordpress
logpath = /var/log/httpd/www.samn0.fr-ssl-access.log
maxretry = 3
On passe donc au filtre WordPress
Filtre WORDPRESS
# nano /etc/fail2ban/filter.d/wordress.conf
#[Definition]
failregex = ^<HOST> -.*POST /wp-login.php HTTP.*
ignoreregex =
En fait dans le filtre, nous mettons les mots clés issus des fichiers de log.
- <HOST> : Adresse IP du visiteur
- /wp-login.php : Page de connexion de WordPress
C’est tout ce que nous avons à éditer.
Nous allons démarrer le service Fail2ban.
# systemctl start fail2ban
Pour vérifier que Fail2ban fonctionne bien, nous allons taper cette commande :
#fail2ban-client status wordpress
Status for the jail: wordpress
|- Filter
| |- Currently failed: 0
| |- Total failed: 843
| `- File list: /var/log/httpd/www.samn0.fr-ssl-access.log
`- Actions
|- Currently banned: 0
|- Total banned: 146
`- Banned IP list:
Je crois que cela parle de lui même, de l’importance que Fail2ban occupe sur votre serveur !