Dans ce tutoriel, vous allez apprendre à installer le service SSH sur Debian et à configurer l’environnement en fonction de vos besoins.
Installer openssh
sudo dnf install openssh-server
Ajouter la règle de pare-feu
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Tester la connexion depuis un terminal
La commande est la même en invite de commande ou en powershell
ssh [nom_user]@[ip_serveur]
Pour ma part ici ce sera
ssh ilan@172.16.244.143
La commande est la même peu importe l'environnement (debian, ubuntu, fedora, etc...)
ssh [nom_user]@[ip_serveur]
Pour ma part ici ce sera
ssh ilan@172.16.244.143
Toute la configuration s'effectuera depuis le dossier /etc/ssh donc je me déplace dedans
cd /etc/ssh
Modifiez le fichier /etc/ssh/sshd_config
sudo vim sshd_config
Ajoutez la ligne suivante n'importe où
Protocol 2
Redémarrez le serveur ssh
sudo systemctl restart sshd
Pour vérifier que cela fonctionne bien j'essaie de me connecter en version 1
ssh -1 ilan@172.16.244.143
Vous aurez alors le message
SSH protocol v.1 is no longer supported
Super ! Vous savez maintenant comment protéger SSH des versions de protocole obsolètes !
Pour interdire de se connecter en root, toujours dans le fichier /etc/ssh/sshd_config décommentez la ligne suivante et si la valeur est à "prohibit-password" changez là en "no" comme ci-dessous
PermitRootLogin no
Redémarrez le serveur ssh
sudo systemctl restart sshd
Si vous essayez de vous connecter en root cela ne fonctionnera pas
ssh root@172.16.244.143
root@172.16.244.143's password:
Permission denied, please try again.
Vous aurez plusieurs fois le permission denied jusqu'à 3 tentatives par défaut.
Super ! Vous savez maintenant comment protéger SSH en empêchant les accès à root à distance !
Toujours dans le fichier /etc/ssh/sshd_config, décommentez la ligne "ListenAddress" et renseignez l'adresse ip de votre serveur, cela permettra de signaler que vous souhaitez que le serveur écoute les requêtes uniquement sur cette ipv4
ListenAddress 172.16.244.143
Redémarrez le serveur ssh
sudo systemctl restart sshd
Ensuite ajouter 2 règles de pare-feu, une qui autorise le passage du port 22 si l'ip source est dans votre réseau local (pour ma part 172.16.244.0/24) et une second qui rejette toutes les requêtes.
Attention à l'ordre dans lequel vous mettez vos règles de pare-feu, très souvent si une règle bloque avant d'autoriser l'autorisation en sera pas pris en compte, renseignez donc la règle qui accepte avant la règle qui bloque
Si comme moi vous avez le profil qui bloque par défaut la seconde règle n'est pas obligatoire puisqu'aucunes requêtes sauf celles autorisés ne passent.
sudo iptables -I INPUT -p tcp --dport 22 -s 192.168.0.0/16 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j REJECT
Super ! Vous savez maintenant comment protéger SSH en empêchant les accès en dehors du réseau local !
Toujours dans le fichier /etc/ssh/sshd_config, décommentez la ligne "Port" et ajoutez le port que vous souhaitez par défaut, par exemple le port 5000
Port 5000
Ajoutez le port dans la liste des ports autorisés par SELinux
sudo semanage port -a -t ssh_port_t -p tcp 5000
Testez la connexion depuis votre client avec le port
ssh ilan@172.16.244.143 -p 5000
Super ! Vous savez maintenant comment changer le port de connexion par défaut
Vous pouvez mettre en place un "timeout" à la connexion, cela signifie qu'au bout de la durée atteinte (exemple ci-dessous de 30 secondes), l'utilisateur aura 30 secondes pour se connecter.
Décommentez l'option "LoginGraceTime" et réessayez de vous connecter.
LoginGraceTime 30
ssh ilan@172.16.244.143 -p 5000
Attendez 30 secondes puis rentrez votre mot de passe, le message suivant apparait :
Connection closed by 172.16.244.143 port 5000
Par défaut pour notre session expire au bout d'un certain temps, ce qui n'est pas pratique.
Il est possible d'envoyer de requêtes permettant de maintenir en vie la session.
Pour cela il va falloir défini une interval de durée de vie.
Rendez-vous dans le fichier /etc/ssh/sshd_config & décommentez la valeur ClientAliveInterval
Ici je configure mon serveur de sorte à ce que l'intervale soit ``360
ClientAliveInterval 360
Cela signifie que toutes les 360 secondes une requête sera envoyé au serveur pour garder en vie ma session !
Pour désactiver les connexions sans mot de passe, il vous suffit d'ajouter l'option PermetEmptyPasswords
PermitEmptyPasswords no
Super ! Vous savez maintenant sécuriser la connexion en empêchant des mot de passes vide !
Pour limiter le nombre maximum de tentatives, il suffit d'ajouter l'option MaxAuthTries et de renseignez le nombre de tentatives que vous souhaitez.
Par exempe ici je défini le nombre maximum de tentatives à 2
MaxAuthTries 2
Je redémarre le service sshd
sudo systemctl restart sshd
Si je me trompe de mot de passe 2 fois, voici le mesasge qui apparait !
Received disconnect from 172.16.244.143 port 5000:2: Too many authentication failures
Disconnected from 172.16.244.143 port 5000
Super ! Vous savez maintenant sécuriser la connexion en limitant le nombre de tentatives avant échec
Pour limiter le nombre de sessions pour un utilisateur, pour cela je vais créer un utilisateur du nom de "toto" qui me servira de test.
sudo useradd toto
sudo passwd toto
Je vais ensuite aller modifier le fichiers /etc/security/limits.conf qui me permettra de définir quels utilisateurs/groupes limiter.
sudo vim /etc/security/limits.conf
Ici je spécifie donc que l’utilisateur “toto” sera en mode “hard” et que le maximum de connexions (maxlogins) est de 1.
toto hard maxlogins 1
Il existe dans ce fichier “limits.conf” 2 options hard et soft, l’option “hard” signifie qu’il faut être un administrateur (root) pour changer la limitation. Tandis que “soft” signifie que l’utilisateur pourrait changer l’option lui-même s’il le souhaite.
Je redémarre le service sshd
sudo systemctl restart sshd
Je test depuis le premier onglet de mon terminal, il me reste actuellement 1 connexion de libre puisque le nombre maximum de connexion est 1. J’arrive donc bien à me connecter.
Par contre si je test sur un second terminal ou un second client, le message suivant apparait !
There were too many logins for 'toto'
Pour un groupe d'utilisateur même principe, je créer le groupe.
sudo addgroup tutossh
J'ajoute l'utilisateur au groupe.
sudo usermod -G tutossh toto
Je modifier le fichier de configuration
sudo vim /etc/security/limits.conf
A la place de l'utilisateur, je précise le nom du groupe avec un symbole @ pour spécifier qu'il s'agit d'un groupe
@tutossh hard maxlogins 1
Je redémarre le service sshd
sudo systemctl restart sshd
Même résultat si j'essaie de me connecter avec le compte toto !
There were too many logins for 'toto'
Super ! Vous savez maintenant sécuriser la connexion en limitant le nombre de tentatives avant échec
Pour limiter les accès à seulement un ou plusieurs utilisateurs, dans le fichier /etc/ssh/sshd_config
Ajouter la mention "AllowUsers" suivi de chacun des noms d'utilisateurs séparé par des virgules
Par exemple si je souhaites autoriser l'utilisateur toto & tata
AllowUsers toto,tata
Je redémarre le service sshd
sudo systemctl restart sshd
Si je test la connexion avec un compte n'étant pas dans la liste (ex : ilan) vous aurez ce message.
Permission denied, please try again.
Pour les groupes pareil sauf qu'au lieu d'ajouter AllowUsers ajoutez la mention AllowGroups !
AllowGroups tutossh
Je redémarre le service sshd
sudo systemctl restart sshd
Si je test la connexion avec un compte n'étant pas dans le groupe (ex : ilan) vous aurez ce message.
Permission denied, please try again.
Depuis votre client générer une clé ssh avec ssh-keygen
ssh-keygen
Il vous proposera alors d'entrer le chemin dans lequel déposer le certificat, par exemple pour ma part il s'appellera cert
dans /home/ilan/.ssh
Vous pouvez créer une "passphrase" mais ceci n'est pas obligatoire.
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ilan/.ssh/id_rsa): /home/ilan/.ssh/cert
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Une fois le certficat généré, dans /home/ilan/.ssh/ vous avez la clé privé cert
& la clé public cert.pub
ls /home/ilan/.ssh/
cert cert.pub
Je vais maintenant envoyer la clé public dans le serveur avec ssh-copy-id
dont voici la synthaxe
ssh-copy-id [username]@[ip.du.serveur]
Pour ma part ce sera donc ilan@172.16.244.143
ssh-copy-id ilan@172.16.244.143
Si l'erreur suivante apparait
/usr/bin/ssh-copy-id: ERROR: No identities found
Il faudra simplement que vous précisiez "l'identité" à transférer avec l'option -i, l'identité en question est la clé publique.
Précisez le port avec l'option -p
ssh-copy-id -i /home/ilan/.ssh/cert.pub ilan@172.16.244.143 #SansPort
ssh-copy-id -i /home/ilan/.ssh/cert.pub -p 5000 ilan@172.16.244.143 #AvecPort
Une authentification auprès du serveur sera effectuée & il transfèrera votre clé publique
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "cert.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
ilan@172.16.244.143's password:
Une fois votre mot de passe rentré il vous expliquera que la clé a été ajouté
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'ilan@172.16.244.143'"
and check to make sure that only the key(s) you wanted were added.
Pour vérifier que la connexion s'effectue bien, connectez vous en utilisant la clé privé (toujours avec l'option -p si vous avez besoin du port spécifique)
ssh -i /home/ilan/.ssh/cert ilan@172.16.244.144 #SansPort
ssh -i /home/ilan/.ssh/cert -p 5000 ilan@172.16.244.144 #AvecPort
Si vous avez une passphrase il vous la demandera
Enter passphrase for key 'cert':
Pour finaliser la configuration, modifiez la configuration du serveur SSH dans /etc/ssh/sshd_config afin de ne pas autoriser les connexions par mot de passe (forçant ainsi l'utilisation de certificats)
PasswordAuthentication no
Redémarrez ensuite sshd
sudo systemctl restart sshd
Réessayez la connexion
ssh -i /home/ilan/.ssh/cert ilan@172.16.244.144 #SansPort
ssh -i /home/ilan/.ssh/cert -p 5000 ilan@172.16.244.144 #AvecPort
Super ! Vous savez maintenant comment configurer l'authentification ssh avec un certificat !
Vous savez maintenant comment configurer SSH sur un environnement Linux.
Vous pouvez aller plus loin, si vous le souhaitez, n’hésitez pas à me contacter dans ce cas ou à vous renseigner sur les autres tutos présents sur mon wiki ou directement sur Google !
v2 - Merci à Antoine Armandy pour la correction de quelques fautes !
v1 - Version initiale
v2 - Corrections de fautes d'orthographe/grammaire/etc...