hmichael@tronyxworld.be:~$

Sécuriser OpenSSH

Sshd est le processus du serveur OpenSSH.

Il écoute les connexions entrantes à l’aide du protocole SSH et agit comme serveur pour le protocole.

Il gère l’authentification des utilisateurs, le chiffrement, les connexions de terminaux, les transferts de fichiers et le tunneling.

La problématique

Lorsqu’on déploie notre distribution la configuration par défaut n’est pas sécurisée ni très restrictive.

A titre d’exemple voici le résultat d’un ssh-audit.

Sous CentOS 7 :

centos7_sshaudit

Sous Debian Buster :

debianbuster_sshaudit

Pas fameux pour un protocole sensé nous permettre une connexion sécurisée à nos serveurs…

Création et mise en place d’une clé RSA

Avant d’attaquer la configuration du serveur openSSH il est nécessaire de posséder une clé RSA sur sa machine.

Pour ceux qui n’auraient pas déjà une clé, on va en créer une à l’aide de l’outil ssh-keygen.

On va utiliser l’option -C pour renseigner un commentaire tel qu’une adresse email ou votre nom d’utilisateur et l’option -b pour préciser la taille en bits de notre clé.

L’usage de l’option -C n’est pas obligatoire mais si vous avez plusieurs utilisateurs sur le serveur et que vous devez faire le ménage dans les clés ce commentaire vous fera gagner un temps précieux.

ssh-keygen -t rsa -b 4096 -C "VOTRE@EMAIL.com"

Lors de la création de votre clé une passphrase va vous être demandée, prenez garde à bien la retenir ou la noter dans votre utilitaire de gestion de mot de passe c’est très important de ne jamais la perdre.

La commande va générer un dossier .ssh/ dans votre répertoire utilisateur.

Ce dossier contiendra 3 fichiers :

  • id_rsa : Votre clé privée à ne jamais donner.
  • id_rsa.pub : Votre clé publique qui sera partagée.
  • authorized_keys : Le fichier renseignant les clé publiques des utilisateurs pouvant se connecter à votre machine/serveur.

Modification des permissions pour éviter les erreurs :

chmod 0700 ~/.ssh
chmod 0600 ~/.ssh/id_rsa
chmod 0644 ~/.ssh/authorized_keys

Copie de la clé publique sur le serveur cible :

ssh-copy-id -i ~/.ssh/id_rsa.pub login@IP_SERVER

La commande va se charger de générer un dossier .ssh/ sur le serveur contenant le fichier .ssh/authorized_keys et c’est dans ce fichier que notre clé id_rsa.pub sera copiée, cela permettra d’effectuer la correspondance lors des futurs connexions.

Connexion pour valider notre configuration :

ssh login@IP_SERVER

Si tout est bon aucun mot de passe ne devrait être demandé lors de la connexion.

Pensez à sauvegarder le dossier .ssh/ et son contenu pour éviter de perdre l’accès à vos serveurs.

Configuration de openSSH Server

Avant de modifier votre /etc/ssh/sshd_config faites en une copie => sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.

Si vos modifications ne fonctionnent pas vous pourez toujours le restaurer pour repartir sur une base fonctionnelle.

A l’installation du package openssh-server votre distribution le préconfigure, nous allons le modifier afin de :

  • Refuser les login depuis le root.
  • Refuser l’identification par mot de passe.
  • N’accepter QUE l’authentification par clé.
  • Changer le port par défaut du SSH.
  • Augmentation du niveau de log.
  • On force l’usage du protocol niveau 2.
  • On retire le support ECDSA.
  • Déclaration des utilisateurs systèmes pouvant se connecter via AllowUsers.
  • Support IPv4 & IPv6.

Voici la configuration que cela donne :

# Interface & Port
Port 61022
AddressFamily any
ListenAddress 0.0.0.0
ListenAddress ::

HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

Protocol 2

SyslogFacility AUTHPRIV
LogLevel VERBOSE

# Authentication restriction
LoginGraceTime 30s
PermitRootLogin no
StrictModes yes
MaxAuthTries 3
MaxSessions 5

PubkeyAuthentication yes
AllowUsers hmichael
AuthorizedKeysFile  .ssh/authorized_keys .ssh/authorized_keys2

HostbasedAuthentication no
IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
PermitEmptyPasswords no
PasswordAuthentication no

# Change to no to disable s/key passwords
ChallengeResponseAuthentication no

UsePAM yes

AllowAgentForwarding no
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no
PermitTTY yes
PermitUserEnvironment no
PrintMotd no
PrintLastLog no

#TCPKeepAlive yes
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#ShowPatchLevel no
UseDNS yes
PidFile /var/run/sshd.pid
MaxStartups 10:30:100
PermitTunnel no
#ChrootDirectory none
VersionAddendum none

# no default banner path
Banner none

# Accept locale-related environment variables
AcceptEnv LANG LC_*

# override default of no subsystems
Subsystem   sftp   /usr/libexec/openssh/sftp-server

Pour prendre en charge notre configuration Il faut relancer le service sshd :

systemctl restart sshd.service

Dorénavant pour se connecter en SSH il faudra préciser le nouveau port à l’aide de l’option -p :

