Wie automatisiere ich die SSH-Anmeldung mit Passwort?

421

Wie automatisiere ich die SSH-Anmeldung mit Passwort? Ich konfiguriere meine Test-VM, sodass die hohe Sicherheit nicht berücksichtigt wird. SSH wurde aus Sicherheitsgründen mit minimaler Konfiguration ausgewählt.

Ex)

echo password | ssh id@server

Das geht nicht.

Ich erinnere mich, dass ich dies mit einigen Tricks getan habe, die mich jemand geleitet hat, aber ich kann mich jetzt nicht mehr an den Trick erinnern, den ich verwendet habe ...

Eonil
quelle
2
FreeBSD hat keine kennwortlosen Schlüssel akzeptiert. Sei nicht versucht. Einige Linux-Server haben dies jedoch akzeptiert. Ich glaube, der Linux-Server wurde falsch konfiguriert.
Eonil
16
Dies ist eine gültige Frage. Zum Beispiel möchte ich einem Benutzer erlauben, ein Kennwort einzugeben und sich dann mit diesem bei einem anderen Computer anzumelden. Ich kann nicht davon ausgehen, dass es SSH-Schlüssel geben wird, die auf allen unseren Rechnern verteilt sind. Die Antworten unten helfen dieser Situation nicht.
Dfrankow
Sehr wichtige Frage. Ich brauche auch eine Antwort, da mein Webspace-Provider das Speichern von Schlüsseldateien auf dem Server blockiert, muss ich das Passwort ohne Schlüsseldateien weitergeben.
Radon8472

Antworten:

384

Verwenden Sie kein Passwort. Generieren Sie einen passwortlosen SSH-Schlüssel und übertragen Sie ihn auf Ihre VM.

Wenn Sie bereits ein SSH - Schlüssel haben, können Sie diesen Schritt überspringen ... Drücken Sie einfach , Enterfür den Schlüssel und den beiden Paßphrasen:

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

Kopieren Sie Ihre Schlüssel auf den Zielserver:

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

Versuchen Sie nun, sich auf dem Computer anzumelden ssh 'id@server', und checken Sie ein:

.ssh/authorized_keys

um sicherzustellen, dass wir keine zusätzlichen Schlüssel hinzugefügt haben, die Sie nicht erwartet haben.

Endlich überprüfen Sie die Anmeldung ...

$ ssh id@server

id@server:~$ 

Möglicherweise möchten Sie auch die Verwendung untersuchen, ssh-agentwenn Sie versuchen möchten, Ihre Schlüssel mit einer Passphrase zu schützen.

Cakemox
quelle
14
Endlich habe ich mich für Schlüsselpaare entschieden. Weil mir klar wurde, dass das der einfachste Weg ist.
Eonil
9
@Eonil: Versuchen Sie nicht, Schlüssel ohne Passphrase zu verwenden. Erfahren Sie, wie Sie ssh-agent oder pageant verwenden.
user9517
123
Dies ist eine gute Antwort, aber nicht die richtige Antwort auf die Frage.
John Hunt
77
Diese Art von Antworten nerven mich wirklich sehr. Das war nicht die Frage. Niemand fragte, wie man Schlüsselpaare benutzt.
Matt Fletcher
17
Dies beantwortet die Frage nicht. Es ist eine gute Antwort auf eine ganz andere Frage, aber für die gestellte ist es schrecklich.
Srchulo
600
$ sudo apt-get install sshpass
$ sshpass -p your_password ssh user@hostname
Wochen
quelle
51
Ja, manchmal kann man aus verschiedenen Gründen keine schlüsselbasierte Authentifizierung verwenden. Im Moment kann ich beispielsweise keyauth nicht auf einem Plesk-Server verwenden, da es standardmäßig nicht aktiviert ist und ich kein Root-Verzeichnis habe.
John Hunt
17
+1! Als Randnotiz, müssen Sie sshvor der Verwendung einmal sshpass
normal
22
-1 für die Verwendung des Kennworts im Befehl. Dies protokolliert das Passwort .bash_historyim Klartext auf Ihrem Computer.
15
@MisterDood Sie können history -rden Befehl ausführen , um Ihren Verlauf zu löschen. Guter Punkt.
NuclearPeon
20
Profi-Tipp: Wenn Sie nicht möchten, dass ein bestimmter Befehl in .bash_history angezeigt wird, müssen Sie dem Befehl ein Leerzeichen voranstellen. Es funktioniert einfach Benutzer dieses Befehls sollten sich jedoch mehr Sorgen machen, dass nicht privilegierte Benutzer auf dem System die vollständige Befehlszeile mit ps sehen können, die natürlich das Kennwort enthält. Da SSH-Sitzungen in der Regel lange dauern, handelt es sich um ein Sicherheitsproblem.
CubicleSoft
71

