Protéger son accès SSH avec DenyHosts

I. Présentation

Le paquet DenyHosts analyse le fichier de logs des connexions SSH (/var/log/auth.log) et qui permet de bloquer les tentatives de connexions SSH effectuées à partir d’une adresse IP en bloquant cette adresse. Ceci vous permet de protéger votre accès SSH et votre serveur pour éviter qu’une personne malintentionnée puisse faire une attaque SSH en utilisant des dictionnaires afin de trouver votre mot de passe. Bien sur, pour pouvoir installer cette application vous devez disposer d’un serveur SSH sur votre machine.

Parmi les fonctionnalités de DenyHosts, on trouve les suivantes :

  • Bannissement d’adresses IP : « Gestion d’une blacklist ».
  • Non-surveillance de certaines adresses IP : « Gestion de whitelist ».
  • Purge des entrées du fichier de bannissement afin d’enlever les entrées au bout d’un certain temps. Exemple : Bannir les adresses IP une semaine.
  • Gestion des conditions d’échecs de connexion : Bannir au bout de n tentatives avec un compte utilisateur valide, bannir au bout de n tentatives avec un compte utilisateur invalide, etc.
  • Notifications par e-mail.
  • Synchronisation de la base des hôtes refusées avec une base située sur Internet.

Nous allons voir dans ce tutoriel comment configurer DenyHosts afin d’utiliser les fonctions indiquées ci-dessus, mais aussi, la configuration globale du daemon.

II. Installation

Commencez par installer le paquet « denyhosts » grâce au gestionnaire de paquets Aptitude, de la manière suivante :

apt-get update
apt-get install denyhosts

 denyhosts1

III. Les principaux fichiers utilisés

Avant de se lancer dans la configuration, faisons le point sur les fichiers utilisés par DenyHosts :

  • denyhosts.conf : Fichier de configuration global de DenyHosts
  • hosts.deny : Fichier situé dans « /etc » afin de stocker des informations concernant les adresses IP bannies, c'est-à-dire la blacklist.
  • hosts.allow : Fichier situé dans « /etc » afin de stocker des informations concernant les adresses IP non surveillées, c'est-à-dire la whitelist.
  • auth.log : Ce fichier situé dans « /var/log » est utilisé par DenyHosts afin d’analyser les tentatives de connexion sur le service SSH.
  • denyhosts.pid : Fichier du PID/processus de DenyHosts.
  • denyhosts : Ce fichier situé dans « /var/log » est utilisé pour les logs du daemon DenyHosts.

IV. Configuration globale

Avant de s’intéresser à la configuration du comportement de DenyHosts, intéressons-nous à la configuration globale du daemon. Dans le fichier de configuration « denyhosts.conf » vous trouverez les directives suivantes :

# Fichier de logs à analyser
SECURE_LOG = /var/log/auth.log
# Fichier des hôtes refusés (blacklist)
HOSTS_DENY = /etc/hosts.deny
# Répertoire de travail de DenyHosts
WORK_DIR = /var/lib/denyhosts
# Assurer le verrouillage du fichier PID de DenyHosts, pour qu’il y ait une seule instance en
# fonctionnement.
LOCK_FILE = /run/denyhosts.pid
# Fichier de log du démon DenyHosts (vide pour désactiver la journalisation).
DAEMON_LOG = /var/log/denyhosts

V. Configuration de la purge

Comme je le disais dans la présentation, DenyHosts gère une blacklist contenant les adresses IP « blacklistées » c'est-à-dire bannies. Afin de gérer cette base d’adresses IP il est essentiel de la purger de temps en temps c'est-à-dire de supprimer les entrées datant de plus d’une semaine, de plus d’un mois, etc. selon ce que vous décidez.

