Comme l'a très bien dit Tancrède dans son article "La sécurité sera-t-elle l'argument anti auto-hébergement ?" :
S'il y a bien une raison qui pourrait s'opposer à l'auto-hébergement, je pense que ce serait celle de la sécurité. C'est probablement le point noir qui empêchera, voire interdira, l'auto-hébergement.
Je suis assez d'accord avec lui et vous invite à lire son article. Aussi, j'ai décidé de partager mon experience en vous montrant une première sécurisation quasi-indispensable pour votre serveur => fail2ban, un logiciel qui scrute les fichiers de logs à la recherche d'actions suspectes et bannit les utilisateurs mal intentionnés grâce aux iptables.
I. Installation
Mon serveur tourne avec une Debian Lenny. Fail2ban est déjà dans les dépôts officiels, un simple apt-get install sera suffisant :
apt-get install fail2ban
II. Configuration
Toute la configuration se passe dans le répertoire /etc/fail2ban/.
Le fichier fail2ban.conf défini le niveau de verbosité de logs ainsi que le fichier de log utilisé. Par défaut, /var/log/fail2ban.log.
Les services à monitorer sont stockés dans le fichier jail.conf. Il est recommandé d'en effectuer une copie nommée jail.local qui sera automatiquement utilisée à la place du fichier d'origine.
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
J'ai modifié l'en-tête de ce fichier jail.local :
[DEFAULT]
# "ignoreip" les adresses IP qui seront ignorées par fail2ban
ignoreip = 127.0.0.1
#3600 secondes = 1 heure
de banissement
bantime = 3600
# Le laps de temps pendant lequel les tentatives vont être possibles
findtime = 600
# Le nombre d'essais maximum avant bannissement
maxretry = 3
Les jails sont les "actions/logs/chaines" à surveiller. Par exemple, le jail [ssh] :
[ssh]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 6
- enabled est là pour activer le jail (ou le désactiver s'il est positionné à false)
- port du service. Si vous avez décidé d'ouvrir ssh sur un autre port, remplacez le mot ssh par le numéro du port
- filter est le nom du filtre utilisé pour ce jail (les filtres se trouvent dans le répertoire filter.d) = sshd.conf dans notre exemple
- logpath est le fichier de log qui doit être analysé
- maxretry est le nombre d'essais autorisés (écrase la valeur positionnée à 3 ci-dessus)
Pour redémarrer :
fail2ban-client reload
Pour voir la conf actuelle :
fail2ban-client status
iptables -L -v
Voici les services que j'ai activé :
root@wario:/etc/fail2ban# fail2ban-client status
Status
|- Number of jail: 8
`- Jail list: apache-w00tw00t, apache-noscript, ssh-ddos, apache-multiport, apache-overflows, ssh, apache, apache-phpmyadmin
Note : Lors du redémarrage de la machine, il se peut que fail2ban ne charge pas toutes les iptables (voir erreurs dans fichier de log fail2ban). Dans ce cas, il faut recharger le fail2ban-client ou bien ajouter une commande sleep dans les jails (expliqué ici).
III. Mes jails perso
apache-wOOtwOOt
Ce jail est là pour bannir les requêtes DFind w00tw00t.
Dans le fichier /etc/fail2ban/jail.local tout en bas, j'ajoute :
#Mes jails
[apache-w00tw00t]
enabled = true
filter = apache-w00tw00t
action = iptables[name=Apache-w00tw00t,port=80,protocol=tcp]
logpath = /var/log/apache2/access*.log
maxretry = 1
On notera que contrairement aux autres règles, celle-ci s'attaque au fichier de log des accès (/var/log/apache2/access*.log).
Voici le fichier de règles /etc/fail2ban/filter.d/apache-w00tw00t.conf
[Definition]
failregex = ^ -.*"GET \/w00tw00t\.at\.ISC\.SANS\.DFind\:\).*".*
ignoreregex =
On teste maintenant si la règle s'applique bien en faisant :
fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/apache-w00tw00t.conf
Puis on recharge l'application
fail2ban-client reload
apache-phpmyadmin
Pour bannir les requêtes du style :
[Mon Dec 27 06:22:13 2010] [error] [client 67.212.67.6] File does not exist: /home/www/phpmyadmin
[Mon Dec 27 06:22:13 2010] [error] [client 67.212.67.6] File does not exist: /home/www/phpMyAdmin
[Mon Dec 27 06:22:13 2010] [error] [client 67.212.67.6] File does not exist: /home/www/PHPmyadmin
[Mon Dec 27 06:22:14 2010] [error] [client 67.212.67.6] File does not exist: /home/www/sqldmin
[Mon Dec 27 06:22:14 2010] [error] [client 67.212.67.6] File does not exist: /home/www/admin
[Mon Dec 27 06:22:14 2010] [error] [client 67.212.67.6] File does not exist: /home/www/scripts
Je créé le fichier /etc/fail2ban/filter.d/apache-phpmyadmin.conf
# Fail2Ban configuration file
# Bans bots scanning for non-existing phpMyAdmin installations on your webhost.
[Definition]
docroot = /home/www
badadmin = PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|phpmyadmin2|webdb|sqlmanager|sqlweb|websql
failregex = [[]client []] File does not exist: %(docroot)s/(?:%(badadmin)s)
ignoreregex =
Puis j'édite le fichier /etc/fail2ban/jail.local
[apache-phpmyadmin]
enabled = true
port = http,https
filter = apache-phpmyadmin
logpath = /var/log/apache2/error*.log
maxretry = 2
VI. Conclusion
Si vous avez mis en place fail2ban et que vous avez des jails perso supplémentaires à partager, n'hésitez pas à m'en faire part, je les ajouterai à cet article. Merci par avance :)