Während die richtige Antwort auf Ihre Frage sshkey lautet , gibt es einen sichereren Weg - SSH-Schlüssel. Sie sind nur drei einfache Schritte von der Lösung entfernt:

Generieren Sie ein RSA-Schlüsselpaar :

# ssh-keygen

Kopieren Sie es dann mit einem einfachen Befehl auf den Server :

# ssh-copy-id userid@hostname

Sie können sich jetzt ohne Passwort einloggen :

# ssh userid@hostname
lzap
quelle
1
Funktioniert gut mit den Standardwerten. Die Verwendung von ~ / rsa4live.pub hat bei mir beim Versuch nicht funktioniert ssh-copy-id.
Cees Timmerman
1
Wenn Sie diese Schritte für verschiedene Benutzer, 1. ssh-keygen 2. ssh-copy-id nazir @ hostname 3. ssh nazir @ hostname arbeiten
Venfah Nazir
2
Für mich war esssh-copy-id -i ~/.ssh/tatu-key-ecdsa user@host
Gabriel Fair
21
Dies ist keine Antwort auf die Frage.
Steve Bennett
2
Und? Die Antwort ist oben, sshpass ...
lzap
40

Verwendung erwarten:

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

Beispiel:

# ./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
quelle
2
Es hat funktioniert, aber es kann keine Standardausgabe des Remote-Computers drucken.
Eonil
Es funktioniert gut, wenn ein Computer den Schlüssel nicht im Voraus setzen kann, da die IP-Adresse jedes Mal geändert wird.
Larrycai
4
Es wird gut sein, den -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/nullBefehl ssh hinzuzufügen, um zu vermeiden, dass die Maschine in known_hosts
larrycai
B .. b aber muh ssh Schlüssel ...
Damien Ó Ceallaigh
Ein ausführlicheres Beispiel für dieses Skript finden Sie unter: linuxaria.com/howto/…. Dieses Beispiel hier sollte auch mit Remote-Befehlen
funktionieren
16

Dies könnte für Sie nicht von Nutzen sein, aber Sie können es mit Perl tun:

\#!/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
quelle
2
Ebenso können Sie mit diesem Ruby github.com/net-ssh/net-ssh
EnabrenTane
16

Ich bin überrascht, dass niemand plinkaus dem putty-toolsPaket in Ubuntu erwähnt:

plink user@domain -pw mypass  [cmd]

Es ist auch unter Windows verfügbar und die Syntax ist größtenteils mit dem openssh-Client kompatibel.

eadmaster
quelle
Für Windows Ihre Antwort ist gut, unfurtunally Linux / Unix-Benutzer haben in der Regel keinen Link
Radon8472
2
es ist im putty-toolsPaket
eadmaster
10

SSH Single Sign-On wird normalerweise mit der Authentifizierung mit öffentlichem Schlüssel und einem Authentifizierungsagenten durchgeführt. Sie können Ihren Test-VM-Schlüssel problemlos einem vorhandenen Authentifizierungsagenten hinzufügen (siehe Beispiel unten). Andere Methoden wie gssapi / kerberos existieren, sind jedoch komplexer.

sshpass

In Situationen, in denen passworddie einzige Authentifizierungsmethode verfügbar ist, kann sshpass verwendet werden, um das Kennwort automatisch einzugeben. Bitte beachten Sie insbesondere den Abschnitt SICHERHEITSHINWEISE auf der Manpage . In allen drei Optionen ist das Passwort irgendwann sichtbar oder im Klartext gespeichert :

