Comment automatiser la connexion SSH avec mot de passe?

420

Comment automatiser la connexion SSH avec mot de passe? Je configure ma machine virtuelle de test, de sorte que la sécurité lourde n'est pas considérée. SSH choisi pour une sécurité acceptable avec une configuration minimale.

ex)

echo password | ssh id@server

Ça ne marche pas.

Je me souviens que j'ai fait cela avec des astuces, mais quelqu'un ne m'a pas rappelé le truc que j'ai utilisé ...

Eonil
la source
2
FreeBSD n'accepte pas les clés sans mot de passe. Ne soyez pas tenté. Cependant, certains serveurs Linux l'ont accepté. Je crois que le serveur Linux a été mal configuré.
Eonil
16
C'est une question valide. Par exemple, je veux permettre à un utilisateur de saisir un mot de passe, puis de se connecter à une autre machine l’utilisant. Je ne peux pas supposer qu'il y aura des clés SSH distribuées sur toutes nos machines. Les réponses ci-dessous à ce jour n’aident pas cette situation.
vendredi
Question très importante. J'ai aussi besoin d'une réponse, mon fournisseur d'espace Web bloque pour mettre des fichiers de clés sur le serveur. Je dois donc transmettre le mot de passe sans fichiers de clés.
Radon8472

Réponses:

383

N'utilisez pas de mot de passe. Générez une clé SSH sans mot de passe et transmettez-la à votre machine virtuelle.

Si vous avez déjà une clé SSH, vous pouvez ignorer cette étape… Appuyez simplement sur Enterpour la clé et les deux mots de passe:

$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa.
Your public key has been saved in /home/username/.ssh/id_rsa.pub.

Copiez vos clés sur le serveur cible:

$ ssh-copy-id id@server
id@server's password: 

Maintenant, essayez de vous connecter à la machine, avec ssh 'id@server', et enregistrez:

.ssh/authorized_keys

pour vous assurer que nous n'avons pas ajouté de clés supplémentaires auxquelles vous ne vous attendiez pas.

Enfin, vérifiez la connexion…

$ ssh id@server

id@server:~$ 

Vous voudrez peut-être aussi utiliser ssh-agentsi vous voulez protéger vos clés avec une phrase secrète.

Cakemox
la source
14
J'ai finalement décidé d'utiliser des paires de clés. Parce que j'ai réalisé que c'était le moyen le plus simple.
Eonil
9
@Eonil: Ne soyez pas tenté d'utiliser des clés sans phrase secrète. Apprenez à utiliser ssh-agent ou pageant.
user619714
121
C'est une bonne réponse, mais pas la bonne réponse à la question.
John Hunt
76
Ce genre de réponses m'agace vraiment, vraiment. Ce n'était pas la question. Personne n'a demandé comment utiliser les paires de clés.
Matt Fletcher
16
Cela ne répond pas à la question. C'est une bonne réponse pour une question complètement différente, mais c'est terrible pour celle posée.
mercredi
595
$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname
les weekens
la source
51
Oui, parfois, vous ne pouvez pas utiliser l'authentification par clé pour diverses raisons. Par exemple, pour l'instant, je ne peux pas utiliser keyauth sur un serveur Plesk car, dans la boîte, il n'est pas activé et je n'ai pas de racine.
John Hunt
17
+1! En remarque, vous devez exécuter sshune seule fois avant d'utiliser sshpass, afin de confirmer l'empreinte RSA
user123444555621
22
-1 pour avoir à utiliser le mot de passe dans la commande. Cela enregistre le mot de passe à .bash_historyen texte clair sur votre ordinateur.
15
@MisterDood Vous pouvez exécuter history -raprès la commande pour effacer votre historique. Bon point cependant.
NuclearPeon
20
Conseil pro: si vous ne souhaitez pas qu'une commande spécifique apparaisse dans .bash_history, préfixez la commande par un espace. Ça fonctionne. Toutefois, les utilisateurs de cette commande devraient être plus soucieux que les utilisateurs non privilégiés du système puissent voir la ligne de commande complète avec ps, qui inclut bien sûr le mot de passe. Étant donné que les sessions SSH ont tendance à durer longtemps, il s'agit d'un problème de sécurité.
CubicleSoft
71