ssh login@IP_SERVER -p NUMERO_DE_PORT

N’hésitez pas à en faire un alias dans votre .bashrc ou .zshrc afin de gagner du temps !

Si vous avez un firewall actif n’oubliez pas d’ajouter la règle pour accepter la connexion sur ce nouveau port.

Cette base de configuration est bien plus propre mais elle n’augmente pas le niveau de chiffrement des communications effectuées au travers du SSH.

Pour cela nous allons effectuer des manipulations supplémentaires dans la suite de cet article.

Augmenter la sécurité des échanges

On va sécuriser les échanges en jouant sur 3 options supplémentaires :

  • Ciphers : Le chiffrement utilisé.
  • KexAlgorithms : Les algorithmes utilisés pour l’échange de clé.
  • MACs : Message Authentication code, c’est le code qui accompagnent les données échangées dans le but d’assurer leur intégrité pour être certain qu’elles n’ont subies aucune altération pendant/après la transmission.

Pour forcer notre serveur à utiliser ces options il est nécessaire d’effectuer quelques modifications qui diffèrent selon votre distribution.

CentOS 8

  • Régénèration des clé RSA & ED25519 du serveur :
sudo rm -f /etc/ssh/ssh_host_*
sudo ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N ""
sudo ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
sudo chgrp ssh_keys /etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_rsa_key
sudo chmod g+r /etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_rsa_key
  • Retrait des algorithmes “faibles” :
sudo awk '$5 >= 3071' /etc/ssh/moduli > /etc/ssh/moduli.safe
sudo mv -f /etc/ssh/moduli.safe /etc/ssh/moduli
  • Désactivation des clés DSA & ECDSA de notre configuration :
sudo sed -i 's/^HostKey \/etc\/ssh\/ssh_host_ecdsa_key$/\#HostKey \/etc\/ssh\/ssh_host_ecdsa_key/g' /etc/ssh/sshd_config
  • Restriction des ciphers, clés d’échange et des codes d’authentification :
# Sauvegarde du fichier originel
sudo cp /etc/crypto-policies/back-ends/opensshserver.config /etc/crypto-policies/back-ends/opensshserver.config.orig

# On injecte nos ciphers, clé et codes d'authentification
sudo echo -e "CRYPTO_POLICY='-oCiphers=chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr -oMACs=hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,umac-128-etm@openssh.com -oGSSAPIKexAlgorithms=gss-curve25519-sha256- -oKexAlgorithms=curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512 -oHostKeyAlgorithms=ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-512,ssh-rsa,ssh-rsa-cert-v01@openssh.com -oPubkeyAcceptedKeyTypes=ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-512,ssh-rsa,ssh-rsa-cert-v01@openssh.com'" > /etc/crypto-policies/back-ends/opensshserver.config
  • Redémarrage du service sshd :
sudo systemctl restart sshd.service

Ubuntu Server 18.04

  • Régénèration des clé RSA & ED25519 :
sudo rm /etc/ssh/ssh_host_*
sudo ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N ""
sudo ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
  • Retrait des algorithmes “faibles” :
sudo awk '$5 >= 3071' /etc/ssh/moduli > /etc/ssh/moduli.safe
sudo mv /etc/ssh/moduli.safe /etc/ssh/moduli
  • Désactivation des clés DSA & ECDSA de notre configuration :
sudo sed -i 's/^HostKey \/etc\/ssh\/ssh_host_\(dsa\|ecdsa\)_key$/\#HostKey \/etc\/ssh\/ssh_host_\1_key/g' /etc/ssh/sshd_config
  • On ajoute dans /etc/ssh/sshd_config les options suivantes :
# Ciphers, Keys, MACs, Protocol and Logs
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com
  • Redémarrage du service sshd :
sudo systemctl restart sshd.service

Debian Buster 10

  • Retrait des algorithmes “faibles” :
sudo awk '$5 >= 3071' /etc/ssh/moduli > /etc/ssh/moduli.safe
sudo mv /etc/ssh/moduli.safe /etc/ssh/moduli
  • Ajout dans /etc/ssh/sshd_config des options suivantes :
# Ciphers, Keys, MACs, Protocol and Logs
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com
  • Suppression de l’option HostKey /etc/ssh/ssh_host_rsa_key du sshd_config.

  • Redémarrage du service sshd :

sudo systemctl restart sshd.service

Commandes utiles

Des commandes qui peuvent être utiles :

  • sshd -T : Vous permet de tester votre configuration et de débug.
  • ssh -Q cipher : Liste les ciphers disponible sur votre serveur.
  • ssh -Q cipher-auth : Liste les ciphers d’authentification.
  • ssh -Q mac : Liste les MAC.
  • ssh -Q kex : Liste les algorithmes.
  • ssh -Q key : Liste les clé.

Tester son serveur

Voici 2 outils vous permettant de tester le niveau de sécurité de votre serveur openssh.

  • Le site ssh-audit.
  • L’outil python ssh-audit utilisable depuis votre terminal disponible ici.

Et comme vous pouvez le constater le site me donne une belle note de 100% (Serveur CentOS8) :

SSH-Audit100