Si l’on souhaite purger le fichier « hosts.deny » pour éliminer les entrées datant de plus de 15 jours, on utilise la directive « PURGE_DENY ». Toutefois, il se peut que la même IP redevienne bannie si la personne effectue à nouveau des tentatives de connexion infructueuses sur votre serveur et elle se retrouvera « purgée » au bout de 15 jours. De ce fait, la directive « PURGE_THRESHOLD » est utilisée afin de ne plus purgée une entrée une fois qu’elle est apparue n fois dans la blacklist, ce qui permet de contrer ce phénomène.

# Délai avant la purge des entrées du fichier « hosts.deny » datant de plus de…
# Le format est : i[dhwmy]
# Où 'i' est un entier
# 'm' = minutes (minutes)
# 'h' = hours (heures)
# 'd' = days (jours)
# 'w' = weeks (semaines)
# 'y' = years (années)
# Exemple : purge tous les 15 jours
PURGE_DENY = 15d
# Nombre de fois qu’un hôte peut être purgé du fichier « hosts.deny ». Une fois la limite dépassée
# l’hôte ne sera plus purgé du fichier. La valeur « 0 » indique illimité.
PURGE_THRESHOLD = 5
# Temps entre chaque exécution de la tâche de purge des anciennes entrées dans le fichier
# hosts.deny
DAEMON_PURGE = 1h

VI. Conditions de bannissement

Pour ne pas surcharger le fichier des hôtes bannies il est important d’indiquer à DenyHosts sous quelles conditions il doit bannir un hôte.

On peut être plus ou moins flexible sur le bannissement si l’utilisateur tente de se connecter en SSH avec un utilisateur existant, avec l’utilisateur root, ou s’il tente de se connecter avec un utilisateur inexistant. L’application a prévu ces cas de figures est permet de configurer indépendamment les deux cas de figures.

De plus, on peut indiquer ce qu’on fait en cas de détection d’un hôte suspect. Soit on enregistre juste ton adresse IP sans le bannir, soit on le banni de l’accès SSH au serveur ou soit on le banni d’un accès total au serveur c'est-à-dire à tous les services du serveur.

# Indiquer à quel(s) service(s) on bloque l’accès. Par exemple, bloquer l’accès uniquement au SSH
# (sshd) ou à tout les services du serveur (ALL). Pour seulement enregistrer les hôtes, laisser vide.
BLOCK_SERVICE = ALL
# Indiquer le nombre d’échecs accepté avec un nom d’utilisateur invalide. Une fois la limite
# dépassée, on bloque l’hôte.
DENY_THRESHOLD_INVALID = 5
# Indiquer le nombre d’échecs accepté avec un nom d’utilisateur valide, sauf pour l’utilisateur
# « root ». Une fois la limite dépassée, on bloque l’hôte.
DENY_THRESHOLD_VALID = 10
# Indiquer le nombre d’échecs accepté avec l’utilisateur « root ». Une fois la limite dépassée, on
# bloque l’hôte.
DENY_THRESHOLD_ROOT = 3
# Indiquer le nombre d’échec accepté avec les identifiants d’utilisateurs indiqué dans le fichier
# « restricted-usernames » qui doit se situer dans le répertoire de travail du paquet. DENY_THRESHOLD_RESTRICTED = 1
# Indiquer le nom de l’hôte dans le fichier des hôtes refusés, lorsque c’est possible de le
# récupérer. HOSTNAME_LOOKUP=YES|NO
HOSTNAME_LOOKUP=YES

VII. Hôte autorisé suspect

Il est possible de gérer une whitelist par l’intermédiaire du fichier « hosts.allow » afin de ne pas bannir ces adresses IP même en cas de tentatives de connexion excessives. Toutefois, DenyHosts peut vous avertir s’il estime qu’un hôte de la whitelist semble suspect grâce à l’activation de la directive « SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS ».

# Indiquez avec « YES » ou « NO », si vous souhaitez ou non être averti si un hôte autorisé semble
# suspicieux, c'est-à-dire pour un hôte qui est enregistré dans le fichier hosts.allow.
SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES

 

VIII. Notifications par message électronique

Lorsqu’un hôte est banni vous pouvez recevoir une notification par e-mail en configurant DenyHosts en conséquence. L’envoi de mail s’effectuera avec le protocole prévu à cet effet, à savoir le protocole SMTP (port 25 par défaut).

