¿Cómo automatizar el inicio de sesión SSH con contraseña?

421

¿Cómo automatizar el inicio de sesión SSH con contraseña? Estoy configurando mi máquina virtual de prueba, por lo que no se considera una gran seguridad. SSH elegido para una seguridad aceptable con una configuración mínima.

ex)

echo password | ssh id@server

Esto no funciona

Recuerdo que hice esto con algunos trucos que alguien me guió, pero ahora no puedo recordar el truco que usé ...

Eonil
fuente
2
FreeBSD no aceptó claves sin contraseña. No te dejes tentar. Sin embargo, algunos servidores Linux lo aceptaron. Creo que el servidor Linux estaba mal configurado.
Eonil
16
Esta es una pregunta válida. Por ejemplo, quiero permitir que un usuario ingrese una contraseña y luego inicie sesión en otra máquina que la usa. No puedo suponer que habrá claves ssh distribuidas en todas nuestras máquinas. Las respuestas a continuación hasta ahora no ayudan a esta situación.
dfrankow
Pregunta muy importante También necesito una respuesta, mi proveedor de espacio web bloquea para colocar archivos clave en el servidor, por lo que debo pasar el passwort sin archivos clave.
Radon8472

Respuestas:

384

No uses una contraseña. Genere una clave SSH sin contraseña y empújela a su VM.

Si ya tiene una clave SSH, puede omitir este paso ... Simplemente presione Enterla tecla y ambas frases de contraseña:

$ 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.

Copie sus claves al servidor de destino:

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

Ahora intente iniciar sesión en la máquina, con ssh 'id@server', y regístrese:

.ssh/authorized_keys

para asegurarnos de que no hayamos agregado claves adicionales que no esperaba.

Finalmente verifique el inicio de sesión ...

$ ssh id@server

id@server:~$ 

También puede considerar el uso ssh-agentsi desea intentar mantener sus claves protegidas con una frase de contraseña.

Cakemox
fuente
14
Finalmente decidí usar pares de claves. Porque me di cuenta de que esa es la forma más simple.
Eonil
99
@Eonil: no caigas en la tentación de usar claves sin una frase de contraseña Aprenda a usar ssh-agent o concurso.
user9517
123
Esta es una buena respuesta, pero no es la respuesta correcta a la pregunta.
John Hunt
77
Este tipo de respuestas realmente, realmente me molestan. Esa no era la pregunta. Nadie preguntó cómo usar pares de claves.
Matt Fletcher
17
Esto no responde la pregunta. Es una buena respuesta para una pregunta completamente diferente, pero es terrible para la pregunta.
srchulo
600
$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname
Weekens
fuente
51
Sí, a veces no puedes usar la autenticación basada en claves por varias razones ... por ejemplo, en este momento no puedo usar keyauth en un servidor plesk porque de fábrica no está habilitado y no tengo root.
John Hunt
17
+1! Como nota al margen, debe ejecutar sin formato sshuna vez antes de usar sshpass, para confirmar la huella digital RSA
usuario123444555621
22
-1 por tener que usar la contraseña en el comando. Esto registra la contraseña .bash_historyen texto sin formato en su máquina.
15
@MisterDood Puede ejecutar history -rdespués del comando para borrar su historial. Buen punto sin embargo.
NuclearPeon
20
Consejo profesional: si no desea que se muestre un comando específico en .bash_history, prefije el comando con un espacio. Simplemente funciona Sin embargo, los usuarios de este comando deberían estar más preocupados de que los usuarios no privilegiados del sistema puedan ver la línea de comandos completa con ps, que, por supuesto, incluye la contraseña. Dado que las sesiones ssh tienden a ser de larga duración, este es un problema de seguridad.
CubicleSoft
71

Si bien la respuesta correcta para su pregunta es sshkey , hay una forma más segura: las claves SSH. Estás a solo tres pasos de la solución:

Genere un par de claves rsa :

# ssh-keygen

luego cópielo en el servidor con un simple comando :

# ssh-copy-id userid@hostname

ahora puede iniciar sesión sin contraseña :

# ssh userid@hostname
lzap
fuente
1
Funciona bien con los valores predeterminados. Usar ~ / rsa4live.pub no funcionó para mí al intentarlo ssh-copy-id.
Cees Timmerman
1
Si desea que estos pasos funcionen para diferentes usuarios, 1. ssh-keygen 2. ssh-copy-id nazir @ hostname 3. ssh nazir @ hostname
Venfah Nazir
2
Para mí fuessh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
Gabriel Fair
21
Esta no es una respuesta a la pregunta.
Steve Bennett
2
¿Y? La respuesta está arriba, sshpass ...
lzap
40

Uso esperar:

#!/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

Ejemplo:

