Authentification SSH par agent sur CentOS/Fedora
Contexte
Lorsque l'on manipule des serveurs sous GNU/Linux, on utilise de manière quasiment exclusive nos si chères et si pratiques/efficaces/magiques commandes en utilisant très souvent le Secure Shell aussi appelé : SSH !
J'ai un serveur qui héberge ce blog entre autre et un NAS chez moi afin d'y entreposer ces indispensables sauvegardes ! Quoi de mieux que de passer par un script pour effectuer les différentes opérations ! Voilà que notre script peut très rapidement avoir besoin de copier un certains nombre de fichiers vers ce NAS via la commande scp par exemple. Tout ceci est parfait mais comment ne pas devoir entrer son mot de passe ou le stocker en clair à l'aide d'une quelconque bidouille ou commande bizarres ? Utiliser un système d'authentification proposé par ce formidable outil !
Prérequis
Tout d'abord vérifions coté serveur que nous disposons bien des paquets nécéssaires et l'autorisation d'authentification par clé RSA :
#
yum install openssh-server openssh-client openssh
$ grep RSA /etc/sshd_config
RSAAuthentication yes
Que notre serveur SSH est lancé et se lance au démarrage du serveur ( ):
# /etc/init.d/sshd status ou # service sshd status
# chkconfig sshd on
S'il n'est pas démarré, un simple # service sshd start
doit suffire !
Fonctionnement
Un schéma vaut mieux qu'une explication :Source : http://geekfault.org - license Creative Commons
Génération d'une clé RSA ou DSA
Une fois ce qu'il faut d'activé et de configuré côté serveur, nous nous rendons sur le client. C'est sur cette machine que nous ne voulons plus rentrer ce mot de passe si long et compliqué
Rendez vous dans votre home de l'utilisateur qui voudra se connecter au serveur SSH sans donner de mot de passe mais en utilisant ce système d'authentification.
$ cd
$ ssh-keygen -t rsa
Nos clés se trouvent en théorie dans /home/monuser/.ssh/ avec comme nom id_rsa et id_rsa.pub.Generating public/private dsa key pair. Enter file in which to save the key (/home/monuser/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/monuser/.ssh/id_rsa. Your public key has been saved in /home/monuser/.ssh/id_rsa.pub. The key fingerprint is: 8f:80:d8:c5:3d:9s:0b:10:66:42:9c:84:45:a1:d0:14 monuser@monserveur
Retenez bien la passphrase renseignée car elle nous servira encore ! Elle sert de base à l’algorithme de génération de la clé privée, donc plus elle est compliquée en combinant des chiffres/lettres/ponctuations majuscules/minuscules, mieux c'est !
Sécurisation de la clé privée
Nous allons mettre la clé privée en lecture seule pour le propriétaire de la clé et aucun droit pour les autres utilisateurs :$ chmod 400 ~/.ssh/id_rsa
Modifier la passphrase
$ chmod u+w ~/.ssh/id_rsa
$ ssh-keygen -p -f ~/.ssh/id_rsa
$ chmod u-w ~/.ssh/id_rsa
Exporter la clé publique
Comme vu ci-dessus, 2 clés ont été générées ; une privée que l'on ne communique pas et une publique que l'on va transférer sur le serveur SSH :
$
cat .ssh/id_rsa.pub | ssh monuser@monserveur \\
"cat - >>~/.ssh/authorized_keys"
Votre mot de passe est demandée, normal, vous effectuez l'opération et ensuite on teste en listant le contenu du répertoire home de monuser :
$ ssh monuser@monserveur ls
Là il nous demande la passphrase et affiche le résultat de la commande ls ! Plus de mot de passe ! ... mais une passphrase ...
Automatiser le stockage de la clé privée (passphrase)
Démarrer l'agent
Pour cela nous allons utiliser un agent SSH, c'est lui qui va s'occuper de stocker en mémoire la clé privée :
Pour cela nous allons lancer l'agent, puis un shell supplémentaire avec les variables d'environnement qui l'identifient :
$ ssh-agent /bin/bash
Ajouter une clé
Nous fournissons notre clé privée à l'agent via un simple :
$ ssh-add
Qui nous demande une dernière fois la passphrase et le tour est joué !
Vérifions :
$ ssh monuser@monserveur ls
Nous obtenons le résultat de la commande ls sans avoir rentré quoique ce soit !
Supprimer une clé
$ ssh-add -d ~/.ssh/id_rsa