Copyright © 2007 Yoshiyasu Takefuji
Copyright © 2007 Deny
Copyright © 2007 Joëlle Cornavin
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
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.
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
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
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
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 -----------------------------------
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
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 | ||
-- René |
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.