Script shell de prévention contre les attaques DoS à base de règles

Gazette Linux n°137 — Avril 2007

Deny

Adaptation française

Joëlle Cornavin

Relecture de la version française

Article paru dans le n°137 de la Gazette Linux d'avril 2007.

Article publié sous Open Publication License. La Linux Gazette n'est ni produite, ni sponsorisée, ni avalisée par notre hébergeur principal, SSC, Inc.


Table des matières

1. Introduction
2. Comment détecter des attaques DoS depuis le fichier /var/log/secure
3. Comment réduire les IP redondantes détectées à partir du fichier temporaire
4. Comment activer /sbin/iptables
5. Comment installer le script shell proposé
6. Examen du script shell
7. Conclusion

1. Introduction

Dans cet article, je décris un script shell simple de prévention contre les attaques Dos (Denial-of-Service, déni de service) à base de règles. Cependant, le script shell proposé n'est pas un outil parfait pour empêcher les attaques Dos, mais un outil puissant pour réduire significativement les surcharges des serveurs Linux due aux attaques Dos.

 

Faire face à des menaces dynamiques et prendre automatiquement des mesures évasives est très difficile à faire, et demande une certaine réflexion. L'article met l'accent sur des modèles de texte et des fichiers journaux. Il existe d'autres méthodes qui conduisent à des résultats similaires. Elles sont mentionnées après la conclusion de l'auteur.

 
 -- René

Pour comprendre les attaques DoS ou DDoS (Distributed Denial of Service, déni de service distribué), il est utile de consulter les fichiers journaux dans /var/log. Dans cet article, je propose principalement un script shell de prévention contre les attaques DoS via ssh. Nous avons observé le comportement d'attaques DoS via ssh à travers trois serveurs Linux dans les six derniers mois. Nous avons manuellement exécuté des commandes iptables pour neutraliser l'accès à partir d'IP données, après avoir détecté des attaques DoS. Le script shell proposé consiste à automatiser l'ensemble des commandes exécutées pour prévenir les attaques DoS. Si le script shell simple proposé détecte des attaques DoS qui correspondent à des règles prédéfinies dans le script shell, alors les IP participant à l'attaque DoS sont ajoutées au fichier des IP détectées et voient leur accès au serveur désactivé. Puisque la détection des attaques DoS est basé sur des règles, le script est extensible. Une implémentation en mode noyau de l'idée proposée est prévue, pour empêcher des attaques DoS immédiates, au lieu de faire appel à crontab comme dans cet article.

2. Comment détecter des attaques DoS depuis le fichier /var/log/secure

Pour pouvoir consulter le fichier /var/log/secure, vous devez être root. Dans cet article, les commandes grep, awk et sed sont souvent utilisées pour construire des règles dans le script shell proposé. Le script shell est composé d'une part de règles de détection d'attaques DoS, d'une part de réduction des IP redondantes et d'une part de désactivation des IP détectées. Ce qui suit est un exemple typique d'attaque via ssh faisant appel au dictionnaire, où chaque seconde le nom d'utilisateur est changé depuis root, à delta, admin,,,, après que le système n'a pas reçu de chaîne d'identification depuis 64.34.200.202.

Feb 18 09:14:08 neuro sshd[8978]: Did not receive identification string from 64.34.200.202
Feb 18 09:18:22 neuro sshd[9012]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=64.34.200.202  user=root
Feb 18 09:18:24 neuro sshd[9012]: Failed password for root from 64.34.200.202 port 43353 ssh2
Feb 18 00:18:24 neuro sshd[9013]: Received disconnect from 64.34.200.202: 11: Bye Bye
Feb 18 09:18:25 neuro sshd[9015]: Invalid user delta from 64.34.200.202
Feb 18 00:18:25 neuro sshd[9016]: input_userauth_request: invalid user delta
Feb 18 09:18:25 neuro sshd[9015]: pam_unix(sshd:auth): check pass; user unknown
Feb 18 09:18:25 neuro sshd[9015]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=64.34.200.202
Feb 18 09:18:27 neuro sshd[9015]: Failed password for invalid user delta from 64.34.200.202 port 43875 ssh2
Feb 18 00:18:28 neuro sshd[9016]: Received disconnect from 64.34.200.202: 11: Bye Bye
Feb 18 09:18:29 neuro sshd[9017]: Invalid user admin from 64.34.200.202
Feb 18 00:18:29 neuro sshd[9018]: input_userauth_request: invalid user admin
Feb 18 09:18:29 neuro sshd[9017]: pam_unix(sshd:auth): check pass; user unknown
Feb 18 09:18:29 neuro sshd[9017]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=64.34.200.202
Feb 18 09:18:31 neuro sshd[9017]: Failed password for invalid user admin from 64.34.200.202 port 44300 ssh2

La commande suivante envoie les informations relatives aux IP désactivées depuis /etc/sysconfig/iptables dans un fichier tmp :


grep DROP /etc/sysconfig/iptables|awk '{print $5}' >tmp

Si le système n'a pas reçu de chaîne d'identification à partir des IP spécifiques, l'accès à la machine devrait être désactivé. La commande suivante ajoute les IP détectées à un fichier temporaire. Les IP détectées grâce aux règles seront ajoutées dans ce fichier.


grep Did /var/log/secure|awk '{print $12}' >>tmp

