Name : BETA-TESTERS
Project name : ZW3B-API-BETA-TESTERS
Authorized. - 200 - Client API Name and Origin Wildcard OK
Cette documentation explique comment se connecter d'une machine à une autre en SSH sans mot de passe, grâce à une paire de clefs. Pour pouvoir utiliser scp ou rsync sans qu'un utilisateur soit présent sur le bash (pour effectuer par exemple des sauvegardes automatisées) → nous utilisons OpenSSL.
Nous allons donc créer une paire de clés SSL publique/privé que nous utiliserons pour remplacer le mot de passe de l'utilisateur. Celui-ci poura se connecter de son client SSH préféré ou grâce à un script sans devoir taper de mot de passe.
Les valeurs par default de la commande ssh-keygen
utilise l'algorithme de cryptographie asymétrique rsa
(Rivest, Shamir, Adleman Algorithme) et la taille par default en bits de la clé est 2048
.
Par exemple : ssh-keygen -b 4096 -t rsa
Ici, nous allons utiliser l'agorithme "Elliptic Curve Digital Signature Algorithm" (ECDSA) d'une longueur de 384 bits qui est l'agorithme le plus récent.
ssh-keygen
va générer une paire de clef publique et privé au format ECDSA.
Script avec 1 ligne
001orj@server1:~ # ssh-keygen -t ecdsa -b 384 -C orj@server1.zw3b.eu
Les valeurs du nombre de bits pour ECDSA sont 256
, 384
, 521
.
Si vous n'aimez pas le nom standard de la clef SSH vous pouvez aussi le changer avec le paramètre -f nom_de_la_clef
ssh-keygen
vous demandera aussi de choisir l'emplacement de la clef mais je vous conseille de garder l'emplacement par défaut. Ensuite il vous demandera d'entrée une passphrase.
Après cela vous disposerez de deux fichiers dans votre dossier ~/.ssh/
Script avec 2 lignes
001* ~/.ssh/id_ecdsa : votre clef privée 002* ~/.ssh/id_ecdsa.pub : votre clef publique
Nous envoyons sur notre serveur distant la clé publique.
Script avec 1 ligne
001orj@server1:~ # scp .ssh/id_ecdsa.pub lab3w_orj@remoteserver.zw3b.eu:
Ce qui permettra à mon utilisateur orj
de se connecter automatiquement au serveur distant sur le compte lab3w_orj
une fois que la clef publique sera copiée dans le fichier ~/.ssh/authorized_keys
.
Copier le contenu de la clé publique dans le fichier ~/.ssh/authorized_keys
puis supprimer la clé et attribuer les droits de lecture que pour votre utilisateur.
Script avec 4 lignes
001lab3w_orj@remoteserver:~ # cat id_ecdsa.pub >> .ssh/authorized_keys 002lab3w_orj@remoteserver:~ # rm id_ecdsa.pub 003lab3w_orj@remoteserver:~ # chmod 700 .ssh 004lab3w_orj@remoteserver:~ # chmod 600 .ssh/authorized_keys
La commande ssh-add .ssh/id_ecdsa
permet d'ajouter la clef à notre session actuelle.
Pour que cela fonctionne en permanance, nous allons ajouter un "agent SSH" dans l'environnement de la machine (notre clef privée) pour que l'on (notre utilisateur) puisse se connecter au(x) serveur(s) distant(s) automatiquement (sans devoir écrire le mot de passe) et pour tout le temps que la machine sera allumée.
ssh-agent
comme il se doit ;)Ajouter ceci à votre $HOME/.profile
(Cela permet d'avoir notre ssh-agent
à jour, de pouvoir l'utiliser depuis une console et depuis un script) :
Script avec 20 lignes
001SSH_ENV="$HOME/.ssh/environement" 002function start_agent { 003 echo "Initialising new SSH agent..." 004 /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}" 005 echo succeeded 006 chmod 600 "${SSH_ENV}" 007 . "${SSH_ENV}" > /dev/null 008 /usr/bin/ssh-add; 009} 010 011# Source SSH settings, if applicable 012if [ -f "${SSH_ENV}" ]; then 013 . "${SSH_ENV}" > /dev/null 014 #ps ${SSH_AGENT_PID} doesn't work under cywgin 015 ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || { 016 start_agent; 017 } 018else 019 start_agent; 020fi
Recharger le fichier que l'on vient de modifier :
Script avec 1 ligne
001orj@server1:~ # source ~/.profile
Le shell vous demande de rentrer votre passphrase, valider la.
Essayez depuis cette console (ou une autre) de vous connecter à la machine distante, tout fonctionne bien ;)
Si vous souhaitez utiliser un script qui est lancé depuis une crontab
(tâche planifiée), il faut ajouter l'include suivant à votre script :
Script avec 1 ligne
001. $HOME/.ssh/environement
Sinon j'ajoute le ssh-agent
comme cela en haut des scripts :
Script avec 3 lignes
001auth=`find /tmp -user $LOGNAME -type s -name "*agent*" -print 2>/dev/null` 002SSH_AUTH_SOCK=$auth 003export SSH_AUTH_SOCK
Voilà vous pouvez maintenant vous connectez sur le serveur distant sans avoir à rentrer votre mot de passe, ou depuis un script.
Nous utilisons, avons utilisé une authentification par "paire de clés".
Salutations,
Romain