0. Préambule
0.1. Présentation
Nous allons permettre à un utilisateur (user) d'utiliser un client SSH pour se connecter à un serveur SSH (host) puis de s'authentifier grâce à une paire de clé.
Ces opérations (connexion puis authentification) seront validées par une chaine de certification.
Dans cette documentation, l'utilisateur test@srvbackup01.info.lan va se connecter en tant que transfert@srvapache01.info.lan grâce à sa paire de clés RSA.
0.2. Pré-requis
Nous avons besoin de 3 ordinateurs :
-
srvauth01.info.lan = Autorité de Certification SSH
-
srvapache01.info.lan = Serveur SSH
-
srvbackup01.info.lan = Client SSH
Nous avons besoin que la résolution DNS soit fonctionnelle sur tous les ordinateurs.
Nous avons besoin d'au minimum 5 utilisateurs :
-
root@srvauth01.info.lan = administrateur de la machine
-
root@srvapache01.info.lan = administrateur de la machine
-
test@srvapache01.info.lan = utilisateur de test
-
root@srvbackup01.info.lan = administrateur de la machine
-
test@srvbackup01.info.lan = utilisateur de test
1. Création de l'Autorité de Certification (AC)
Nous allons créer une chaine de certification pour les hosts (serveurs) et une chaine de certification pour les users (utilisateurs).
1.1. Préparation de l'espace de travail de l'autorité de certification
Nous ouvrons une session root@srvauth01.info.lan
Nous créons un dossier ssh_ca dans le dossier home de l'utilisateur root (/root)
mkdir /root/ssh_ca/
1.2. Génération des paires de clés
Nous allons générer une paire de clés pour la chaine de certification des hosts (serveurs) et une paire de clés pour la chaine de certification des users (utilisateurs) .
1.2.1. Chaine HOSTS
Nous générons une paire de clés RSA 2048 bits :
ssh-keygen -t rsa -b 2048 -f /root/ssh_ca/ssh_ca_hosts_rsa_key -C "AC HOSTS"
Une clé privée (format standard) est générée dans le fichier ssh_ca_hosts_rsa_key
Une clé publique (format SSH) est générée dans le fichier ssh_ca_hosts_rsa_key.pub
1.2.2. Chaine USERS
Nous générons une paire de clés RSA 2048 bits :
ssh-keygen -t rsa -b 2048 -f /root/ssh_ca/ssh_ca_users_rsa_key -C "AC USERS"
Une clé privée (format standard) est générée dans le fichier ssh_ca_users_rsa_key
Une clé publique (format SSH) est générée dans le fichier ssh_ca_users_rsa_key.pub
1.3. Création des certificats "racine"
Nous allons auto-signer des certificats "racine" avec les clés générées précédemment
1.3.1. Chaine HOSTS
Génération d'un certificat depuis la clé publique de l'AC HOSTS :
ssh-keygen -s /root/ssh_ca/ssh_ca_hosts_rsa_key -I ca_hosts -h -n srvauth01.info.lan -V +52w /root/ssh_ca/ssh_ca_hosts_rsa_key.pub
Un certificat SSH est généré dans le fichier ssh_ca_hosts_rsa_key-cert.pub
1.3.2. Chaine USERS
Génération d'un certificat depuis la clé publique de l'AC USERS :
ssh-keygen -s /root/ssh_ca/ssh_ca_users_rsa_key -I ca_users -h -n srvauth01.info.lan -V +52w /root/ssh_ca/ssh_ca_users_rsa_key.pub
Un certificat SSH est généré dasn le fichier ssh_ca_users_rsa_key-cert.pub
2. Configuration des hosts (serveurs SSH)
Nous allons générer un certificat SSH par host puis nous allons lui indiquer comment vérifier les hosts et les users.
2.1. Installation des chaines de certification
2.1.1. Génération du certificat d'hote
Nous ouvrons une session root@srvauth01.info.lan
Nous allons préparer les fichiers nécessaires à la configuration de srvapache01.info.lan
Création d'un dossier de travail :
mkdir /root/ssh_ca/srvapache01.info.lan/
Récupération de la clé publique :
scp root@srvapache01.info.lan:/etc/ssh/ssh_host_rsa_key.pub /root/ssh_ca/srvapache01.info.lan/
Création du certificat :
ssh-keygen -s /root/ssh_ca/ssh_ca_hosts_rsa_key -I host_srvapache01 -h -n srvapache01.info.lan -V +52w /root/ssh_ca/srvapache01.info.lan/ssh_host_rsa_key.pub
2.1.2. Installation du certificat d'hote et de la clé publique de vérification des utilisateurs
Nous ouvrons une session root@srvauth01.info.lan
Copie du certificat sur l'hôte :
scp /root/ssh_ca/srvapache01.info.lan/ssh_host_rsa_key-cert.pub root@srvapache01.info.lan:/etc/ssh/
Copie de la clé publique de l'AC USERS sur l'hôte :
scp /root/ssh_ca/ssh_ca_users_rsa_key.pub root@srvapache01.info.lan:/etc/ssh/
2.2. Configuration des serveurs SSH (SSHD)
Nous ouvrons une session root sur srvapache01.info.lan et sur srvbackup01.info.lan
Modification de la configuration de SSHD :
vi /etc/ssh/sshd_config
Nous devons indiquer au serveur SSH où trouver son certificat :
HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub
Nous devons indiquer au serveur SSH où trouver la clé publique permettant de vérifier les certificats des utilisateurs :
TrustedUserCAKeys /etc/ssh/ssh_ca_users_rsa_key.pub
Redémarrage du service :
service ssh restart
3. Configuration de la partie "client"
3.1. Génération du certificat utilisateur depuis l'AC
Nous allons préparer les fichiers nécessaires à l'authentification de test@srvbackup01.info.lan
Nous ouvrons une session root@srvauth01.info.lan
Création d'un dossier de travail :
mkdir -p /root/ssh_ca/srvbackup01.info.lan/test/
Récupération de la clé publique :
scp test@srvbackup01.info.lan:/home/test/.ssh/id_rsa.pub /root/ssh_ca/srvbackup01.info.lan/test/
Création du certificat :
ssh-keygen -s /root/ssh_ca/ssh_ca_users_rsa_key -I test_user -n test -V +52w /root/ssh_ca/srvbackup01.info.lan/test/id_rsa.pub
Copie du certificat dans le profil de l'utilisateur :
scp /root/ssh_ca/srvbackup01.info.lan/test/id_rsa-cert.pub test@srvbackup01.info.lan:/home/test/.ssh/
3.2. Configuration du client SSH (déclaration de l'AC HOSTS)
Nous allons indiquer au client SSH comment vérifier le certificat du serveur SSH. Pour cela nous allons designer la clé publique de l'AC HOSTS comme @cert-authority de *.info.lan.
Il suffit d'ajouter la ligne suivante dans le fichier known_hosts de l'utilisateur (~/.ssh/known_hosts) ou de l'ordinateur (/etc/ssh/ssh_known_hosts) :
@cert-authority *.info.lan <clé publique SSH de l'AC HOSTS>
3.2.1. Génération d'un fichier known_hosts de référence
Nous ouvrons une session root@srvauth01.info.lan
printf "@cert-authority *.info.lan $(cat /root/ssh_ca/ssh_ca_hosts_rsa_key.pub)" > /root/ssh_ca/known_hosts
3.2.2. Ajout de l'AC HOSTS pour un utilisateur
Nous ouvrons une session root@srvauth01.info.lan
Remplacement du fichier known_hosts de l'utilisateur test@srvbackup01.info.lan
scp /root/ssh_ca/known_hosts test@srvbackup01.info.lan:/home/test/.ssh/
3.2.3. Ajout de l'AC HOSTS pour un ordinateur
Nous ouvrons une session root@srvauth01.info.lan
Remplacement du fichier ssh_known_hosts de srvbackup01.info.lan
scp /root/ssh_ca/known_hosts root@srvbackup01.info.lan:/etc/ssh/ssh_known_hosts
Nous pouvons changer l'emplacement de ce fichier en modifiant la directive GlobalKnownHostsFile du fichier /etc/ssh/ssh_config :
GlobalKnownHostsFile /etc/ssh/known_hosts