Bonjour à tous

Dans tous ce que je dois faire, et que je ne fais jamais le temps de faire, j’ai priorisé certains points comme les aspects sécurités dans un premier temps.

Fail2ban lit les logs de divers serveurs (SSH, Apache, FTP…) à la recherche d’erreurs d’authentification répétées et ajoute une règle iptables pour bannir l’adresse IP de la source.

Niveau installation rien de plus simple :

aptitude install fail2ban

Puis tout ce passe dans le dossier /etc/fail2ban, voyons maintenant la configuration :

  • Un fichier /etc/fail2ban/fail2ban.conf incluant les paramètres de log et de socket entre autre de fail2ban en lui même.
  • Un dossier /etc/fail2ban/action.d contenant les fichiers des actions en cas de bannissement.
  • Un dossier /etc/fail2ban/filter.d contenant les différents filtres pour les règles de filtrages.
  • Un fichier /etc/fail2ban/jail.conf contenant les paramètre principaux.

Ces deux derniers qui vont devoir être modifiés pour être adapté aux besoins de chacun.

Nous allons dans un premier temps rajouter de nouveaux filtres dans le dossier /etc/fail2ban/filter.d pour pouvoir gérer différents bannissements non connu par défaut par fail2ban.

Pour la protection des attaques contre la plus connue des interfaces de management de MySQL : apache-phpmyadmin

vi /etc/fail2ban/filter.d/apache-phpmyadmin.conf

# Fail2Ban configuration file
# Bans bots scanning for non-existing phpMyAdmin installations on your webhost.
[Definition]
failregex = [[]client []] File does not exist: .*(PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|
                                                  mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|myadmin2)
ignoreregex =

Pour la protection des attaques d’un scanner de failles qui s’appelle Dfind. : apache-w00tw00t

vi /etc/fail2ban/filter.d/apache-w00tw00t.conf

[Definition]
failregex = ^ -.*"GET \\/w00tw00t\\.at\\.ISC\\.SANS\\.DFind\\:\\).*".*

Dans un second temps nous allons configurer le fichier principal de fail2ban : /etc/fail2ban/jail.conf

# The DEFAULT allows a global definition of the options. They can be override in each jail afterwards.

[DEFAULT]

ignoreip = 127.0.0.1 xxx.xxx.xxx.xxx yyy.yyy.yyy.yyy
bantime  = 86400
maxretry = 3
backend = polling
destemail = log@domaine.com

# ACTIONS

banaction = iptables-multiport
mta = sendmail
protocol = tcp

action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
              %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s]
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
               %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s]
action = %(action_mwl)s

# JAILS

[ssh]

enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 2

[pam-generic]

enabled = false filter = pam-generic port = all banaction = iptables-allports port = anyport logpath = /var/log/auth.log maxretry = 3

[xinetd-fail]

enabled = false filter = xinetd-fail port = all banaction = iptables-multiport-log logpath = /var/log/daemon.log maxretry = 2

[ssh-ddos]

enabled = true port = ssh filter = sshd-ddos logpath = /var/log/auth.log maxretry = 3 # HTTP servers

[apache]

enabled = true port = http,https filter = apache-auth logpath = /var/log/apache*/*error.log maxretry = 3

[apache-multiport]

enabled = true port = http,https filter = apache-auth logpath = /var/log/apache*/*error.log maxretry = 3

[apache-noscript]

enabled = true port = http,https filter = apache-noscript logpath = /var/log/apache*/*error.log maxretry = 3

[apache-overflows]

enabled = true port = http,https filter = apache-overflows logpath = /var/log/apache*/*error.log maxretry = 2

[apache-phpmyadmin]