Anonymes Pipe (empfohlen von 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 ist ziemlich umständlich in Bash, wohl einfacher mit Programmiersprachen. Ein anderer Prozess kann an Ihre Pipe / fd angehängt werden, bevor das Kennwort geschrieben wird. Das Zeitfenster ist recht kurz und beschränkt sich auf Ihre Prozesse oder Ihre Wurzel.

Umgebungsvariable

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

Sie und root können die Umgebungsvariablen Ihres Prozesses (dh Ihr Passwort) lesen, während sshpass ausgeführt wird ( cat /proc/<pid>/environ | tr '\0' '\n' | grep ^SSHPASS=). Das Zeitfenster ist viel länger, aber immer noch auf Ihre eigenen Prozesse oder Root beschränkt, nicht auf andere Benutzer.

Befehlszeilenargument (am wenigsten sicher)

 sshpass -p my_secret_password ssh user@host

Dies ist praktisch, aber weniger sicher, wie in der Manpage beschrieben. Befehlszeilenargumente sind für alle Benutzer sichtbar (z ps -ef | grep sshpass. B. ). sshpass versucht, das Argument auszublenden, aber es gibt immer noch ein Fenster, in dem alle Benutzer sehen können, dass Ihr Kennwort als Argument übergeben wurde.

Randnotiz

Setzen Sie Ihre Bash- HISTCONTROL-Variable auf ignorespaceoder ignorebothund stellen Sie Ihren sensiblen Befehlen ein Leerzeichen voran . Sie werden nicht in der Geschichte gespeichert.


SSH-Authentifizierung mit öffentlichem Schlüssel

# 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

Die Passphrase ist sehr wichtig. Jeder, der die private Schlüsseldatei erhält, kann sie ohne die Passphrase nicht verwenden.

Richten Sie den SSH-Authentifizierungsagenten ein

# 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)

Verbinden Sie sich wie gewohnt

ssh user@host

Der Vorteil ist, dass Ihr privater Schlüssel verschlüsselt ist und Sie die Passphrase nur einmal eingeben müssen (auch über eine sicherere Eingabemethode).

Nrolane
quelle
8

Sicher, dass Sie keine SSH-Schlüssel anstelle von Passwörtern verwenden möchten? Auf diese Weise ist es sowohl sicher als auch automatisch.

Coops
quelle
3
Die Verwendung von SSH-Schlüsseln ohne Kennwort ist nur geringfügig sicherer als die Verwendung von Kennwörtern in einer Datei.
Yunzen
10
@yunzen Falsch. Die Schlüsselauthentifizierung schützt Sie auch dann vor Mitm-Angriffen, wenn Sie den Hostschlüssel nicht kennen. Ein Angreifer könnte sich als Server ausgeben, jedoch niemals eine Verbindung zum realen Server herstellen. Bei der Kennwortauthentifizierung wird jedem Server, mit dem Sie eine Verbindung herstellen (legitim oder nicht), das Kennwort angezeigt. Aus diesen Gründen ist ein SSH-Schlüssel ohne Kennwort viel sicherer als nur das Speichern des Kennworts in einer Datei.
Kasperd
14
Dies ist keine Antwort.
Steve Bennett
@SteveBennett Entspricht der akzeptierten Antwort und wurde davor gepostet, hat jedoch weniger Details.
Michael Hampton
3
Nun, ich würde sagen, die akzeptierte Antwort ist eine anständige Antwort auf eine Frage, die nicht gestellt wurde. Das ist nichts.
Steve Bennett
4

Je nach Ihren Automatisierungsanforderungen passt Ansible möglicherweise zu Ihnen. Es kann Dinge wie die Aufforderung zur Eingabe eines Passworts, die Aufforderung zur Eingabe eines Sudo-Passworts, verschiedene Arten der Änderung der Verwendung und die sichere Verwendung verschlüsselter Geheimnisse (Tresor) verwalten.

Wenn das nicht passt, würde ich Expect vorschlagen, wie in einer anderen Antwort vorgeschlagen.

Cameron Kerr
quelle