Trucs et Astuces pour améliorer le niveau de sécurité de vos serveurs SSH

Cet article va vous exposer quelques trucs et astuces permettant d’améliorer le niveau de sécurité d’un serveur SSH. Ces astuces s’appuient sur l’implémentation la plus répandue du protocole SSH, OpenSSH. Ceci n’est pas un tutoriel dans le sens où toutes ces astuces ne peuvent être « activées » sur un même serveur SSH.

Les fichiers de Configuration d’OpenSSH

Pour rappel, OpenSSH possède un certain nombre de fichiers de configuration:

  • /etc/ssh/sshd_config : fichier de configuration du serveur SSH,
  • /etc/ssh/ssh_config : fichier de configuration du client SSH,
  • ~/.ssh/ : répertoire contenant la configuration ssh propre à l’utilisateur, référencé par ~,
  • ~/.ssh/authorized_keys : Liste des  clés publiques (RSA et DSA) pouvant être utilisées pour se connecter à ce compte,
  • /etc/hosts.allow et /etc/hosts.deny : la white list et la black list d’OpenSSH.

Ces fichiers seront cités dans la suite de l’article, sans faire référence à leur chemin complet.

Petit point à propos des mécanismes de chiffrement RSA et DSA.

Régulierement est posée la question de savoir qui du protocole RSA ou DSA est le plus sécurisé. La  réponse est simple. A un dimensionnement de clés raisonnable, les deux protocoles offriront un niveau de sécurité équivalent. L’ANSSI (Agence Nationale de la sécurité des systèmes d’information) recommande aujourd’hui d’utiliser des clés de 2048bits (cf. Recommandations sur le dimensionnement des clés).
Cependant, ssh-keygen, l’outil de génération de clés d’OpenSSH ne permet pas de générer des clés DSA de 2048 bits (tout du moins dans la version d’OpenSSH 5.1p1 disponible sous Ubuntu Jaunty). Vous pouvez cependant la générer avec openssl et l’utiliser avec openssh.

Génération d’un clé DSA avec OpenSSL :

Génération de la clé privée

openssl dsaparam -noout -out ~/.ssh/id_dsa -genkey 2048
openssl dsa -in ~/.ssh/id_dsa -des3 -out ~/.ssh/id_dsa

Génération de la clé publique :

openssl dsa -in ~/.ssh/id_dsa -pubout -out ~/.ssh/id_dsa.pub

Règles et recommandations :


Renforcement de l’authentification

Un précédent article dans ce blog montre que les utilisateurs, en négligeant les risques liés au choix et au dimensionnement de leurs méthodes d’authentification sont souvent le maillon faible d’un système d’information.
Afin d’endiguer ce phénomène, voici quelques règles simples qui permettront de renforcer l’authentification des utilisateurs sur des serveurs SSH. Les clés de configuration listées sont à insérer/contrôler dans le fichier sshd_config.

  1. Ne pas autoriser de mots de passe vides :
    PermitEmptyPasswords no
  2. Ne pas donner d’accès root à l’équipement :
    PermitRootLogin no  *
  3. Modifier le MOTD visualisé par les utilisateurs afin de les informer des risques encourus :
    Banner <chemin de la nouvelle bannière>
  4. Ajouter un timeout à vos connexions afin que les utilisateurs ne laissent pas des shells ouverts indéfiniment :
    ClientAliveInterval 300
    ClientAliveCountMax 0
  5. Forcer les utilisateurs à avoir des mots de passe forts **
  6. Privilégier l’authentification par clé publique et désactiver l’authentification par mot de passe :
    PasswordAuthentication No
  7. Mettre en place une authentification forte / bi-facteur.

* En règle générale, il est recommandé pour deux raisons d’éviter de donner l’accès à des comptes génériques :

  • le nom d’utilisateur est connu de tous (une information sur deux est disponible!),
  • il est impossible pour un administrateur du SI de savoir qui a fait quoi. Il est préférable de s’authentifier d’abord à l’aide d’un compte nominatif, puis de prendre les privilèges nécessaires (les logs système permettront de savoir quel utilisateur a pris quels droits à un instant T).

** Cette réflexion va bien au-delà du simple renforcement de l’authentification sur des serveurs SSH et doit être prise à un niveau global dans l’administration d’un système d’information.

