Come automatizzare l'accesso SSH con password?


419

Come automatizzare l'accesso SSH con password? Sto configurando la mia macchina virtuale di prova, quindi non viene considerata la sicurezza pesante. SSH scelto per una sicurezza accettabile con una configurazione minima.

ex)

echo password | ssh id@server

Questo non funziona

Ricordo di averlo fatto con alcuni trucchi che qualcuno mi ha guidato, ma ora non ricordo il trucco che ho usato ...


2
FreeBSD non ha accettato le chiavi senza password. Non essere tentato. Tuttavia alcuni server Linux lo hanno accettato. Credo che il server Linux sia stato configurato male.
Eonil

16
Questa è una domanda valida Ad esempio, voglio consentire a un utente di inserire una password, quindi accedere a un'altra macchina utilizzandola. Non posso presumere che ci saranno chiavi ssh distribuite su tutte le nostre macchine. Le risposte di seguito finora non aiutano questa situazione.
domenica


Domanda molto importante. Ho bisogno anche di una risposta, il mio provider dello spazio web si blocca per inserire file di chiavi sul server, quindi devo passare il passwort senza file di chiavi.
Radon8472,

Risposte:


382

Non usare una password Generare una chiave SSH passphraseless e inviarla alla VM.

Se hai già una chiave SSH, puoi saltare questo passaggio ... Premi semplicemente Enterper la chiave e entrambe le passphrase:

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

Copia le tue chiavi sul server di destinazione:

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

Ora prova ad accedere alla macchina, con ssh 'id@server'e fai il check-in:

.ssh/authorized_keys

per essere sicuri che non abbiamo aggiunto chiavi extra che non ti aspettavi.

Infine controlla l'accesso ...

$ ssh id@server

id@server:~$ 

Potresti anche voler esaminare l'utilizzo ssh-agentse vuoi provare a proteggere le tue chiavi con una passphrase.


14
Alla fine ho deciso di utilizzare le coppie di chiavi. Perché ho capito che è il modo più semplice.
Eonil

9
@Eonil: non essere tentato di usare le chiavi senza una passphrase. Scopri come usare ssh-agent o pageant.
user619714

120
Questa è una buona risposta, ma non la risposta corretta alla domanda.
John Hunt,

75
Questo tipo di risposte mi infastidisce davvero. Non era questa la domanda. Nessuno ha chiesto come usare le coppie di chiavi.
Matt Fletcher,

16
Questo non risponde alla domanda. È una buona risposta a una domanda completamente diversa, ma è terribile per quella posta.
Srchulo,

595
$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname

51
Sì, a volte non è possibile utilizzare la chiave basata sull'autenticazione per vari motivi .. per esempio in questo momento non posso usare keyauth su un server Plesk perché out box non è abilitato e non ho root.
John Hunt,

17
+1! Come nota a sshsshpass
margine

21
-1 per dover usare la password nel comando. Questo registra la password .bash_historyin testo semplice sul tuo computer.

15
@MisterDood È possibile eseguire history -ril comando per cancellare la cronologia. Buon punto però.
NuclearPeon

20
Suggerimento del professionista: se non si desidera visualizzare un comando specifico in .bash_history, aggiungere il prefisso al comando con uno spazio. Funziona e basta. Tuttavia, gli utenti di questo comando dovrebbero essere più preoccupati che gli utenti senza privilegi sul sistema possano vedere l'intera riga di comando con ps, che, ovviamente, include la password. Poiché le sessioni ssh tendono a durare a lungo, questo è un problema di sicurezza.
CubicleSoft,

71

Mentre la risposta corretta alla tua domanda è sshkey , esiste un modo più sicuro: chiavi SSH. Sei a soli tre semplici passi dalla soluzione:

Genera una coppia di chiavi rsa :

# ssh-keygen

quindi copiarlo sul server con un semplice comando :

# ssh-copy-id userid@hostname

ora puoi accedere senza password :

# ssh userid@hostname

1
Funziona bene con i valori predefiniti. L'uso di ~ / rsa4live.pub non ha funzionato per me durante i tentativi ssh-copy-id.
Cees Timmerman,

1
Se si desidera che questa procedura funzioni per diversi utenti, 1. ssh-keygen 2. ssh-copy-id nazir @ hostname 3. ssh nazir @ hostname
Venfah Nazir

2
Per me è statossh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
Gabriel Fair l'

21
Questa non è una risposta alla domanda.
Steve Bennett,

2
E? La risposta è sopra, sshpass ...
lzap,

40

Usa aspettati:

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

Esempio:

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

2
Ha funzionato ma non è possibile stampare stdout della macchina remota.
Eonil

funziona bene per alcune macchine che non possono mettere la chiave in anticipo poiché l'indirizzo IP viene cambiato ogni volta.
Larrycai,