# Adresse(s) email pour recevoir les notifications. Séparez les adresses par une virgule.
ADMIN_EMAIL = [email protected]
# Informations sur le serveur SMTP pour l’envoi des notifications.
# Serveur
SMTP_HOST = localhost
# Port utilisé
SMTP_PORT = 25
# Informations d’authentification pour le SMTP, si le serveur requiert une authentification.
# Utilisateur
SMTP_USERNAME=admin
# Mot de passe
SMTP_PASSWORD=123456
# Expéditeur
SMTP_FROM = root@localhost
# Sujet du message
SMTP_SUBJECT = Notification DenyHosts
# Format de la date dans le header du mail, c'est-à-dire le champ "Date:"
# Par défaut : SMTP_DATE_FORMAT = %a, %d %b %Y %H:%M:%S %z
SMTP_DATE_FORMAT = %a, %d %b %Y %H:%M:%S %z

 

IX. Conservation des échecs

DenyHosts gère un historique des échecs ce qui fait que si vous faites deux tentatives échouées : une le lundi et une le mardi, cela fera 2 tentatives échouées pour votre adresse IP. Il faut donc indiquer à DenyHosts au bout de combien de temps il doit remettre les différents compteurs de tentatives à zéro.

Comme pour les conditions de bannissement, on peut indiquer une valeur différente pour le compteur concernant les authentifications avec l’utilisateur root, avec un utilisateur existant (sauf root) et avec un utilisateur inexistant. On peut aussi remettre le compteur à zéro si l’utilisateur finit par réussir à s’authentifier.

# Période de temps pour la remise à zéro du compteur de tentative de connexion invalide, sauf pour
# l’utilisateur « root »
AGE_RESET_VALID=5d
# Période de temps pour la remise à zéro du compteur de tentative de connexion invalide pour
# l’utilisateur « root »
AGE_RESET_ROOT=25d
# Période de temps pour la remise à zéro du compteur de tentative de connexion invalide pour
# les utilisateurs situés dans le fichier restricted-usernames.
AGE_RESET_RESTRICTED=25d
# Période de temps pour la remise à zéro du compteur de tentative de connexion invalide
# avec des comptes utilisateurs qui n’existent pas.
AGE_RESET_INVALID=10d
# Remettre à zéro le compteur d’échec si une tentative finie par être un succès. Valeur par défaut # « no ».
RESET_ON_SUCCESS = yes

 

X. Exécuter un script lors d’un ajout/une suppression

Lorsque DenyHosts retire ou ajoute un hôte du fichier « hosts.deny » lors d’une purge ou d’un bannissement, vous pouvez lui indiquer d’exécuter un script à l’occasion.

# Exécutez le script indiqué en paramètre lorsqu’un hôte est ajouté au fichier « hosts.deny »
PLUGIN_DENY=/usr/bin/true
# Exécutez le script indiqué en paramètre lorsqu’un hôte est retiré du fichier « hosts.deny »
PLUGIN_PURGE=/usr/bin/true

 

XI. Format des journaux

Afin de personnaliser les journaux générés par DenyHosts dans le cas où ils sont activés, paramétrez les deux paramètres suivants : DAEMON_LOG_TIME_FORMAT et DAEMON_LOG_MESSAGE_FORMAT. Le premier permettant de configurer comment sont inscrites la date et l’heure, et le second permet de configurer le contenu du message. Je pense qu’il n’est pas nécessaire de modifier ces deux paramètres, mais si vous y tenez libre à vous de le faire.

# Format de l’heure et la date pour la journalisation
# Par défaut : DAEMON_LOG_TIME_FORMAT = %b %d %H:%M:%S : Jan 1 01:05:59
DAEMON_LOG_TIME_FORMAT = %b %d %H:%M:%S
# Format/contenu du message de log
DAEMON_LOG_MESSAGE_FORMAT = %(asctime)s - %(name)-12s: %(levelname)-8s %(message)s

 

XII. Synchronisation

Comme je le disais dans la présentation, HostsDeny permet de se synchroniser à intervalle régulier avec un serveur situé sur internet, afin d’obtenir des informations sur les dernières attaques effectuées et ainsi de mettre à jour la base deny.hosts locale (SYNC_DOWNLOAD). Vous pouvez aussi inclure l’hôte dans votre base selon certaines conditions, que vous verrez dans la configuration présentée ci-dessous. A l’inverse, vous pouvez aussi ne pas inclure dans votre base les hôtes étant référencés par d’autres serveurs, mais, vous pouvez vous contenter d’envoyer des informations sur les hôtes que vous avez-vous-même banni avec votre serveur afin de compléter la base des serveurs qui se synchronise sur internet (SYNC_UPLOAD).

# Optionnel : Par défaut la synchronisation est désactivée
###############################################################
# Pour activer la synchronisation, décochez cette ligne :
SYNC_SERVER = http://xmlrpc.denyhosts.net:9911
# Intervalle de synchronisation
SYNC_INTERVAL = 1h
# Autoriser ou non l’envoi d’informations concernant les hosts.deny détectés afin d’aider
# au maintient de la base synchronisée
SYNC_UPLOAD = yes
# Autoriser ou non la réception d’informations concernant les hôtes refusés détectés par d’autres
# serveur afin de compléter le fichier hosts_deny local.
SYNC_DOWNLOAD = yes
# Nombre de fois qu’un hôte doit être bloqué pour qu’il soit synchronisé dans la base locale
SYNC_DOWNLOAD_THRESHOLD = 3
# Définir le temps maxime qui doit s’être écoulé entre la première attaque et la deuxième
# pour que l’hôte soit enregistré.
# Par exemple, si l’on définit cette valeur sur « 2 jours » et que la première attaque a lieu à 10h le
# 02 Janvier puis que la seconde a lieu le 04 Janvier à 9h, l’enregistrement dans la base locale aura
# lieu. Toutefois, si la seconde attaque a lieu le 04 Janvier à 11h, l’enregistrement n’aura pas lieu
# puisqu’il s’est écoulé plus de 2 jours entre les deux attaques.
SYNC_DOWNLOAD_RESILIENCY = 2d

XIII. Renseigner la whitelist

Rappelez-vous, le fichier « /etc/hosts.allow » permet de gérer une whitelist c'est-à-dire une liste des hôtes qu’on ne souhaite pas bloquer, ce qui peut être utile pour indiquer l’adresse IP voir même la plage IP des machines du service informatique.

Par exemple, pour autoriser continuellement l’accès à tous les services (ALL) pour l’hôte « 172.16.1.10 », indiquez ceci dans le fichier :

ALL: 172.16.1.10

Un autre exemple, si vous souhaitez autoriser l’accès SSH à l’hôte « 172.16.1.11 », indiquez ceci :

sshd: 172.16.1.10

Note : Indiquez une règle par ligne.

XIV. Redémarrez le service

Après avoir effectué votre configuration à partir du fichier d’origine ou du fichier traduit par mes soins, pensez à redémarrez le service pour que la configuration soit rechargée :

service denyhosts restart

 

XV. Statistiques en lignes

Un sous-domaine du site « denyhosts.net » accessible à l’adresse suivante : xmlrpc.denyhosts.net permet d’obtenir une série de statistiques notamment sur le nombre d’hôtes bannies dans le monde, le nombre d’hôtes uniques bannies par DenyHosts, etc. Malheureusement cette page n’est plus mise à jour depuis juillet 2011 mais peut vous donner un ordre d’idée du travail effectué par DenyHosts. Je vous invite donc à faire un petit tour sur cette page, histoire de finir le tutoriel en douceur.

denyhosts2

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Florian BURNEL

Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.

Nombre de posts de cet auteur : 5503.Voir tous les posts

2 thoughts on “Protéger son accès SSH avec DenyHosts

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.