06 janvier 2009

Restriction des accès SSH extérieurs par IP

Ce qui suit est générique, mais, pour savoir, la plate-forme considérée est une Debian.

Quand on met en place un serveur SSH sur un serveur pour en permettre l'administration à distance, on renseigne avec la ligne suivante le fichier /etc/ssh/sshd_config afin d'interdire à root de se connecter, car ce serait un beau trou de sécurité :
PermitRootLogin no
Il est également possible et facile de restreindre les accès par adresses IP pour le service SSH. Pour cela, renseigner dans le fichier /etc/hosts.allow :
sshd: adresses IP séparées par des espaces
Exemple :
sshd: 10.11.22.33 10.44.55.66 10.77.88.99
Et dans le fichier /etc/hosts.deny, renseigner :
sshd: ALL
On peut sécuriser l'accès à d'autres services que SSH, donner des classes d'adresses IP, etc.

En revanche, ne pas chercher la complication en mettant des noms d'hôtes, mais se cantonner aux adresses IP.

C'est une sécurisation fiable et simple. L'étape suivante est la configuration iptables, dont je ne traiterai pas ici.

Le schéma ci-dessous donne un exemple d'une personne derrière une « box » ADSL avec une adresse IP fixe (sinon, au premier changement d'IP, il ne sera plus possible d'administrer les serveurs !) et en mode routeur, qui administre deux serveurs, et souhaite interdire les accès SSH depuis d'autres machines.


Sur les deux serveurs il configurera un fichier hosts.deny avec sshd: ALL, et des fichiers hosts.allow :
  • sur la machine Serveur 1 : sshd: 10.11.22.33
  • sur la machine Serveur 2 : sshd: 10.11.22.33 10.44.55.66

Pour la petite histoire, tous les services n'ont pas un accès qui puisse être sécurisé par hosts.deny. En effet, il faut que le service concerné soit compatible avec les tcpwrappers, ce dont on peut s'assurer par la commande suivante par exemple pour sshd :
$ ldd `which sshd` | grep libwrap
$ ldd /usr/sbin/sshd | grep libwrap (plus précis, si which ne va pas)
Cette astuce fonctionne à peu près pour tous les services. Ainsi, ldd /usr/sbin/apache2 | grep libwrap montre que Apache 2 n'est pas compatible avec les tcpwrappers, et ne pourra donc pas voir son accès sécurisé par hosts.deny / hosts.allow.

Pour avoir un aperçu de qui cherche à se connecter en brute force par SSH sur vos machines, faites un tour dans /var/log/auth.log. Sans la sécurisation par IP on trouve en général des tentatives de connexions root, et toute une liste de tentatives avec des identifiants bidon (admin, test, virus...). 

Pour compter ces tentatives :
# grep Failed /var/log/auth.log | wc -l
Sur mes serveurs le nombre de tentatives varie selon les hébergeurs entre une par heure et 150 par heure.

Aucun commentaire: