Sélectionner une page

Comme tout hébergeur industriel, Octopuce bloque régulièrement des attaques automatisées sur les serveurs de nos clients.

Pour ce  faire, nous utilisons fail2ban, un logiciel de blocage automatique des tentatives répétées d’accès aux services hébergés (ssh, ftp, mail, smtp …)

Or fail2ban passe par des règles iptables de blocage (iptables … -j REJECT ), conséquence de cela, ce type de filtrage est adapté à un faible nombre d’IP source à bloquer.

Si l’on a des milliers (ou plus) d’adresses à bloquer, il faut utiliser une autre technique. Nous avons donc récemment mis en place un système de blocage basé sur ipset.

IPSET pour créer vos listes d’IPs/Blocs

IPSET est un outil Linux disponible depuis bien longtemps mais hélas peu utilisé. Il permet de définir des tables (de hashage) d’adresses IP ou IP+Port ou préfixe d’IP, autant en IPv4 qu’en IPv6.

Ensuite, on peut choisir de faire correspondre des règles de pare-feu à ces tables, par l’intermédiaire du module iptables set et de choisir de bloquer ou autoriser les connexions ayant pour IP/Port source ou cible des éléments de ces tables ipset.

Nous avons donc désormais un script nommé blacklist , et utilisable sur tous nos serveurs (ceux sous Debian Wheezy ou ultérieur) permettant de gérer une blacklist d’IPv4, de préfixes IPv4, ou de préfixes IPv6.

blacklist est un script fait-maison, qui lance juste les bonnes commandes ipset (voir la man d’ipset) pour ajouter / lister / supprimer les IPs à bloquer, associé aux bonnes règles de pare-feu de nos sytèmes centralisés.

On peut l’utiliser ainsi :

  • blacklist add <adresse IP ou préfixe>   ajoute une IP ou préfixe à la blackliste
  • blacklist del <adresse IP ou préfixe>   enleve une IP ou un préfixe de la blacklist
  • blacklist add/del   sans paramètre prend une liste d’IP ou de préfixes sur stdin
  • blacklist list    affiche la liste des IP et blocs bloqués
  • blacklist flush    supprime toutes les IP ou blocs de la blackliste.

Cette commande nous permet donc de bloquer des attaques facilement à l’aide des outils grep, sed, tail et … blacklist !

Exemple, bloquons des utilisateurs appelant une page n’existant pas sur un joomla, correspondant à une page d’admin wordpress :

# tail -F /var/log/apache2/access.log|grep --line-buffered "POST /wp-login .* 404 " |sed -ue 's/^\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1.\2.\3.0\/24/'|blacklist add

Autre avantage d’ipset, on peut mettre une durée de conservation de chaque IP. Ainsi, notre blackliste n’a effet par défaut que pendant 4h, ce qui permet de ne pas bloquer trop longtemps d’éventuels internautes légitimes.

Exemple :

Name: blacknet4
Type: hash:net
Header: family inet hashsize 16384 maxelem 65536 timeout 14400
Size in memory: 1176312
References: 1
Members:
36.1.136.0/24 timeout 2006
220.169.139.0/24 timeout 4219

Les 2 blocs bloqués seront automatiquement retirés de la liste dans 2006 et 4219 secondes.

Attention aux tampons !

Vous noterez dans la commande ci-dessus que nous avons ajouté des options inhabituelles de grep ou sed. En effet, ces deux commandes ont un comportement différent lorsqu’elles ont en entrée et sortie standard non pas un terminal, mais un fichier. Dans ce cas, ces commandes traitent les données par tampon de quelques Ko. Aussi il faudra attendre d’avoir plusieurs centaines de Ko de donnée en entrée (tail) avant d’avoir des IPs en sortie (blacklist). Pour traiter ligne par ligne le contenu des fichiers logs, il faut donc ajouter des options spéciales à grep et sed :

  • grep –line-buffered    « Use line buffering on output. This can cause a performance penalty. »
  • sed -u    « ou –unbuffered  load minimal amounts of data from the input files and flush the output buffers more often »

Notez que des commandes comme cut n’ont pas de tel système, les rendant difficile d’utilisation dans ce cas. On remplacera alors une série de grep/sed/cut/awk par un simple script python, perl …

Le code :

  • blacklist.sh l’outil que l’on déploie via PUPPET sur tous les serveurs
  • 30_ipset.sh et 30_ipset_v6.sh les règles IPTABLES que l’on déploie sur les machines physiques
  • 30_ipset_off.sh les règles IPTABLES que l’on ajoute au script d’extinction du pare-feu.

Note: tous les codes de nos scripts pour administrateurs système sont publiés sous licence CC0 dans un dépôt git public. Retrouvez-les sur notre compte GitHub

 

Image copyright Dominic Alves | CC BY 2.0