SSH : sshpass, la connexion SSH par mot de passe non-interactive
Table des matières
Quand on se connecte à une machine en ssh (ou avec un transfert de fichiers avec rsync ou scp), il est nécessaire de taper son mot de passe.
Pour les scripts, j'utilise un couple de clé publique/privé. C'est la méthode à privilégier qui est bien plus robuste notamment en cas d'attaque de type brute-force.
Cependant, parfois, vous avez besoin d'un mot de passe. Si vous déployez pour la première fois des clés sur beaucoup de serveurs et qu'ils ont tous un mot de passe, cela vous permettra aussi d'accélérer le déploiement.
sshpass va nous permettre de nous connecter en ssh sans que la demande de mot de passe soit à saisir par l'utilisateur.
Il existe plusieurs solutions pour passer le mot de passe à ssh avec sshpass :
- variable d'environnement
- dans la ligne de commande
- dans un fichier
J'en ai rapidement parlé il y a un moment dans l'article https://www.linuxtricks.fr/wiki/ssh-commandes-sftp mais je souhaite faire un article dédié ici à cet utilitaire.
Nous allons voir ici comment l'utiliser !
Si le logiciel n'est pas installé, on l'installe :
Gentoo :
Red Hat Enterprise Linux (et dérivées) et Fedora :
Debian et Ubuntu :
La commande s'utilise avant ssh ou autres outils reposant sur ssh tels que rsync ou sftp par exemple :
Pour passer en clair le mot de passe dans la commande, on utilisera l'option -p de sshpass.
Exemple avec une commande ssh :
Nous sommes directement connecté !
Il est nécessaire de bien sécuriser le script concerné (ne permettre en lecture que pour l'utilisateur) !!
A noter, les autres utilisateurs ne voient pas le mot de passe avec la commande ps -ef sur la machine, il est masqué avec des "zzz" :
Plutôt que de passer le mot de passe dans la ligne de commande, on peut utiliser la variable "SSHPASS" et stocker dedans le mot de passe ! On utilisera alors l'option -e de sshpass.
Exemple ici avec une commande rsync (qui utilise par défaut SSH lors d'une copie distante) :
Le transfert débute sans demande de mot de passe.
On peut évidemment effacer la variable après utilisation !
On peut aussi utiliser un fichier si on le souhaite, je n'en vois pas l'utilité en pratique.
Peut être si vous avez plusieurs scripts dans plusieurs langages ? Ou des caractères bizarres dans votre mot de passe qui empêche l'utilisation en ligne de commande / variable d'environnement ?
Le mot de passe lu sera la première ligne du fichier, sans le saut de ligne.
Exemple avec une commande ssh :
Comme la variable d'environnement, on peut supprimer le fichier après utilisation s'il ne sert pas à autre chose !
L'outil permet aussi d'utiliser d'autres méthodes, mais je n'en vois pas l'intérêt, comme l'utilisation d'un file descriptor, ou de définir à nouveau un prompt de mot de passe.
Dans tous les cas, n'oubliez pas, pour toute la documentation de l'outil :
Si vous faites un script avec un while qui prend une liste dans un txt (ici je passe le mdp avec l'option -p pour vous illustrer) :
La boucle va :
- s'arrêter au premier serveur
- la liste des serveurs sur lesquels vous ne vous êtes pas connectés demandent de valider l'emprunte
Pour cela on va respectivement :
- utiliser l'option -n pour ne pas lire depuis l'entrée standard
- utiliser l'option StrictHostKeyChecking
Ce qui donne :
Introduction
Quand on se connecte à une machine en ssh (ou avec un transfert de fichiers avec rsync ou scp), il est nécessaire de taper son mot de passe.
Pour les scripts, j'utilise un couple de clé publique/privé. C'est la méthode à privilégier qui est bien plus robuste notamment en cas d'attaque de type brute-force.
Cependant, parfois, vous avez besoin d'un mot de passe. Si vous déployez pour la première fois des clés sur beaucoup de serveurs et qu'ils ont tous un mot de passe, cela vous permettra aussi d'accélérer le déploiement.
sshpass va nous permettre de nous connecter en ssh sans que la demande de mot de passe soit à saisir par l'utilisateur.
Il existe plusieurs solutions pour passer le mot de passe à ssh avec sshpass :
- variable d'environnement
- dans la ligne de commande
- dans un fichier
J'en ai rapidement parlé il y a un moment dans l'article https://www.linuxtricks.fr/wiki/ssh-commandes-sftp mais je souhaite faire un article dédié ici à cet utilitaire.
Nous allons voir ici comment l'utiliser !
Installation
Si le logiciel n'est pas installé, on l'installe :
Gentoo :
Code BASH :
emerge -av net-misc/sshpass
Red Hat Enterprise Linux (et dérivées) et Fedora :
Code BASH :
dnf install sshpass
Debian et Ubuntu :
Code BASH :
apt install sshpass
Utilisation
Utilisation générale
La commande s'utilise avant ssh ou autres outils reposant sur ssh tels que rsync ou sftp par exemple :
Code BASH :
sshpass [options] commande paramètres
Passer dans la ligne de commande le mot de passe
Pour passer en clair le mot de passe dans la commande, on utilisera l'option -p de sshpass.
Exemple avec une commande ssh :
Code BASH :
sshpass -p monmotdepassecostaud ssh adrien@192.168.21.100
Nous sommes directement connecté !
Il est nécessaire de bien sécuriser le script concerné (ne permettre en lecture que pour l'utilisateur) !!
A noter, les autres utilisateurs ne voient pas le mot de passe avec la commande ps -ef sur la machine, il est masqué avec des "zzz" :
Code BASH :
adrien 31966 6204 0 11:27 pts/0 00:00:00 sshpass -p zzzzzzz ssh adrien@192.168.21.100
Utiliser une variable d'environnement
Plutôt que de passer le mot de passe dans la ligne de commande, on peut utiliser la variable "SSHPASS" et stocker dedans le mot de passe ! On utilisera alors l'option -e de sshpass.
Exemple ici avec une commande rsync (qui utilise par défaut SSH lors d'une copie distante) :
Code BASH :
export SSHPASS="monmotdepassecostaud" sshpass -e rsync -avzh /tmp/ adrien@192.168.21.100:/home/adrien/tmp/
Le transfert débute sans demande de mot de passe.
On peut évidemment effacer la variable après utilisation !
Code BASH :
unset SSHPASS
Utiliser un fichier où le mot de passe est stocké
On peut aussi utiliser un fichier si on le souhaite, je n'en vois pas l'utilité en pratique.
Peut être si vous avez plusieurs scripts dans plusieurs langages ? Ou des caractères bizarres dans votre mot de passe qui empêche l'utilisation en ligne de commande / variable d'environnement ?
Le mot de passe lu sera la première ligne du fichier, sans le saut de ligne.
Exemple avec une commande ssh :
Code BASH :
echo monmotdepassecostaud > $HOME/mdpsshpass sshpass -f /root/mdpsshpass ssh adrien@192.168.21.100
Comme la variable d'environnement, on peut supprimer le fichier après utilisation s'il ne sert pas à autre chose !
Code BASH :
rm $HOME/mdpsshpass
D'autres méthodes ...
L'outil permet aussi d'utiliser d'autres méthodes, mais je n'en vois pas l'intérêt, comme l'utilisation d'un file descriptor, ou de définir à nouveau un prompt de mot de passe.
Dans tous les cas, n'oubliez pas, pour toute la documentation de l'outil :
Code BASH :
man sshpass
Cas pratique sur retour d'expérience
sshpass dans une boucle BASH
Si vous faites un script avec un while qui prend une liste dans un txt (ici je passe le mdp avec l'option -p pour vous illustrer) :
Code BASH :
while read srv do sshpass -p password ssh user@$srv cat /etc/redhat-release done < liste-server.txt
La boucle va :
- s'arrêter au premier serveur
- la liste des serveurs sur lesquels vous ne vous êtes pas connectés demandent de valider l'emprunte
Pour cela on va respectivement :
- utiliser l'option -n pour ne pas lire depuis l'entrée standard
- utiliser l'option StrictHostKeyChecking
Ce qui donne :
Code BASH :
while read srv do sshpass -p password ssh -n -o StrictHostKeyChecking=no user@$srv cat /etc/redhat-release done < liste-server.txt