SysFailure

Imprimer

sshdfilter

.

Présentation de SshdFilter

Sshdfilter est un outil permettant de réagir, en temps réel, aux attaques en force brute sur les mots de passe du système, lorsqu'elles sont faites par des connexions répétées au serveur sshd. Il présente les caractéristiques suivantes :

  • examen en temps réel du fichier de journalisation de ssh,
  • blocage par des règles iptables,
  • blocage suite à des erreurs ou échecs de connexion uniquement,
  • blocage dès la première erreur pour l'accès à un compte inconnu ou d'autres erreurs fortement discriminantes.
Une autre note évoque les méthodes de blocage d'attaques sur SSH.

Installation de sshdfilter

L'installation est simple et automatisée, mais nous vous conseillons de suivre la procédure manuelle. Dans le répertoire où vous avez décompressé l'archive des sources de sshdfilter :

  1. Modifier le fichier etc/sshdfilterrc. Les variables repurgetime, maxblocktime, maxchances, interface et sshdpath doivent être adaptées par rapport à votre configuration (pour sshdpath) et au comportement voulu (pour les autres).
    • repurgetime indique l'intervalle (en secondes) de contrôle de la liste de blocage afin d'en retirer les adresses pour lesquelles aucune activité néfaste n'a été observée. Défaut : 7200 secondes (deux heures).
    • maxblocktime indique la durée (en secondes) de blocage d'une adresse IP détectée comme étant à l'origine d'une attaque. Défaut : 259200 secondes (trois jours).
    • interface indique l'interface sur laquelle les règles iptables vont être appliquées. Cela vous permet éventuellement de ne filter et bloquer que les connexion venant d'Internet, si votre serveur dispose de plusieurs interfaces réseau. Défaut : vide (toutes les interfaces)
    • maxchances donne le nombre d'échecs provoquant le blocage d'une adresse IP source. Dans les faits, il s'agit du nombre de messages d'erreur. Sshd produisant deux messages par échec, maxchances contient donc le double du nombre d'échecs déclenchant le blocage. Défaut : 6.
    • sshdpath donne le chemin d'accès à sshd. Défaut : /usr/sbin/sshd.
  2. Génerer le programme sshdfilter, par la commande
    sh regen.sh
En étant le super-utilisateur,
  1. copier le fichier etc/sshdfilterrc vers /etc/sshdfilterrc.
  2. copier le programme sshdfilter. vers le répertoire où vous souhaitez qu'il demeure (/usr/sbin, /usr/local/sbin, etc.).
  3. Créer une chaine iptables appelée SSHD : iptables -N SSHD
  4. Connecter cette chaîne à vos règles iptables existantes. Si vous voulez filtrer toutes les connexions ssh, vous pouvez exécuter par exemple :
    iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j SSHD
    Si vous souhaitez que seules les connexions issues de l'interface eth1 soient contrôlées, vous exécuterez
    iptables -I INPUT -i eth1 -p tcp --dport 22 -m state --state NEW -j SSHD
  5. Modifier le programme de démarrage du démon sshd (typiquement /etc/init.d/sshd), afin de remplacer l'appel à sshd par celui à sshdfilter.
  6. Relancer le service sshd, et vérifiez que sshd a bien redémarré.

Test de sshdfilter

Pour ce test, nous supposons que l'interface à contrôler est lo (dans le fichier /etc/sshdfilterrc). Nous provoquons une connexion erronée :

ssh localhost -l alumni

Et nous vérifions que l'accès a été détecté et que le blocage est en place :

 # tail /var/log/secure
Jun 9 12:40:20 sshdfilt[2102]: Illegal user name, instant block of 127.0.0.1
Jun 9 12:40:20 sshd[2103]: Invalid user alumni from 127.0.0.1
# iptables -L SSHD
Chain SSHD (1 references)
target prot opt source destination
DROP tcp -- 127.0.0.1 0.0.0.0/0 tcp dpt:22

Il ne reste plus qu'à purger la chaîne SSHD afin de vous rendre l'accès local (s'il est nécessaire), et à modifier l'interface à contrôler dans /etc/sshdfilterrc.

Résultats

Sshdfilter génère quelques traces de ses activités. Les journaux sont considérablement abrégés de la disparition des traces d'échecs de connexions ssh, et l'on y voit de nouveaux messages comme :

 sshdfilt[2167]: No ssh id string from client, instant block of 61.129.45.47 
sshdfilt[2167]: Cancelled instant block of 202.155.200.154
sshdfilt[2167]: No ssh id string from client, instant block of 211.62.35.190

Les première et dernière lignes indiquent l'activation d'un filtre spécifique afin de bloquer les adresses IP en question. La ligne du milieu correspond au déblocage d'une adresse IP, une fois le délai maxblocktime écoulé.


Remarque

Le paramètre interface, dans le fichier sshdfilterrc, peut induire en erreur. Toutes les connexions, quelle que soit l'interface sur laquelle elles arrivent, sont contrôlées. Par contre, si ce paramètre n'est pas vide, les règles de blocage ne sont appliquées qu'à cette interface. Cela peut créer des règles un peu étonnantes, comme :

# iptables -L SSHD -n
Chain SSHD (1 references)
target prot in out source destination
DROP tcp eth0 * 127.0.0.1 0.0.0.0/0 tcp dpt:22

dans laquelle l'adresse IP source n'appartient pas au réseau auquel l'interface (eth0 ici) est reliée.