4
sarà bene aggiungere anche -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nullper il comando ssh per evitare di accettare la macchina in known_hosts
larrycai

B .. b but muh ssh keys ...
Damien Ó Ceallaigh

Un esempio più dettagliato di questo script è disponibile all'indirizzo: linuxaria.com/howto/… Anche in questo caso gli esempi dovrebbero funzionare con comandi remoti
Radon8472,

16

Questo potrebbe non esserti utile, ma puoi farlo 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! $!";

2
Allo stesso modo, puoi farlo con questo Ruby github.com/net-ssh/net-ssh
EnabrenTane

15

Sono sorpreso che nessuno menzionato plinkdal putty-toolspacchetto in Ubuntu:

plink user@domain -pw mypass  [cmd]

È disponibile anche su Windows e la sintassi è principalmente compatibile con il client openssh.


Per Windows la tua risposta è buona, di solito l'utente Linux / Unix non ha un plink
Radon8472,

2
è nel putty-toolspacchetto
eadmaster

10

Il single sign-on SSH si ottiene in genere con l'autenticazione con chiave pubblica e un agente di autenticazione. È possibile aggiungere facilmente la chiave della VM di prova a un agente di autenticazione esistente (vedere l'esempio seguente). Esistono altri metodi come gssapi / kerberos ma sono più complessi.

sshpass

In situazioni in cui passwordè disponibile l'unico metodo di autenticazione, è possibile utilizzare sshpass per inserire automaticamente la password. Prestare particolare attenzione alla sezione CONSIDERAZIONI SULLA SICUREZZA della pagina man . In tutte e tre le opzioni, la password è visibile o memorizzata in testo normale ad un certo punto :

Pipa anonima (consigliata da 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>&-

È piuttosto ingombrante in bash, probabilmente più facile con i linguaggi di programmazione. Un altro processo potrebbe essere collegato alla pipe / fd prima che la password venga scritta. La finestra di opportunità è piuttosto breve e limitata ai tuoi processi o root.

Variabile d'ambiente

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

Tu e root potete leggere le variabili d'ambiente del vostro processo (cioè la vostra password) mentre sshpass è in esecuzione ( cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=). La finestra di opportunità è molto più lunga ma ancora limitata ai propri processi o root, non ad altri utenti.

Argomento della riga di comando (meno sicuro)

 sshpass -p my_secret_password ssh user@host

Questo è conveniente ma meno sicuro come descritto nella pagina man. Gli argomenti della riga di comando sono visibili a tutti gli utenti (ad es ps -ef | grep sshpass.). sshpass tenta di nascondere l'argomento, ma c'è ancora una finestra durante la quale tutti gli utenti possono vedere la tua password passata per argomento.

Nota a margine

Impostare la bash variabile HISTCONTROL a ignorespaceo ignorebothe prefisso i comandi sensibili con uno spazio. Non saranno salvati nella storia.


Autenticazione con chiave pubblica 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 passphrase è molto importante. Chiunque ottenga in qualche modo il file della chiave privata non sarà in grado di usarlo senza la passphrase.

Imposta l'agente di autenticazione 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)

Connetti come al solito

ssh user@host

Il vantaggio è che la tua chiave privata è crittografata e devi solo inserire la sua passphrase una volta (anche tramite un metodo di input più sicuro).


8

Sicuro di non voler usare le chiavi SSH piuttosto che le password? In questo modo è sia sicuro che automatico.


3
L'uso delle chiavi SSH senza password è solo leggermente più sicuro dell'uso delle password in un file.
yunzen,

10
@yunzen Inesatto. L'autenticazione con chiave ti protegge dagli attacchi mitm anche se non conosci la chiave host. Un utente malintenzionato potrebbe impersonare il server, ma non connettersi mai al server reale. Con l'autenticazione con password qualsiasi server a cui ti connetti (legittimo o no) vedrà la password. Per questi motivi una chiave ssh senza password è molto più sicura della semplice memorizzazione della password in un file.
Kasperd,

14
Questa non è una risposta
Steve Bennett,

@SteveBennett È uguale alla risposta accettata ed è stata pubblicata prima, sebbene abbia meno dettagli.
Michael Hampton

3
Bene, direi che la risposta accettata è una risposta decente a una domanda che non è stata posta. Questo non è niente.
Steve Bennett,

4

A seconda delle tue esigenze di automazione, forse Ansible sarebbe la soluzione giusta per te. Può gestire bene cose come la richiesta di password, la richiesta di password sudo, vari modi di cambiarne l'uso, l'utilizzo sicuro di segreti crittografati (vault).

Se ciò non fosse adatto, suggerirei Aspettatevi, come suggerito in un'altra risposta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.