Bien que la réponse correcte à votre question soit sshkey , il existe un moyen plus sûr: les clés SSH. Vous n'êtes qu'à trois étapes faciles de la solution:

Générez une paire de clés rsa :

# ssh-keygen

puis copiez-le sur le serveur avec une simple commande :

# ssh-copy-id userid@hostname

vous pouvez maintenant vous connecter sans mot de passe :

# ssh userid@hostname
lzap
la source
1
Fonctionne bien avec les valeurs par défaut. Utiliser ~ / rsa4live.pub ne fonctionnait pas pour moi lors de la tentative ssh-copy-id.
Cees Timmerman
1
Si vous souhaitez que cette procédure fonctionne pour différents utilisateurs, 1. ssh-keygen 2. ssh-copy-id nazir @ nom_hôte 3. ssh nazir @ nom_hôte
Venfah Nazir
2
Pour moi c'étaitssh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
Gabriel Fair
21
Ce n'est pas une réponse à la question.
Steve Bennett
2
Et? La réponse est ci-dessus, sshpass ...
Lzap
40

Utilisez attendez:

#!/usr/bin/expect -f
#  ./ssh.exp password 192.168.1.11 id
set pass [lrange $argv 0 0]
set server [lrange $argv 1 1]
set name [lrange $argv 2 2]

spawn ssh $name@$server
match_max 100000
expect "*?assword:*"
send -- "$pass\r"
send -- "\r"
interact

Exemple:

# ./1.ex password localhost ooshro
spawn ssh ooshro@localhost
ooshro@localhost's password: 
Linux ubuntu-1010-server-01 2.6.35-25-generic-pae #44-Ubuntu SMP Fri Jan 21 19:01:46 UTC 2011 i686 GNU/Linux
Ubuntu 10.10

Welcome to Ubuntu!
 * Documentation:  https://help.ubuntu.com/
Last login: Tue Mar  1 12:41:12 2011 from localhost
ooshro
la source
2
Cela a fonctionné mais il ne peut pas imprimer la sortie standard de la machine distante.
Eonil
cela fonctionne bien car certaines machines ne peuvent pas mettre la clé à l'avance car l'adresse IP est changée à chaque fois.
larrycai
4
il sera bon d’ajouter -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nullpour la commande ssh afin d’éviter d’accepter la machine dans les hôtes connus
larrycai
B .. b mais muh clés ssh ...
Damien Ó Ceallaigh
Vous trouverez un exemple plus détaillé de ce script à l' adresse suivante : linuxaria.com/howto/…. Ces exemples ici devraient également fonctionner avec des commandes à distance.
Radon8472
16

Cela ne vous servira peut-être pas, mais vous pouvez le faire avec Perl:

\#!/usr/bin/perl  
use warnings;  
use strict;  

use Net::SSH::Perl;  
my $host = 'remote.serv.er';  
my $user = 'root';  
my $pass = 'hunter2';  
my $ssh = Net::SSH::Perl->new('$host');  
$ssh->login('$user', '$pass') or die "Oh noes! $!";
James L
la source
2
De même, vous pouvez faire avec ce Ruby github.com/net-ssh/net-ssh
EnabrenTane
15

Je suis surpris que personne ne mentionne plinkle putty-toolspaquet dans Ubuntu:

plink user@domain -pw mypass  [cmd]

Il est également disponible sur Windows et la syntaxe est principalement compatible avec le client openssh.

eadmaster
la source
Pour Windows, votre réponse est bonne, mais l'utilisateur ne possède généralement pas plink.
Radon8472
2
c'est dans le putty-toolspaquet
eadmaster
10

