Enforçing SSH
2025-2026
Vincent Julien
Objectif
Sécuriser nos accès SSH de nos serveurs Linux selon les bonnes pratiques de l’ANSSI
Présentation de nos machines
1 machine Rocky Linux 1 machine Rocky Linux
nommé VM01-SECURE nommée VM02-ATTACK
• 1 VCPU • 1 VCPU
• 1 Go de RAM • 1 Go de RAM
• 20 Go de stockage • 60 Go de stockage
• Configuration réseau : NAT • Configuration réseau : NAT
• Nous devrons sécuriser cette • Nous nous servirons de cette
machine machine exécuter des attaques
Quelques recommandations SSH
• Utilisation de protocoles sécurisées (SSH et pas de telnet)
• SSH à jour
A faire
• Installer les deux machines virtuelles
• Activer le root login
Utilisation des commandes SSH
Se connecter depuis une machine linux vers une autre
machine linux
ssh <nom_utilisateur>@<ipaddress> -p <num_port>
Exemple :
ssh julien@[Link] -p 15000
Utilisation des commandes SSH
Transférer des fichiers via SSH avec la commance scp
• scp <fichier> <username>@<ipaddressDistant>:<DestinationDirectory>
• Exemple :
• scp [Link] julien@[Link]:/home/Julien
Utilisation des commandes SSH
Transférer des répertoires via SSH avec la commande scp
• scp –r <répertoire> <username>@<ipaddressDistant>:<DestinationDirectory>
• Exemple :
• scp –r répertoire julien@[Link]:/home/Julien
Utilisation des commandes SSH
Récupérer des fichiers via SSH avec la commande scp
• scp –r <répertoire> <username>@<ipaddressDistant>:<DestinationDirectory>
• Exemple :
• scp julien@[Link]:/home/Julien/[Link] .
• Le poin permet de copier le fichier [Link] dans le répertoire courant
Utilisation des commandes SSH
Copier des fichiers entre deux machines avec une troisième
machine
scp utilisateur@VM01:chemin/fichier utilisateur @VM02:chemin/fichier
Pour utiliser les noms, il faut veiller à avoir la résolution de nom opérationnelle ( /etc/hosts)
Utilisation des commandes SSH
Synchroniser le contenu de deux répertoires avec rsync
• rsync -av --progress --stats utilisateur@machine:/srv/wiki /TEST 2>[Link]
• Permet de copier le repertoire /srv/wiki de la machine vers notre machine dans un répertoire
• -a : archive ⇒ préserve les dates, permissions, etc … des fichiers. Inclus l'option récursivité. Option à utiliser quand on veut transférer
des répertoires entiers avec leurs sous-répertoires en préservant toutes les caractéristiques des fichiers.
-r : la synchro est récursive (elle prend les sous-répertoires). Est inclus dans l'option -a
-v : verbeux (affichage de ce que fait la commande pendant qu'elle le fait).
-l : copie les liens symboliques comme liens symboliques. Est inclus dans l'option -a
-L : remplace les liens symboliques par les fichiers référencés.
--remove-sent-files : les fichiers envoyés sont supprimés de chez l'émetteur. Il ne s'agit donc plus de faire une synchro mais bien de faire
un transfert.
--delete : efface sur la cible les fichiers qui ont disparus du répertoire de départ. Option très importante qui permet d'être sûr que la
copie est identique à l'original. Mais si on se trompe sur l'original, on perd la copie.
--exclude=MOTIF : exclus de la synchro les fichiers correspondant au MOTIF (par exemple *.txt pour exclure les fichiers avec l'extension
.txt).
-z : comprime les fichiers pendant le transfert. N'a d’intérêt que pour des transferts à travers des réseaux, car sinon la compression /
décompression fait perdre du temps.
A faire :
• Créer l’arborescence suivante : /srv/test/copie/
• Créé l’utilisateur votre_nom sur les deux VMs
• Définir un mot de passe à votre utilisateur
• Dans ce répertoire créé un fichier test
• Copier le fichier test sur la machine VM02-ATTACK dans le
répertoire tmp
• Copier l’arborescence dans la machine VM02-ATTACK
• Créér plusieurs fichiers dans /srv/test/copie/
• puis utiliser RSYNC
• Vérifier si les fichiers sont présents
Configuration SSH
Par défaut, le fichier de configuration SSH est dans /etc/ssh/sshd_config
/etc/ssh/sshd_conf.d/10 ou [Link]
• SSH fonctionne sur le port 22
• Il est recommandé pour des machines exposés sur Internet de
changer le port par défaut ( sécurisation par offuscation )
• ATTENTION, il est indispensable de logger les tentatives
A faire :
• Changer le port de fonctionnement sur le port 15000
Tester une attaque par dictionnaire
La synthase de la commande
Sur la VM
dnf install epel-release ATTACK hydra est la ci-contre :
dnf install git make gcc wget hydra -l < nom d'utilisateur > -P <
dnf install libssh2-devel.x86_64 mot de passe fichier de > -s < port
dnf install libssh-devel.x86_64 > -V < ip > < protocole >
mkdir hydra
Git clone [Link]
• Exemple :
Dans le répertoire : hydra -l admin -P /tmp/xaa
[Link] ssh
• ./configure
On peut mener des attaques sur
• make l’ensemble des services
• make install
Récupérer le dictionnaire [Link]
On va devoir découper le fichier avec split car hydra gere des fichiers avec 50000000 de lignes
split –l 40000000 [Link]
A faire
Modifier dans le ssh conf de la VM-SECURE le MaxAuthTries à 0
• Tester l’attaque par dictionnaire depuis la VM-ATTACK sur la VM-
SECURE
• On peut voir les tentatives dans cat /var/log/secure
Contrer les attaques par dictionnaire/brute
force
Fail 2 Ban est un IPS ( système prévention intrusion)
• Disponible sur le repo EPEL
• Par défaut, il n’y a aucune prison
Installation fail2ban
• sudo dnf install epel-release
• Faire O
• dnf install fail2ban
• On démarre le service :
• sudo systemctl start fail2ban
• On active son démarrage
automatique
• sudo systemctl status fail2ban
• fail2ban-client status
• On va créer le fichier : • [sshd]
• /etc/fail2ban/jail.d/[Link] • enabled = true
• port = 15000
• logpath = %(sshd_log)s
• backend = %(sshd_backend)s
• bantime = 60h
• fail2ban-client status • maxretry = 3
• On retrouve les logs dans :
var/log/secure
• Avec cette commande, nous
voyons l’ip banni :
• fail2ban-client status sshd
• Pour débannir l’adresse IP :
• fail2ban-client set sshd unbanip IP
A faire
• Installer sur la VM-SECURE fail2ban
• Configurer la prison ssh
• Tester le blocage d’IP
• Débloquer son IP
Changer le port de fonctionnement de ssh
Changer le port dans le fichier
ssh
• En changeant la valeur de Port
• Par défaut le port 22
• Ouvrir le port dans le firewall
• Ajouter une condition selinux :
• semanage port -a -t ssh_port_t -
p tcp 15000
• Il faut redémarrer le service
Whitelist
Via firewall-cmd
• Pour cela, nous devons créér une nouvelle zone dans notre firewall :
• firewall-cmd --permanent --new-zone=zone_ssh --add-source=IP
• firewall-cmd --permanent --zone=zone_ssh --add-service=ssh
• firewall-cmd –reload
• firewall-cmd --get-active-zones
• firewall-cmd --list-all && firewall-cmd --zone=ssh-limited --list-all
• firewall-cmd --permanent --remove-service=ssh
A faire :
• Changer le port de ssh par 15000 sur la machine VM01-SECURE
:
• Se connecter depuis la machine VM02 en ssh sur VM01-
SECURE
• Mettre une restriction de connexion sur les Ips.
• Limiter seulement votre IP pouvant se connecter sur le serveur ssh
• Puis enlever l’autorisation pour vérifier le bon focntionnement
Rappel : chiffrement symétrique (MOOC
ANSSI)
• Etape 1 :
• La cryptographie symétrique est
également appelée cryptographie à clé
secrète. Une même clé secrète est
partagée entre deux interlocuteurs, et
ceux-ci doivent connaître la clé pour
pouvoir communiquer.
Etape 2 :
• Avec ce procédé, il est donc
nécessaire de disposer d'un
moyen sûr pour échanger
cette clé.
• Les opérations sont dites
symétriques. La même clé est
utilisée à la fois pour chiffrer
et déchiffrer.
Etape 3 :
• Pour illustrer le procédé de la
cryptographie symétrique,
prenons l’exemple d’un coffre
sécurisé par une serrure.
• Si vous voulez y cacher un
secret, il vous faudra
posséder la clé vous
permettant d’ouvrir le coffre
pour y déposer votre secret
et ensuite le refermer avec
cette même clé.
Etape 4 :
• Maintenant, imaginons que
vous souhaitiez partager
votre secret avec quelqu’un
en lui donnant accès au
coffre. Il vous faut pour cela
transmettre la clé à cette
autre personne.
• Et pour que vous soyez seuls
à connaître le contenu du
coffre, la clé doit donc rester
secrète.
Rappel : chiffrement asymétrique (MOOC ANSSI)
• Cette approche est basée sur
l’utilisation de 2 clés, une clé
publique et une clé privée qui sont
dépendantes l’une de l’autre.
• La clé « publique » est une clé qui
permet de chiffrer le message.
• La clé « privée » est une clé qui
permet, quant à elle, de déchiffrer
le message.
Etape 1 :
• Pour comprendre son fonctionnement,
reprenons l’exemple du coffre vu
précédemment.
• Imaginons que le coffre ne puisse être utilisé
qu’une seule fois et qu’il se ferme au moyen
d’un cadenas.
• Si vous souhaitez confier un secret au coffre
doté de ce système de fermeture, nul besoin
de posséder la clé du cadenas puisqu’il suffit
de le refermer.
Etape 2 :
• Ce cadenas refermable représente la clé
publique qui permet de chiffrer le message et
qui vous a préalablement été transmis par
votre interlocuteur pour échanger en toute
sécurité avec lui.
• Ainsi, seul votre interlocuteur pourra accéder
au contenu du coffre grâce à une clé qu’il est
seul à posséder et qui est aussi l’unique
moyen de déverrouiller le cadenas et donc
d’ouvrir le coffre : sa clé privée.
Exemple :
• Alice veut envoyer un message à
Bob.
• Bob envoie à Alice la clé publique
qui va lui permettre de chiffrer le
message. Alice chiffre le message
avec la clé publique de Bob et
l'envoie sur le réseau.
• Ce qui change ici, c’est que seul Bob, qui
possède la clé privée correspondant à la clé
publique qu’il a faite parvenir à Alice,
pourra déchiffrer le message.
• La clé privée n’ayant pas été transmise
entre Alice et Bob, elle n’est pas susceptible
d’être interceptée.
Génération clé sous Linux
Avec son utilisateur
• On exécute la commande :
• Ssh-keygen –b 4096
• Puis on saisit une passphrase
• On peut voir les clés dans le
répertoire .ssh de l’utilisateur
• ls -al .ssh
Utilisation des commandes SSH
Copier ma clé public sur un serveur distant
• Dnf install openssh (sur nos machines)
• Avoir dans son .ssh sa clé public et privé
• ssh-copy-id <username>@<hostname>
• Voilà, votre clé publique a bien été copiée dans le fichier
~/.ssh/authorized_keys de l’utilisateur sur le serveur distant !
Utilisation de la clé avec Windows
• Dans putty, on va saisir l’ip du serveur, son port ssh
et surtout dans la rubrique Private key, on va
chercher notre private key. Puis faire « open »
Utilisation de la clé avec linux
• On va utilise la commande :
• ssh -i /home/julien/.ssh/id_rsa
julien@[Link]
• -i pour spécifier sa clé privé
• Ensuite l’utilisateur et le serveur
Utilisation des commandes SSH
Se connecter avec une clé public depuis une machine linux :
• ssh <username>@<hostname>
• Puis renseigner la passphrase
A faire
Générer votre clé ssh depuis votre machine linux
• Mettre une passphrase
• Récupérer votre clé privée sur votre Windows
• Faire une tentative de connexion depuis windows
• Depuis la VM01 déposer votre clé public sur le serveur VM02
• Faire un test de connexion depuis VM01
Optimisation de la sécurité ssh
• PermitRootLogin no
• PubkeyAuthentication yes
• PasswordAuthentication no
• PermitEmptyPassword no
A faire
• Bloquer le root login
• Obligation de connexion avec clé
• Connexion par clé activé
• Bloquer les comptes n’ayant pas de mdp
2FA
dnf install epel-release
dnf install google-authenticator qrencode qrencode-libs
sudo nano /etc/pam.d/sshd
auth required pam_google_authenticator.so
sudo nano /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
UsePAM yes
PubkeyAuthentication yes
systemctl restart sshd
Installer sur votre tel google auth
google-authenticator
Faire Y
Mettre en place une bannière
Dans le fichier de conf ssh
• Banner /etc/banner
• Créér un fichier banner dans
/etc
• (Il y a des générateurs en ligne)
A faire
• Mettre en place une bannière de connexion sur chaque serveur
Limitation des utilisateurs pour ssh
Nous souhaitons une limitations des utilisateurs à se connecter
en ssh
• Dans le fichier de conf ssh, il y a un attribut DenyUsers
• Il faut spécifier le nom de l’utilisateur pour bloquer l’authentification
• SI on souhaite bloquer plusieurs utilisateurs, on utilisera l’espace
• On peut également avec AllowUsers autorisé seulement certains
utilisateurs
A faire
• Créer un utilisateur test
• Bloquer l’utilisateur test à faire du ssh
• Tester l’impossibilité de se connecter
Limitation du temps de connexion
• Nous pouvons également définir un temps de déconnexion
automatique en cas d’inactivité :
• ClientAliveInterval permet de définir le timeout en cas d’idle en
secondes
• ClientAliveCountMax nombre maximal de requêtes ClientAliveInterval
sans réponse que tolérera le serveur avant de fermer la connexion.
A faire
• Créer un utilisateur test
• Bloquer l’utilisateur test à faire du ssh
• Tester l’impossibilité de se connecter
Whitelist
Il faut également filter les IPs capable de se connecter
• On peut faire cela avec firewalld, intégrer par défaut dans rocky :,
• Je regarde ma zone ma défaut : firewall-cmd --get-default-zone
• firewall-cmd --permanent --zone=public --add-source=192.168.X.X/24 ou
/32 pour une IP
• Systématiquement, en cas de régle permanent fans le firewalld, il faut
recharger :
• firewall-cmd --reload
A faire
• Tester d’autoriser une seule IP (autre que votre deuxième machine) et
faire un test de connexion
• Tester d’autoriser l’ip de votre machine et refaites le même test
Pour auditer cela :
• Dnf install pip
• Pip install ssh-audit