Renforcement de l’accès au serveur SSH

  1. La première règle de sécurité est évidente : un démon SSH inutilisé est un démon SSH de trop.
  2. Vérifier que les serveurs SSH ne supportent que la version 2 du protocole, la première version étant désormais ancienne et faillée comme un OS de Microsoft. Pour cela, vérifier que votre sshd_config possède l’entrée suivante :
    « Protocol 2 »
  3. Limiter les comptes autorisés à se connecter via SSH en utilisant les clés AllowUsers et DenyUsers.
    AllowUsers john

    n’autorisera que l’utilisateur john à se connecter à la machine

    DenyUsers mysql

    n’autorisera pas l’utilisateur mysql.
    Ceci est particulièrement utile dans le cadre de machines disposant de compte générique (base de données …)

  4. Paramétrer les firewalls pour limiter l’accès à vos services (dans un monde parfait, l’accès SSH est limité à votre LAN)
  5. Changer le port de connexion, limiter les adresses de binding
    ListenAddress 192.168.1.5
    Port 300
  6. Renforcer votre serveur SSH contre les attaques brute-force en utilisant des systèmes tels que DenyHosts ou fail2ban
  7. Désactiver l’authentification par mot de passe. Ceci vous protégera efficacement des attaques par force brute
  8. Enfin, si l’authentification par mot de passe est nécessaire, privilégier l’authentification  « keyboard-interactive ». Ceci également afin de vous protéger des attaques par force brute.
    Modifier votre sshd_config de la manière suivante:

    PasswordAuthentication no
    ChallengeResponseAuthentication yes

DenyHosts : Mettre à jour votre hosts.deny

DenyHosts est un démon, écrit en python qui scrute le /var/log/auth.log pour détecter les échecs d’authentification. Si un nombre (configurable) de tentatives échouées est atteint, l’ip source est alors blacklistée dans le hosts.deny du système. DenyHosts implémente également un mécanisme de purge. Un court article ici (en anglais) montre une configuration simple pour DenyHosts.

Authentification Bi-Facteur avec OpenSSH

Une des authentifications bi-facteur la plus simple à mettre en oeuvre est une authentification password / clé publique + OTP (one-time password).

Pour debian la marche à suivre est la suivante :

apt-get install libpam-opie opie-server

Ensuite dans /etc/pam.d/ssh, ajouter l’entrée pam_opie :

auth    required   pam_env.so envfile=/etc/default/locale
auth    required   pam_opie.so

Le fichier de configuration du serveur ssh doit avoir une authentification positionnée à :

ChallengeResponseAuthentication yes
PasswordAuthentication no

Il reste à initialiser le serveur  OTP :

opiepasswd -c

Rentrer la passphrase qui permettra de générer les OTP. Il ne reste plus qu’à déployer des calculatrices OTP sur les postes clients (paquet opie-client). La procédure d’authentification sera alors la suivante :

jack@bauer:~$ ssh login@device
otp-md5 492 ne9401 ext, Response:
Password:
...
Contribution d’Olivier Hervieu pour TechnoAddict

4 thoughts on “Trucs et Astuces pour améliorer le niveau de sécurité de vos serveurs SSH

  1. Pingback: Philippe Scoffoni (pscoffoni) 's status on Tuesday, 20-Oct-09 18:54:33 UTC - Identi.ca

  2. Salut,

    En lisant cet article, je repense à un petit truc que j’ai pu apprendre pas plus tard que ya pas longtemps.
    Pour le "PermitRootLogin", il peut être utile de mettre l’option "nopassword" à la place de "no" tout court.
    Dans certains cas, il peut être utile à une machine de confiance d’effectuer des commandes en root au travers de ssh. rsync est un exemple. donc avec cette option, si les clefs ssh ont été échangée, ça marche et on interdit tout login root sur un shell.

    Voilà. Si ça peut aider…

  3. Bonjour,
    Tout d’abord merci pour cet article extrêmement intéressant.
    Je souhaitais vous demander s’il était possible sous OpenSSH de combiner l’authentification par login/mot de passe avec l’authentification par clé publique de manière à avoir de l’authentification forte ? Si oui pourriez-vous m’éclairer sur la manière de le faire ?

    En vous remerciant par avance.

Laisser un commentaire

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