jeudi, octobre 03, 2024
Nom d'utilisateur : Mot de passe :
[NEWS]
Envoyé par unreal
Introduction

Si vous hébergez un serveur avec un sshd qui écoute sur le port standard (port 22) vous avez certainement déjà constaté des tentatives de connexion erronées dans les logs sshd. Il s'agit la plupart du temps d'attaques automatisées exploitant des machines zombies et des listes de noms d'utilisateurs/mots de passe courants ; on appelle ce genre d'attaque "brute force attack" en anglais. Si vous avez désactivé le login root par ssh et que vous utilisez des mots de passe complexes (8 caractères minimum avec des lettres et des chiffres), le risque qu'un intrus puisse se connecter reste assez faible, mais j'avoue que ça m'embête beaucoup de constater de nombreuses tentatives de connexion avec le risque qu'on arrive un jour à "pirater" mon serveur Linux.

Début de solution

Comme évoqué dans le premier paragraphe, il convient bien évidemment de désactiver le login root via ssh. Cela se configure dans sshd_config (souvent dans /etc/ssh) :

PermitRootLogin no


Vérifiez ensuite que les utilisateurs (au sens unix du terme) qui n'ont pas besoin de se connecter par ssh ne puissent pas se connecter par ssh. Plusieurs possibilités pour cela :

  • leur attribuer le shell "nologin", ce qui empêchera non seulement une connexion ssh, mais aussi le changement d'utilisateur avec "su".
  • la directive "AllowUsers" dans sshd_config permet de créer une liste d'utilisateurs ayant le droit de se connecter via ssh :


AllowUsers Utilisateur1, Utilisateur2, Utilisateur3


Dans l'exemple ci-dessus, seuls les 3 utilisateurs spécifiés pourront se connecter par ssh.

Une configuration basique du firewall peut être une bonne idée pour limiter les accès. En effet, j'ai hélas constaté que beaucoup de tentatives de connexion provenaient d'IP asiatiques ou d'amérique du sud. Et vu que je ne me connecte jamais depuis de telles IP les bloquer est une bonne solution.

Exemple de filtrage avec IPFilter (BSD) :

block in quick proto tcp from 58.0.0.0/7 to any port = 22
block in quick proto tcp from 60.0.0.0/7 to any port = 22
block in quick proto tcp from 200.0.0.0/6 to any port = 22
block in quick proto tcp from 210.0.0.0/7 to any port = 22
block in quick proto tcp from 218.0.0.0/7 to any port = 22
block in quick proto tcp from 220.0.0.0/7 to any port = 22
block in quick proto tcp from 222.0.0.0/8 to any port = 22


Exemple de filtrage avec IPTables (Linux) :

iptables -A INPUT -p tcp --source 58.0.0.0/7 --dport 22 -j DROP
iptables -A INPUT -p tcp --source 60.0.0.0/7 --dport 22 -j DROP
iptables -A INPUT -p tcp --source 200.0.0.0/6 --dport 22 -j DROP
iptables -A INPUT -p tcp --source 210.0.0.0/7 --dport 22 -j DROP
iptables -A INPUT -p tcp --source 218.0.0.0/7 --dport 22 -j DROP
iptables -A INPUT -p tcp --source 220.0.0.0/7 --dport 22 -j DROP
iptables -A INPUT -p tcp --source 222.0.0.0/8 --dport 22 -j DROP


Et naturellement, si vous n'avez pas besoin d'utiliser sshd sur le port 22, cela peut être une bonne idée de modifier le port par défaut (toujours dans sshd_config) :

Port 49853


Et ce script, qu'est ce qu'il fait ?

Le but de ce script c'est d'apporter une protection "active" à sshd : à chaque exécution, il analyse les dernières entrées dans le fichier de log sshd pour déterminer s'il y'a eu des échecs de connexion, et si oui, quelles étaient les IP à l'origine de ces échecs. Si une même IP a provoqué trop d'échecs de connexion (le seuil est paramétrable dans le script), il envoie l'ordre à NetFilter (le firewall habituel sous Linux) de bannir l'IP. A partir de là, le serveur sshd sera protégé des tentatives de connexion provenant de l'IP bannie.
Le script maintient aussi une liste d'IP bannies afin de ne pas bannir plusieurs fois une IP déjà bloquée. La taille de cette liste (en nombre d'IP bannies) est volontairement limitée et pour éviter qu'une IP reste bannie définitivement. En effet, quand la liste est "pleine", le script enlèvera automatiquement les plus anciennes IP bannies de la liste et débloquera les IP au niveau de NetFilter. Ainsi, le nombre d'IP bloquées à un moment donné ne dépassera pas un seuil fixé par l'administrateur.
Pour finir, l'administrateur peut configurer une adresse e-mail vera laquelle seront envoyés des avertissements.

Configuration requise

  • Machine Linux avec support NetFilter/IPTables (généralement le cas)
  • Accès root
  • Crontab configuré pour lancer les scripts avec bash


Installation

L'installation du script ne devrait pas poser de problème :

1 - Téléchargez le script et copiez-le dans /usr/local/bin
2 - Rendez-le exécutable (chmod 744)
3 - Editez (au minimum) les paramètres suivants pour refléter votre config et vos besoins :

SSHD_LOG=/var/log/auth.log
ALLOWED_FAIL=4
MAIL_TO=root@localhost


4 - Configurez un crontab pour exécuter le script périodiquement (toutes les 2 minutes est un bon début) :

# SSHD Audit
*/2 * * * *             /usr/local/bin/sshd_audit.sh


Téléchargement

Pour télécharger ce script, rendez-vous dans sa rubrique téléchargement.

Historique de ce document

10/04/2006 -- version initiale.
30/05/2006 -- ajout de nouvelles IP.

Posté le 07/04/06 à 18:15 - 3 Commentaires...