A quoi sert cette page ?

Toute personne ayant un serveur dédié a été confrontée à ce problème : des attaques provenant de kevin ou de machines zombies..
Toutes ces attaques ont pour concéquence de nombreuses lignes de logs et une occupation cpu/memoire/bande passant dont on pourrait bien se passer.
Fail2Ban est un outil qui analyse les logs en permanance, et quand il détecte un nombre important de répétitions met en place une rêgle IPTABLE.
Nous verrons ici le moyen de proteger SSH, Apache(2) diverses attaques, Postfix..
Prérequis
Cette version du document permet de faire fonctionner la version fail2ban 0.7 dans débian Etch.. on peut installer la version 0.8 (version backportée)
- Un Serveur avec Debian
- Une connection internet
- Les différents services à protéger
- Optionnel : une machine rebond pour permettre de reprendre la main sur le serveur en cas de déclanchement de la protection contre soi-même
La préparation
Installer fail2ban
aptitude install fail2ban
Organisation générale
Les fichiers de config se trouvent dans /etc/fail2ban
4 éléments :
- fail2ban.conf : le fichier de configuration général
- jail.conf : le parametrage des différents services à proteger
- filter.d : repertoire contenant les motifs à détecter dans les fichiers de logs (par services)
- action.d : repertoire contenant les diférentes actions à entreprendre
Configuration générale
On trouve dans ce fichier tout ce qui est en rapport avec le deamon fail2ban. (logs, socket, notifications mails..)
Fichier /etc/fail2ban/fail2ban.conf
#
# Author: Cyril Jaquier
#
# $Revision: 412 $
#
[Definition]
# Option: loglevel
# Notes.: Set the log level output.
# 1 = ERROR
# 2 = WARN
# 3 = INFO
# 4 = DEBUG
# Values: NUM Default: 3
#
loglevel = 3
# Option: logtarget
# Notes.: Set the log target. This could be a file, SYSLOG, STDERR.
# Values: STDERR SYSLOG file Default: /var/log/fail2ban.log
#
logtarget = /var/log/fail2ban.log
# Option: socket
# Notes.: Set the socket file. This is used to communication with the
# daemon.
# Values: FILE Default: /tmp/fail2ban.sock
#
socket = /tmp/fail2ban.sock
j'ai laissé par défaut les paramettres de logs et socket qui fonctionnent très bien.
# Option: enabled
# Notes.: enable mail notification when banning an IP address.
# Values: [true | false] Default: false
#
enabled = true
# Option: host
# Notes.: host running the mail server.
# Values: STR Default: localhost
#
host = localhost
# Option: port
# Notes.: port of the mail server.
# Values: INT Default: 25
#
port = 25
# Option: user
# Notes.: the username for smtp-server if authentification is required.
# if user is empty, no authentification is done.
# Values: STR Default:
#
user =
#
# Option: password
# Notes.: the smtp-user's password if authentification is required.
# Values: STR Default:
#
password =
Normalement si votre serveur est correctement paramétré, il autorise l'envoi de mail à partir de lui-même sans nécéssiter d'authentification.
# Notes.: e-mail address of the sender.
# Values: MAIL Default: fail2ban
#
from = root@domain.com
# Option: to # Notes.: e-mail addresses of the receiver. Addresses are space
# separated.
# Values: MAIL Default: root
#
to = root
Les mails d'origine et destination doivent être modifiés
Dans mon cas, je laisse root en destination ayant un alias qui redirige tout ce qui va pour root vers ma boite perso
# Notes.: report local time (including timezone) or GMT
# Values: [true | false] Default: false
#
localtime = true
# Option: subject
# Notes.: subject of the e-mail.
# Tags: <section< active section (eg ssh, apache, etc)
# <ip> IP address
# <failures> number of failures
# <failtime> unix timestamp of the last failure
# Values: TEXT Default: [Fail2Ban] <section>: Banned <ip>
#
subject = [Fail2Ban - server] <section>: Banned <ip>
j'ai aussi modifié l'objet du mail pour facilité le fitrage automatique dans ma boite mail
# Option: message
# Notes.: message of the e-mail.
# Tags: <section< active section (eg ssh, apache, etc)
# <ip> IP address
# <failures> number of failures
# <failtime> unix timestamp of the last failure
# <br> new line
# Values: TEXT Default:
#
message = Hi,<br>
The IP <ip> has just been banned by Fail2Ban after
<failures> attempts against <section<.<br>
Regards,<br>
Fail2Ban
#
# You can define a new section for each log file to check for
# password failure. Each section has to define the following
# options: logfile, fwban, fwunban, timeregex, timepattern,
# failregex.
#
Mise en place des services à proteger
Ce fihier contient des paramettres à appliquer sur chaque service à protéger, et ensuite spécifie les services avec leurs spécificités
Parie commune
Fichier /etc/fail2ban/jail.conf
#
# This file was composed for Debian systems from the original one
# provided now under /usr/share/doc/fail2ban/examples/jail.conf
# for additional examples.
#
# To avoid merges during upgrades DO NOT MODIFY THIS FILE
# and rather provide your changes in /etc/fail2ban/jail.local
#
# Author: Yaroslav O. Halchenko <debian@onerussian.com>
#
# $Revision: 281 $
#
# 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
ignoreip = 127.0.0.1
bantime = 360000
maxretry = 3
On paramettre ici, les ip à ne jamais bannir, une idée si vous avez une IP fixe chez vous, rajoutez là.. sinon ajoutez celle d'un ami de confiance.. ça aide des fois
J'ai modifié le temps par défaut à 360000s = environ 10jours.. c'est enorme, mais j'en ai plus qu'assez des pc zombies des chinois..
maxretry, je le laisse par défaut.. ça sera modifié plus bas
# options are "gamin", "polling" and "auto".
# yoh: For some reason Debian shipped python-gamin didn't work as expected
# This issue left ToDo, so polling is default backend for now
backend = polling
#
# Destination email address used solely for the interpolations in
# jail.{conf,local} configuration files.
destemail = root@domain.com
# Default action to take: ban only
#action = iptables[name=%(__name__)s, port=%(port)s]
# mail-whois[name=%(__name__)s, dest=%(destemail)s]
# Following actions can be chosen as an alternatives to the above action.
# To activate, just copy/paste+uncomment chosen 2 (excluding comments) lines
# into jail.local
# Default action to take: ban & send an e-mail with whois report
# to the destemail.
#action = iptables[name=%(__name__)s, port=%(port)s]
# mail-whois[name=%(__name__)s, dest=%(destemail)s]
# Default action to take: ban &send an e-mail with whois report
# and relevant log lines to the destemail.
action = iptables[name=%(__name__)s, port=%(port)s]
mail-whois-lines[name=%(__name__)s, dest=%(destemail)s, logpath=%(logpath)s]
On peut modifier la liste des actions, qui commencent par le nom du fichier (sans .conf) qui se trouve dans action.d puis les paramettres entre [], plusieurs actions peuvent être chainées.
J'ai choisi pour ma part un rapport complet avec whois et logs
Serveur SSH
# which was shipped in Debian. Please enable any defined here jail by including
#
# [SECTION_NAME]
# enabled = true
#
# in /etc/fail2ban/jail.local.
#
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
#bantime = 360000
maxretry = 3
Config par défaut je n'ai rien changé tout était déjà bon.
Remarque : on peut soit spécifier un numéro de port (pour la mise en place de la rêgle iptable, soit son nom (voir fichier /etc/services)
Serveur SSH
# HTTP servers
#
[apache]
enabled = true
port = http
filter = apache-auth
logpath = /var/log/apache*/access*.log
maxretry = 6
[apache-noscript]
enabled = true
port = http
filter = apache-noscript
logpath = /var/log/apache*/error*.log
maxretry = 6
[apache-admin]
enabled = true
port = http
filter = apache-admin
logpath = /var/log/apache*/error*.log
maxretry = 6
[apache-404]
enabled = true
port = http
filter = apache-404
logpath = /var/log/apache*/error*.log
maxretry = 10
Autant ne pas vous le cacher, je me suis lâché.. et c'est du violent.. pas du coup optimisé..
j'ai créé 4 filtres dans le repertoire filter.d (voir plus loin), que j'ai associé à la lecture des logs d'erreur.
Apache-404 sert au blockage de robots de merde qui essayent de dumper un site web, il bloque aussi les utilisateurs du module scrapbook de firefox .. (module codé avec les pieds et qui génère ennormément d'erreurs 404)
Remarque : La mise en place de rêgle comme celles là nécéssitent une rigeur dans le développement d'une page web.. une partie commune de page dont il manque systématiquement une image aura pour conséquence de bloquer tous les visiteurs
Serveur FTP
# FTP servers
#
[vsftpd]
enabled = false
port = ftp
filter = vsftpd
logpath = /var/log/auth.log
maxretry = 6
[proftpd]
enabled = true
port = ftp
filter = proftpd
logpath = /var/log/proftpd/proftpd.log
maxretry = 6
[wuftpd]
enabled = false
port = ftp
filter = wuftpd
logpath = /var/log/auth.log
maxretry = 6
Je n'ai rien modifié, si ce n'est activé proftpd
Remarque : La mise en place de rêgle comme celles là nécéssitent une rigeur dans le développement d'une page web.. une partie commune de page dont il manque systématiquement une image aura pour conséquence de bloquer tous les visiteurs
Serveur MAIL
# Mail servers
#
[postfix]
enabled = true
port = smtp
filter = postfix
logpath = /var/log/mail.log
[couriersmtp]
enabled = true
port = smtp
filter = couriersmtp
logpath = /var/log/mail.log
[sasl]
enabled = true
port = smtp
filter = sasl
logpath = /var/log/mail.log
Je n'ai rien modifié, tout est par défaut.
Les filtres
Comme indiqué plus haut, j'ai rajouté quelques filtres apache
Apache 404 : anti boulet
Fichier /etc/fail2ban/filter.d/apache-404.conf
#
# Author: Cyril Jaquier
#
# $Revision: 471 $
#
[Definition]
# Option: failregex
# Notes.: regex to match the password failure messages in the logfile. The
# host must be matched by a group named "host". The tag "<HOST>" can
# be used for standard IP/hostname matching.
# Values: TEXT
# [client x.x.x.x] File does not exist: /home/www/admin/admin,
failregex = [[]client <HOST>[]] File does not exist: .*
#
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
La seule ligne à modifier est "failregex". Sa mise en place peut-être relativement chiante à faire.
Filtrage à la hache par excelence, un type qui furte un repertoire qui n'existe pas.. et qui insiste se retrouve dehors sans avoir rien compris
Apache admin : anti kevin
Fichier /etc/fail2ban/filter.d/apache-admin.conf
#
# Author: Cyril Jaquier
#
# $Revision: 471 $
#
[Definition]
# Option: failregex
# Notes.: regex to match the password failure messages in the logfile. The
# host must be matched by a group named "host". The tag "<HOST>" can
# be used for standard IP/hostname matching.
# Values: TEXT
# [client x.x.x.x] File does not exist: /home/www/admin/admin,
failregex = [[]client <HOST>[]] File does not exist: .*admin|PMA|mysql
#
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
Plus léger et précis que le précédent, il réagit plus vite, on peut se le permettre.. il n'y a pas de repertoire admin, ni de phpmyadmin sur mon url publique
Apache auth : anti kevin
Fichier /etc/fail2ban/filter.d/apache-auth.conf
#
# Author: Cyril Jaquier
#
# $Revision: 471 $
#
[Definition]
# Option: failregex
# Notes.: regex to match the password failure messages in the logfile. The
# host must be matched by a group named "host". The tag "<HOST>" can
# be used for standard IP/hostname matching.
# Values: TEXT
# [client x.x.x.x] File does not exist: /home/www/admin/admin,
failregex = [[]client <HOST>[]] user .*(?:: authentication failure|not found)
#
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
Dans un autre domaine, protéger les zones avec mot de passe contre les attaques brute force
Apache noscript : anti kevin
Fichier /etc/fail2ban/filter.d/apache-noscript.conf
#
# Author: Cyril Jaquier
#
# $Revision: 471 $
#
[Definition]
# Option: failregex
# Notes.: regex to match the password failure messages in the logfile. The
# host must be matched by a group named "host". The tag "<HOST>" can
# be used for standard IP/hostname matching.
# Values: TEXT
# [client x.x.x.x] File does not exist: /home/www/admin/admin,
failregex = [[]client <HOST>[]] File does not exist: .*(\.php|\.asp)
#
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
Mis en place à ces débuts, il ne sert quasiment pas.. sert à detecter les erreurs 404 sur des recherches de php asp..
Les actions
2 actions seront décrites ici : les règles iptables avec une spécificité que j'ai mise en place
Iptables
Fichier : /etc/fail2ban/action.d/iptables.conf
#
# Author: Cyril Jaquier
#
# $Revision: 455 $
#
[Definition]
# Option: fwstart
# Notes.: command executed once at the start of Fail2Ban.
# Values: CMD
#
actionstart = iptables -N fail2ban-<name>
iptables -A fail2ban-<name> -j RETURN
iptables -I INPUT -p <protocol> --dport <port> -j fail2ban-<name>
# Option: fwend
# Notes.: command executed once at the end of Fail2Ban
# Values: CMD
#
actionstop = iptables -D INPUT -p <protocol> --dport <port> -j fail2ban-<name>
iptables -F fail2ban-<name>
iptables -X fail2ban-<name>
# Option: fwcheck
# Notes.: command executed once before each fwban command
# Values: CMD
#
actioncheck = iptables -L INPUT | grep -q fail2ban-<name>
On commence par mettre en place des règles de filtrages fail2ban-ssh, fail2ban-apache-404 .. etc
Remarques, résultat de la commande
iptables-save | grep fail2ban
...
-A INPUT -p tcp -m tcp --dport 25 -j fail2ban-sasl
-A INPUT -p tcp -m tcp --dport 80 -j fail2ban-apache
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-ssh
-A INPUT -p tcp -m tcp --dport 25 -j fail2ban-couriersmtp
-A INPUT -p tcp -m tcp --dport 80 -j fail2ban-apache-admin
-A INPUT -p tcp -m tcp --dport 80 -j fail2ban-apache-404
-A INPUT -p tcp -m tcp --dport 21 -j fail2ban-proftpd
-A INPUT -p tcp -m tcp --dport 25 -j fail2ban-postfix
-A INPUT -p tcp -m tcp --dport 80 -j fail2ban-apache-noscript
-A INPUT -p tcp -m tcp --dport 80 -j fail2ban-apache-404
-A INPUT -p tcp -m tcp --dport 80 -j fail2ban-apache
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-ssh
-A INPUT -p tcp -m tcp --dport 80 -j fail2ban-apache-admin
-A INPUT -p tcp -m tcp --dport 80 -j fail2ban-apache-noscript
-A INPUT -p tcp -m tcp --dport 25 -j fail2ban-sasl
-A INPUT -p tcp -m tcp --dport 25 -j fail2ban-couriersmtp
-A INPUT -p tcp -m tcp --dport 25 -j fail2ban-postfix
-A INPUT -p tcp -m tcp --dport 21 -j fail2ban-proftpd
-A INPUT -p tcp -m tcp --dport 25 -j fail2ban-postfix
-A INPUT -p tcp -m tcp --dport 80 -j fail2ban-apache
-A INPUT -p tcp -m tcp --dport 80 -j fail2ban-apache-404
-A INPUT -p tcp -m tcp --dport 25 -j fail2ban-sasl
-A INPUT -p tcp -m tcp --dport 21 -j fail2ban-proftpd
-A INPUT -p tcp -m tcp --dport 80 -j fail2ban-apache-noscript
-A INPUT -p tcp -m tcp --dport 80 -j fail2ban-apache-admin
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-ssh
-A INPUT -p tcp -m tcp --dport 25 -j fail2ban-couriersmtp
...
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <failures> number of failures
# <time> unix timestamp of the ban time
# Values: CMD
#
actionban = iptables -I fail2ban-<name> 1 -s <ip> -j log-and-drop-brute
Normalement.. cette règle est à DROP et non log-and-drop-brute.. j'ai modifié mon script firewall pour pouvoir logguer les tentatives répétées de brute force.
# Option: fwunban
# Notes.: command executed when unbanning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <failures> number of failures
# <time> unix timestamp of the ban time
# Values: CMD
#
actionunban = iptables -D fail2ban-<name> -s <ip> -j log-and-drop-brute
Normalement.. cette règle est à DROP et non log-and-drop-brute.. j'ai modifié mon script firewall pour pouvoir logguer les tentatives répétées de brute force.
[Init]
# Defaut name of the chain
#
name = default
# Option: port
# Notes.: specifies port to monitor
# Values: [ NUM | STRING ] Default:
#
port = ssh
# Option: protocol
# Notes.: internally used by config reader for interpolations.
# Values: [ tcp | udp | icmp | all ] Default: tcp
#
protocol = tcp
Tous les autres paramettres sont laissés tel quel
Pour ma modif de firewall :installer ulog
aptitude install ulog
Modifiez votre script firewall :
$IPTABLES -X log-and-drop-brute 2> /dev/null
$IPTABLES -N log-and-drop-brute
$IPTABLES -A log-and-drop-brute -j ULOG --ulog-prefix '[IPT BRUTE F2B] : '
$IPTABLES -A log-and-drop-brute -j DROP
$IPTABLES -A log-and-drop-brute -j RETURN
Les logs sont consultables dans /var/log/ulog/syslogemu.log
Notification mail whois
Fichier : /etc/fail2ban/action.d/mail-whois-line.conf
#
# Author: Cyril Jaquier
# Modified-By: Yaroslav Halchenko to include grepping on IP over log files
# $Revision: 254 $
#
[Definition]
# Option: fwstart
# Notes.: command executed once at the start of Fail2Ban.
# Values: CMD
#
actionstart = echo -en "Hi,\n
The jail <name> has been started successfuly.\n
Regards,\n
Fail2Ban"|mail -s "[Fail2Ban - server] <name>: started" <dest>
# Option: fwend
# Notes.: command executed once at the end of Fail2Ban
# Values: CMD
#
actionstop = echo -en "Hi,\n
The jail <name> has been stopped.\n
Regards,\n
Fail2Ban"|mail -s "[Fail2Ban - server] <name>: stopped" <dest>
# Option: fwcheck
# Notes.: command executed once before each fwban command
# Values: CMD
#
actioncheck =
# Option: fwban
# Notes.: command executed when banning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <failures> number of failures
# <failtime> unix timestamp of the last failure
# <bantime> unix timestamp of the ban time
# Values: CMD
#
actionban = echo -en "Hi,\n
The IP <ip> has just been banned by Fail2Ban after
<failures> attempts against <name>.\n\n
Here are more information about <ip>:\n
`whois <ip>`\n\n
Lines containing IP:<ip> in <logpath>\n
`grep '\<<ip>\>' <logpath>`\n\n
Regards,\n
Fail2Ban"|mail -s "[Fail2Ban - server] <name>: banned <ip>" <dest>
# Option: fwunban
# Notes.: command executed when unbanning an IP. Take care that the
# command is executed with Fail2Ban user rights.
# Tags: <ip> IP address
# <bantime> unix timestamp of the ban time
# <unbantime> unix timestamp of the unban time
# Values: CMD
#
actionunban =
[Init]
# Defaut name of the chain
#
name = default
# Destinataire of the mail
#
dest = root@domaine.com
# Path to the log files which contain relevant lines for the abuser IP
#
logpath = /dev/null
Fichier très peu modifié .. juste pour le sujet du mail
Petites précisions
L'ajout d'un filtre supplémentaire, ne nécéssite pas de rajouter une action, l'action par défaut (qui marche déjà bien) suffit parfaitement.
Sources d'inspiration
Il y a 1 commentaire.
.: Dernière mise à jour le 22/08/2008

Afficher le commentaire


Uptime :