La connexion unique SSH est généralement réalisée avec une authentification à clé publique et un agent d'authentification. Vous pouvez facilement ajouter votre clé de machine virtuelle de test à un agent d'authentification existant (voir l'exemple ci-dessous). D'autres méthodes telles que gssapi / kerberos existent mais sont plus complexes.

sshpass

Dans les situations où passwordla seule méthode d'authentification disponible est disponible, sshpass peut être utilisé pour entrer automatiquement le mot de passe. Portez une attention particulière à la section CONSIDÉRATIONS DE SÉCURITÉ de la page de manuel . Dans les trois options, le mot de passe est visible ou stocké en texte brut à un moment donné :

Tube anonyme (recommandé par sshpass)

# Create a pipe
PIPE=$(mktemp -u)
mkfifo -m 600 $PIPE
# Attach it to file descriptior 3
exec 3<>$PIPE
# Delete the directory entry
rm $PIPE
# Write your password in the pipe
 echo 'my_secret_password' >&3
# Connect with sshpass -d
sshpass -d3 ssh user@host

# Close the pipe when done
exec 3>&-

C'est assez lourd en bash, sans doute plus facile avec les langages de programmation. Un autre processus pourrait être associé à votre pipe / fd avant que le mot de passe ne soit écrit. La fenêtre d'opportunité est assez courte et limitée à vos processus ou à votre racine.

Variable d'environnement

# Set your password in an environment variable
 export SSHPASS='my_secret_password'
# Connect with sshpass -e
sshpass -e ssh user@host

Vous et root pouvez lire les variables d'environnement de votre processus (c'est-à-dire votre mot de passe) pendant que sshpass est en cours d'exécution ( cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=). La fenêtre d'opportunité est beaucoup plus longue mais reste limitée à vos propres processus ou racine, pas aux autres utilisateurs.

Argument de ligne de commande (le moins sécurisé)

 sshpass -p my_secret_password ssh user@host

Ceci est pratique mais moins sécurisé que décrit dans la page de manuel. Les arguments de ligne de commande sont visibles pour tous les utilisateurs (par exemple ps -ef | grep sshpass). sshpass tente de cacher l'argument, mais il existe toujours une fenêtre dans laquelle tous les utilisateurs peuvent voir votre mot de passe passé par argument.

Note latérale

Définissez votre variable bash HISTCONTROL sur ignorespaceou ignorebothet préfixez vos commandes sensibles avec un espace. Ils ne seront pas sauvés dans l'histoire.


Authentification par clé publique SSH

# Generate a key pair
# Do NOT leave the passphrase empty
ssh-keygen
# Copy it to the remote host (added to .ssh/authorized_keys)
ssh-copy-id user@host

La phrase secrète est très importante. Quiconque obtiendra le fichier de clé privée ne pourra pas l'utiliser sans la phrase secrète.

Configurez l'agent d'authentification SSH

# Start the agent
eval `ssh-agent`
# Add the identity (private key) to the agent
ssh-add /path/to/private-key
# Enter key passphrase (one time only, while the agent is running)

Connecter comme d'habitude

ssh user@host

L'avantage est que votre clé privée est cryptée et qu'il vous suffit d'entrer sa phrase secrète une seule fois (via une méthode de saisie plus sûre également).

nrolans
la source
8

Bien sûr, vous ne voulez pas utiliser de clés SSH plutôt que de mots de passe? De cette façon, c'est à la fois sécurisé et automatique.

Coops
la source
3
L'utilisation de clés SSH sans mot de passe n'est que légèrement plus sûre que l'utilisation de mots de passe dans un fichier.
Yunzen
10
@ yunzen Incorrect. L'authentification par clé vous protège des attaques par mitose, même si vous ne connaissez pas la clé de l'hôte. Un attaquant pourrait emprunter l'identité du serveur, mais ne jamais se connecter au serveur réel. Avec l’authentification par mot de passe, tous les serveurs auxquels vous vous connectez (légitimes ou non) verront le mot de passe. Pour ces raisons, une clé ssh sans mot de passe est beaucoup plus sécurisée que le simple stockage du mot de passe dans un fichier.
Kasperd
14
Ce n'est pas une réponse.
Steve Bennett
@SteveBennett C'est la même chose que la réponse acceptée et elle a été postée avant, bien qu'elle comporte moins de détails.
Michael Hampton
3
Eh bien, je dirais que la réponse acceptée est une réponse décente à une question qui n’a pas été posée. Ce n'est rien.
Steve Bennett
4

En fonction de vos besoins en automatisation, Ansible vous conviendrait peut-être parfaitement. Il peut très bien gérer des choses telles que l'invite à entrer un mot de passe, l'invite à entrer un mot de passe sudo, diverses façons de changer d'utilisation, en toute sécurité à l'aide de secrets cryptés (coffre-fort).

Si cela ne convient pas, je suggérerais Expect, comme suggéré dans une autre réponse.

Cameron Kerr
la source