enabled = true port = http,https filter = apache-phpmyadmin logpath = /var/log/apache*/*error.log maxretry = 2

[apache-w00tw00t]

enabled = true filter = apache-w00tw00t action = iptables[name=Apache-w00tw00t,port=80,protocol=tcp] logpath = /var/log/apache2/users/*access*.log maxretry = 1 # FTP servers

[vsftpd]

enabled = false port = ftp,ftp-data,ftps,ftps-data filter = vsftpd logpath = /var/log/vsftpd.log maxretry = 6

[proftpd]

enabled = true port = ftp,ftp-data,ftps,ftps-data filter = proftpd logpath = /var/log/auth.log maxretry = 6

[wuftpd]

enabled = false port = ftp,ftp-data,ftps,ftps-data filter = wuftpd logpath = /var/log/auth.log maxretry = 6 # Mail servers

[postfix]

enabled = true port = smtp,ssmtp filter = postfix logpath = /var/log/mail.log

[couriersmtp]

enabled = true port = smtp,ssmtp filter = couriersmtp logpath = /var/log/mail.log

[courierauth]

enabled = true port = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s filter = courierlogin logpath = /var/log/mail.log

[sasl]

enabled = true port = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s filter = sasl logpath = /var/log/mail.log # DNS Servers

[named-refused-udp]

enabled = false port = domain,953 protocol = udp filter = named-refused logpath = /var/log/named/security.log

[named-refused-tcp]

enabled = false port = domain,953 protocol = tcp filter = named-refused logpath = /var/log/named/security.log

Utilisant un panel ISPCP sur un de mes serveurs j’ai du adapter les fichiers de logs et remplacer

/var/log/apache*/*error.log par /var/log/apache2/users/*error.log

et

/var/log/proftpd/proftpd.log par /var/log/auth.log

Sur un autre frontal, j’utilise NGINX et j’ai aussi adapter le filtrage avec les règles suivantes :

[nginx]
enabled = true
port    = http,https
filter  = apache-auth
logpath = /var/log/nginx*/*error.log
maxretry = 3

[nginx-noscript]

enabled = true port = http,https filter = apache-noscript logpath = /var/log/nginx*/*error.log maxretry = 3

[nginx-overflows]

enabled = true port = http,https filter = apache-overflows logpath = /var/log/nginx*/*error.log maxretry = 2

Ne pas oublier de relancer le tout

/etc/init.d/fail2ban restart

Pour vérifier que tout fonctionne bien et que le serveur est bien lancé, on peut effectuer la commande :

fail2ban-server status
2011-11-18 19:39:24,736 fail2ban.server : INFO   Starting Fail2ban v0.8.4
2011-11-18 19:39:24,737 fail2ban.server : INFO   Starting in daemon mode

Pour voir les jails actifs on utilise la commande :

fail2ban-client status
Status
|- Number of jail:    13
`- Jail list:        apache-w00tw00t, apache-noscript, postfix, ssh-ddos, apache-multiport, apache-overflows,
            couriersmtp, ssh, sasl, apache, courierauth, proftpd, apache-phpmyadmin

Pour voir les ip qui sont bannies via un jail par exemple le ssh dans notre cas, on exécute la commande :

fail2ban-client status ssh
Status for the jail: ssh
|- filter
|  |- File list:    /var/log/auth.log
|  |- Currently failed:    0
|  `- Total failed:    28
`- action
   |- Currently banned:    4
   |  `- IP list:    1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4
   `- Total banned:    11

Tout les autres options disponibles sont visibles via la commande :

fail2ban-client

A l’utilisation on se rends compte qu’il y a énormément de tentative de connexion non désirées sur les frontaux.

Pour information, j’utilise Munin pour mal de graph de mes systèmes, un plugin pour fail2ban est intégré à la dernière version.

Pour sa mise en place rien de plus simple, je vous donne les trois modifications à apporter à votre serveur :

ln -s /usr/share/munin/plugins/fail2ban /etc/munin/plugins/

Ajouter les deux lignes dans le fichier /etc/munin/plugin-conf.d/munin-node

[fail2ban]
user root

Et enfin relancer le node sur le serveur en question :

/etc/init.d/munin-node restart

Ci dessous un exemple de graph généré par Munin pour le service fail2ban.

munin_fail2ban

Merci de votre lecture et à bientôt pour un nouvel article.