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.
Clé RSA pour SSH
Initialement le protocole SSH nous permet l'identification par mot de passe sur le port 22.
C'est insuffisant en terme de sécurité.
Pour améliorer cela on va réaliser quelques modifications.
Création et mise en place d'une clé RSA
On va créer notre clé RSA à l'aide de ssh-keygen
en utilisant l'option -C
pour renseigner un commentaire tel qu'une adresse email ou votre nom d'utilisateur et l'option -b
afin de préciser la taille en bits de notre clé.
Vous n'êtes pas obligé mais si vous avez plusieurs utilisateurs sur le serveur auquel vous accédez et que vous devez faire le ménage dans les clés c'est bien plus simple pour les identifier.
ssh-keygen -t rsa -b 4096 -C "VOTRE@EMAIL.com"
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. (non fonctionnel sans la passphrase)
- id_rsa.pub : Votre clé publique. (Celle que l'on partage)
- authorized_keys : Le fichier renseignant les clé publiques des utilisateurs pouvant se connecter à votre machine/serveur.
On va modifier les permissions pour éviter les erreurs :
chmod 0700 ~/.ssh
chmod 0600 ~/.ssh/id_rsa
chmod 0644 ~/.ssh/authorized_keys
!!! ATTENTION
Lors de la création de votre clé RSA 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 perdre cette passphrase.
On copie notre 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/
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.
On se connecte pour valider notre configuration :
ssh login@IP_SERVER
Si tout est bon aucun mot de passe ne devrait être demandé lors de la connexion.
!!! INFO
Pensez à sauvegarder le dossier .ssh/
ainsi que son contenu cela vous évitera de perdre l'accès à vos serveurs...
Configuration de openSSH Server
!!! ATTENTION
* Avant de modifier votre /etc/ssh/sshd_config
faites en une copie => cp -p /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.
- Déclaration des utilisateurs systèmes pouvant se connecter via
AllowUsers
.
Voici la configuration que cela donne :
# Interface & Port
Port 60022
AddressFamily inet
ListenAddress 0.0.0.0
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
# It is recommended to use pam_motd in /etc/pam.d/sshd instead of PrintMotd,
# as it is more configurable and versatile than the built-in version.
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
Cette base est suffisante en terme de sécurité dans la majorité des cas.
Pour prendre en charge notre configuration nous devons relancer le service sshd :
systemctl restart sshd.service
Désormais 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
!!! ATTENTION
Si vous avez un parefeu n'oubliez pas d'éditer les règles afin d'accepter ce nouveau port.
Augmenter le niveau de sécurité
On peut aller encore plus loin en jouant sur quelques options, je vais pas toutes les détailler les principales étant l'ajout des options :
- 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 doné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.
Afin de forcer notre serveur à utiliser ces options il est nécessaire d'effectuer quelques modifications qui diffèrent selon votre distribution.
Commandes utiles
Voici quelques commandes utiles avant de poursuivre :
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é.
CentOS 8
- On régénère les clé RSA & ED25519 du serveur :
rm -f /etc/ssh/ssh_host_*
ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N ""
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
chgrp ssh_keys /etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_rsa_key
chmod g+r /etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_rsa_key
- On retire les algorithmes "faible" :
awk '$5 >= 3071' /etc/ssh/moduli > /etc/ssh/moduli.safe
mv -f /etc/ssh/moduli.safe /etc/ssh/moduli
- On désactive les clés DSA & ECDSA de notre configuration :
sed -i 's/^HostKey \/etc\/ssh\/ssh_host_ecdsa_key$/\#HostKey \/etc\/ssh\/ssh_host_ecdsa_key/g' /etc/ssh/sshd_config
- On restreint les ciphers, clés d'échange et les codes d'authenficiation :
# Sauvegarde du fichier originel
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
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
- On redémarre le service sshd :
systemctl restart sshd.service
!!! SUCCESS
Votre serveur openssh est maintenant très sécurisé !
Ubuntu Server 18.04
- On régénère les clé RSA & ED25519 :
rm /etc/ssh/ssh_host_*
ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N ""
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
- On retire les algorithmes "faible" :
awk '$5 >= 3071' /etc/ssh/moduli > /etc/ssh/moduli.safe
mv /etc/ssh/moduli.safe /etc/ssh/moduli
- On désactive les clés DSA & ECDSA de notre configuration :
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
- On redémarre le service sshd :
systemctl restart sshd.service
!!! SUCCESS
Votre serveur openssh est maintenant très sécurisé !
Debian Buster 10
- On retire les algorithmes "faible" :
awk '$5 >= 3071' /etc/ssh/moduli > /etc/ssh/moduli.safe
mv /etc/ssh/moduli.safe /etc/ssh/moduli
- 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
systemctl restart sshd.service
!!! SUCCESS
Votre serveur openssh est maintenant très sécurisé !
Tester son serveur
Voici 2 outils vous permettant de tester le niveau de sécurité de votre serveur openssh.
Et comme vous pouvez le constater le site me donne une belle note de 100% (Serveur CentOS8) :
Contribution : Merci à <a href="https://github.com/s7relok" target="_blank">Lobotommy</a> pour m'avoir servi de "cobaye" pour Debian.
Tutoriel fait par @hmichael