# ./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
fuente
2
Funcionó pero no puede imprimir stdout de la máquina remota.
Eonil
funciona bien porque algunas máquinas no pueden poner la clave por adelantado ya que la dirección IP se cambia cada vez.
larrycai
44
será bueno agregar el -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nullcomando ssh para evitar aceptar la máquina en conocido_hosts
larrycai
B .. b pero muh ssh keys ...
Damien Ó Ceallaigh
Puede encontrar un ejemplo más detallado de este script en: linuxaria.com/howto/… Estos ejemplos también deberían funcionar con comandos remotos
Radon8472
16

Puede que esto no te sirva de nada, pero puedes hacerlo con 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
fuente
2
Del mismo modo, puedes hacerlo con este Ruby github.com/net-ssh/net-ssh
EnabrenTane
16

Me sorprende que nadie haya mencionado plinkel putty-toolspaquete en Ubuntu:

plink user@domain -pw mypass  [cmd]

También está disponible en Windows y la sintaxis es principalmente compatible con el cliente openssh.

Eadmaster
fuente
Para Windows, su respuesta es buena, por lo general, un usuario de Linux / Unix generalmente no tiene plink
Radon8472
2
está en el putty-toolspaquete
eadmaster
10

El inicio de sesión único SSH generalmente se logra con la autenticación de clave pública y un agente de autenticación. Puede agregar fácilmente su clave de VM de prueba a un agente de autenticación existente (consulte el ejemplo a continuación). Existen otros métodos como gssapi / kerberos pero son más complejos.

sshpass

En situaciones donde passwordes el único método de autenticación disponible, sshpass puede usarse para ingresar automáticamente la contraseña. Preste especial atención a la sección CONSIDERACIONES DE SEGURIDAD de la página del manual . En las tres opciones, la contraseña está visible o almacenada en texto sin formato en algún momento :

Tubo anónimo (recomendado por 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>&-

Es bastante engorroso en bash, posiblemente más fácil con lenguajes de programación. Otro proceso podría adjuntarse a su tubería / fd antes de que se escriba la contraseña. La ventana de oportunidad es bastante corta y está limitada a sus procesos o raíz.

Variable ambiental

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

Usted y el usuario root pueden leer las variables de entorno de su proceso (es decir, su contraseña) mientras se ejecuta sshpass ( cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=). La ventana de oportunidad es mucho más larga, pero aún se limita a sus propios procesos o raíz, no a otros usuarios.

Argumento de línea de comando (menos seguro)

 sshpass -p my_secret_password ssh user@host

Esto es conveniente pero menos seguro como se describe en la página del manual. Los argumentos de la línea de comando son visibles para todos los usuarios (p ps -ef | grep sshpass. Ej .). sshpass intenta ocultar el argumento, pero todavía hay una ventana durante la cual todos los usuarios pueden ver su contraseña pasada por argumento.

Nota al margen

Establezca su variable bash HISTCONTROL en ignorespaceo ignorebothy prefija sus comandos sensibles con un espacio. No se guardarán en la historia.


Autenticación de clave pública 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 frase de contraseña es muy importante. Cualquiera que obtenga de alguna manera el archivo de clave privada no podrá usarlo sin la frase de contraseña.

Configurar el agente de autenticación 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)

Conecta como siempre

ssh user@host

La ventaja es que su clave privada está encriptada y solo necesita ingresar su frase de contraseña una vez (también a través de un método de entrada más seguro).

nrolans
fuente
8

¿Seguro que no quieres usar claves SSH en lugar de contraseñas? De esa manera es seguro y automático.

Cooperativas
fuente
3
Usar claves SSH sin contraseña es solo un poco más seguro que usar contraseñas en un archivo.
Yunzen
10
@yunzen Incorrecto. La autenticación de clave lo protege de los ataques mitm incluso si no conoce la clave del host. Un atacante podría hacerse pasar por el servidor, pero nunca conectarse al servidor real. Con la autenticación de contraseña, cualquier servidor al que se conecte (legítimo o no) verá la contraseña. Por esas razones, una clave ssh sin contraseña es mucho más segura que simplemente almacenar la contraseña en un archivo.
kasperd
14
Esta no es una respuesta.
Steve Bennett
@SteveBennett Es lo mismo que la respuesta aceptada y se publicó antes, aunque tiene menos detalles.
Michael Hampton
3
Bueno, diría que la respuesta aceptada es una respuesta decente a una pregunta que no se hizo. Esto no es nada.
Steve Bennett
4

Dependiendo de sus necesidades de automatización, quizás Ansible sea una buena opción para usted. Puede administrar cosas como solicitar la contraseña, solicitar la contraseña de sudo, varias formas de cambiar el uso, usar de forma segura los secretos cifrados (bóveda).

Si eso no es adecuado, sugeriría esperar, como se sugiere en otra respuesta.

Cameron Kerr
fuente