Une nouvelle règle peut être ajoutée au fichier tmp à l'aide de la commande simple. Les attaques par dictionnaire peuvent être facilement détectées grâce à la chaîne Invalid user dans /var/log/secure. Si vous orthographiez mal le nom de votre identifiant de connexion ssh, vous ne pouvez plus vous connecter à partir de votre machine. Afin de pouvoir à nouveau vous connecter sur la machine, vous devez supprimer toutes les lignes comprenant l'IP de votre machine dans le fichier /var/log/secure et vider vos règles iptables en exécutant /sbin/iptables -F.


grep "Invalid user" /var/log/secure|awk '{print $10}' >>tmp

Des attaques massives DoS de connexion peuvent être détectées par la commande suivante :


grep "Maximum login" /var/log/secure|awk '{print $7}'|sed 's/.*\[\(.*\)\])/\1/g' >>tmp

3. Comment réduire les IP redondantes détectées à partir du fichier temporaire

Les commandes suivantes réduisent les IP redondantes détectées à partir du fichier temporaire et enregistrent les IP uniques détectées dans un fichier ttt. La variable size indique le nombre de lignes dans le fichier tmp.

size=`wc tmp|awk '{print $1}'`
i=0
while test $i -lt $size
do
      us=`sed -n 1p tmp`
      sed /$us/d tmp >tmps
      echo $us >>ttt
      cp -f tmps tmp
      size=`wc tmp|awk '{print $1}'`
done

4. Comment activer /sbin/iptables

Les IP participant à l'attaque DoS sont enregistrées dans un fichier ttt. La boucle simple suivante active /sbin/iptables :

size=`wc ttt|awk '{print $1}'`
size=`expr $size + 1`
/sbin/iptables -F
i=1
while test $i -lt $size
do
        ip=`sed -n "$i"p ttt`
        i=`expr $i + 1`
/sbin/iptables -A INPUT -s $ip -j DROP
done

5. Comment installer le script shell proposé

Vous devez être root. La commande crontab -e définit le fichier crontab, où le script shell de test proposé est enregistré dans /var/log, dans notre système. Le paramètre suivant indique, que toutes les cinq minutes, le script shell est activé, quotidiennement.


0-59/5 * * * * /var/log/test

Voici le script shell complet /var/log/test :

#!/bin/bash
rm -f ttt
touch tmp
# les IP désactivées peuvent être obtenues à partir de /etc/sysconfig/iptables
grep DROP /etc/sysconfig/iptables|awk '{print $5}' >tmp
# ------------------------ Règle en cas d'attaque DoS -------------------------
# Discordance d'identité dans le fichier secure
grep Did /var/log/secure|awk '{print $12}' >>tmp
# Utilisateur invalide
grep "Invalid user" /var/log/secure|awk '{print $10}' >>tmp
# Nombre maximal d'identifiants de connexion
grep "Nombre maximal d'identifiants de connexion" /var/log/secure|awk '{print $7}'|sed 's/.*\[\(.*\)\])/\1/g' >>tmp
#
# ------------------- Réduire les IP redondantes du fichier tmp ----------------
size=`/usr/bin/wc tmp|awk '{print $1}'`
i=0
while test $i -lt $size
do
      us=`sed -n 1p tmp`
      sed /$us/d tmp >tmps
      echo $us >>ttt
      cp -f tmps tmp
      size=`/usr/bin/wc tmp|awk '{print $1}'`
done
rm -f tmp tmps temp0 temp
#
# ------------------ Activer les IP détectées  ----------------------------------
size=`wc ttt|awk '{print $1}'`
size=`expr $size + 1`
/sbin/iptables -F
i=1
while test $i -lt $size
do
        ip=`sed -n "$i"p ttt`
        i=`expr $i + 1`
/sbin/iptables -A INPUT -s $ip -j DROP
done
# ---------------- Fin du script shell de test -----------------------------------

6. Examen du script shell

Avant d'exécuter le script shell de cron, connectez-vous en root et examinez le script avec la commande :


sh /var/log/test

Pour pouvoir voir les règles iptables actuelles, saisissez la commande suivante :


/sbin/iptables -nL

7. Conclusion

Puisque le script shell proposé est portable, on peut le placer dans chaque serveur ou routeur. Afin de partager la liste noire des IP, il faut placer le script shell dans chaque routeur. De plus, une communication de routeur à routeur est nécessaire pour assembler la liste noire des IP dans le cadre élargi de la sécurité du réseau.

 

Le système décrit dans cet article repose sur des modèles prédéfinis qui doivent être extraits des fichiers journaux ; ceci, naturellement, exige que le serveur syslog de la machine ne supprime pas chaque message de journal. Les deux hypothèses peuvent conduire à des problèmes lorsque des lignes de fichier journal sont supprimées ou que le modèle de texte des tentatives de connexion manquées n'est pas détecté correctement. L'auteur a mentionné une façon de le faire automatiquement à partir du noyau. La commande Netfilter de Linux fournit un module qui peut être employé pour refuser automatiquement des tentatives de connexion répétées. Il existe un article qui décrit cette méthode. Quoi que vous décidiez de faire, gardez présent à l'esprit qu'une mesure de sécurité flexible ne devrait pas dépendre d'infrastructures moins que totalement fiables. Analyser des fichiers journaux assure une bonne partie de vos mesures de sécurité ; n'en faîtes simplement pas la pierre angulaire de vos considérations en matière de sécurité.

 
 -- René

Adaptation française de la Gazette Linux

L'adaptation française de ce document a été réalisée dans le cadre du Projet de traduction de la Gazette Linux.

Vous pourrez lire d'autres articles traduits et en apprendre plus sur ce projet en visitant notre site : http://wiki.traduc.org/Gazette_Linux.

Si vous souhaitez apporter votre contribution, n'hésitez pas à nous rejoindre, nous serons heureux de vous accueillir.