Wie richte ich SSH ein, damit ich mein Passwort nicht eingeben muss?


149

Wie richte ich SSH ein, damit ich mein Passwort nicht eingeben muss, wenn ich mich mit einem Host verbinde?


Man könnte argumentieren, wenn für die Verwendung solcher Schlüssel kein Passwort erforderlich ist. Um zu vermeiden, dass jeder, der Ihren privaten Schlüssel in die Hand nimmt, ihn tatsächlich missbrauchen kann, können Sie den Schlüssel durch ein eigenes Kennwort schützen. Natürlich kann man dieses Passwort leer lassen, aber es gibt viele Fälle, in denen dies nicht empfohlen wird.
Arjan

Auf dem neuesten Cygwin mit der neuesten SSH wurde ich erneut aufgefordert, weil ich eine Änderung an meinem ~/.ssh/configjetzt erforderlichen PubkeyAcceptedKeyTypes ssh-rsa*,ssh-dss*
vornehmen

Antworten:


160

Generieren Sie einen SSH-Schlüssel (falls Sie keinen haben)

Wenn Sie GNOME verwenden, kann die Anwendung seahorse ("Passwörter und Verschlüsselungsschlüssel") dies für Sie tun: Datei -> Neu -> Secure Shell-Schlüssel .

Wenn Sie das Terminal bevorzugen, führen Sie den Befehl aus, um ein Schlüsselpaar zu generieren. Gültige Schlüsselpaartypen sind:ssh-keygen -t <type>

  • rsa: die standardeinstellung
  • dsa: Mehr oder weniger äquivalent, mit Ausnahme von 1024-Bit-Schlüsseln
  • ecdsa: Gleiche Sicherheit mit kleineren Schlüsseln, aber relativ neu und in SSH-Software eher selten.
  • ed25519: Hohe Sicherheit (resistenter gegen Seitenkanalangriffe und schwache Zufallszahlengeneratoren). Sehr schnelle Signaturerstellung. Sehr neu. Nur in OpenSSH> = 6.5 verfügbar .

Das Programm fragt Sie nach einer Passphrase und einem Speicherort für den neuen Schlüssel. Es wird empfohlen, den vorgeschlagenen Standardpfad zu verwenden, da alle anderen Tools dort danach suchen.

Laden Sie den öffentlichen Schlüssel auf den Remote-Server hoch

Auch hier kann seahorse dies häufig für Sie tun. Klicken Sie in My Personal Keys mit der rechten Maustaste auf Ihren SSH-Schlüssel und wählen Sie Configure Key for Secure Shell .

Oder ssh-copy-id -i ~/.ssh/id_rsa.pub remote-user@remote-hostim Terminal.

Oder ganz manuell Schritt für Schritt:

  1. Erstellen Sie ein Verzeichnis (falls noch nicht vorhanden), das .sshim Ausgangsverzeichnis des Remotebenutzers auf dem Remotehost angegeben ist.
  2. Erstellen Sie in diesem Verzeichnis eine Datei mit dem Namen authorized_keys(falls noch nicht vorhanden).
  3. Falls Ihre Fernbedienung umaskliberaler als üblich ist, machen sich die Datei nicht Gruppe beschreibbare: chmod go-w ~/.ssh ~/.ssh/authorized_keys.
  4. Kopieren Sie zum Schluss den Inhalt Ihres lokalen öffentlichen Schlüssels ( ~/.ssh/id_rsa.pub) in die Remote- ~/.ssh/authorized_keysDatei.

Laden Sie den Schlüssel in den ssh-Agenten

Wenn Sie Ihren privaten Schlüssel in einen ssh- Agenten laden , speichert dieser den entschlüsselten Schlüssel im Speicher. Damit soll vermieden werden, dass das Kennwort bei jedem Shell-Vorgang auf einem Server erneut eingegeben wird.

Zunächst muss der Agent gestartet oder der Pfad eines gestarteten Kommunikations-Sockets in eine Variable geladen werden. Wenn Sie ssh-agent auf einem Terminal ausführen, werden Befehle zum Zuweisen und Setzen der Agentenvariablen generiert. Diese Befehle können zur Verwendung in einem anderen Terminal in einer Datei gespeichert werden. Alternativ könnte man diese Befehle ausführen und vergessen, denselben Agenten in einem anderen Terminal erneut zu verwenden. zB: eval $(ssh-agent).

Das Laden des Schlüssels ist eine einfache Sache, die Passphrase auszuführen ssh-addund ihm zu geben.

Wenn Sie GNOME verwenden, bietet der gnome-keyring-daemon normalerweise die gleiche SSH-Agent-Funktionalität wie der ssh-agent. Sie sollten also nichts starten müssen. GNOME lädt und entsperrt den Schlüssel automatisch auch beim Anmelden.

Shell in den Remote-Server ohne Passwort

Wenn alles richtig gemacht wurde, werden Sie bei Verwendung von nicht zur Eingabe eines Kennworts aufgefordert. Wenn mit dem Agenten und nicht mit dem Schlüssel etwas nicht stimmt, werden Sie aufgefordert, die Passphrase für den Schlüssel und nicht das Kennwort für das Benutzerkonto einzugeben.ssh user@server

Alles, was ssh für die Kommunikation verwendet, funktioniert ohne Eingabe des Benutzerkontokennworts, wenn der richtige Schlüssel im Agenten geladen ist. Programme wie scp , sftp und rsync machen davon Gebrauch.


Anmerkungen:

  • Sie benötigen nur einen SSHv2-Schlüssel, da SSHv1 sehr unsicher ist und jetzt nicht verwendet wird.
  • Sie benötigen nur einen Schlüsseltyp - entweder RSA oder DSA ist ausreichend. (ed25519 und ECDSA sind beide neu und werden daher nicht überall unterstützt).
  • Alle diese Schritte sind für RSA- und DSA-Schlüssel gleich. Wenn Sie DSA verwenden, verwenden Sie id_dsaanstelle von id_rsaund ECDSA wird haben id_ecdsa.
  • OpenSSH-Server älter als 3.0 werden verwendet authorized_keys2- es ist jedoch sehr unwahrscheinlich, dass etwas älter als 5.0 verwendet wird.
  • Diese Anweisungen gelten nur für OpenSSH Version 3.0 und höher. lsh, ssh.comUnd andere (Unix und nicht) SSH - Server sind nicht in diesem Tutorial enthalten.

Beispiele:

  • Kopieren des öffentlichen Schlüssels auf einen Remote-Host:

    ssh-copy-id -i ~ / .ssh / id_rsa.pub myaccount @ remotehost # this
    
    cat ~ / .ssh / id_rsa.pub | ssh myaccount @ remotehost \
          'mkdir -p ~ / .ssh; cat >> ~ / .ssh / authorized_keys '# oder so
    
  • Agentenvariablen zur Wiederverwendung speichern (ausführliches Beispiel)
    ssh-agent> ~ / .ssh / terminalübergreifender Agent
    . ~ / .ssh / terminalübergreifender Agent
    

7
ah, du musst "ssh-add {pfad-zu-privat-schlüssel-datei}" sagen und dann wirst du nach deiner passphrase gefragt. Bitte verdeutlichen Sie dies in Ihrem Beitrag. Sie sollten auch "Viertens, ssh ausführen" hinzufügen. Ein Teil des Problems bei der Dokumentation mit diesem Zeug ist, dass es scheinbar offensichtliche Schritte verschleiert, die für jemanden, der noch keine Ahnung hat, was los ist und wie diese Programme zusammenarbeiten, NICHT offensichtlich sind.
Jason S

1
Jason: ssh-add -l soll prüfen, ob ein Agent läuft. ssh-add ohne Argumente fügt den Schlüssel vom Standardspeicherort (~ / .ssh / id_rsa) hinzu. Wie auch immer, aktualisiert.
Grawity

4
Es gibt einen Befehl ssh-copy-id, der den öffentlichen Schlüssel auf den Zielhost kopiert und Berechtigungen automatisch festlegt.
Hasen

1
Gute Antwort! Es fehlt ein wenig über die Dateiberechtigungen der Schlüsseldateien - ich hatte heute nur ein Problem damit. Die private Schlüsseldatei sollte nur für mich zugänglich sein, und die öffentliche Schlüsseldatei sollte nur für mich beschreibbar sein.
Ripper234

1
Ein Liner: ssh-keygen -f ~/.ssh/id_rsa -N "";ssh-copy-id -i ~/.ssh/id_rsa username@server-ip-or-address(einfach austauschen username@server-ip-or-address).
Totymedli

22

Sie haben nicht angegeben, auf welchem ​​Unix Sie sich befinden, mit welchem ​​Unix Sie sich verbinden, welche Shell Sie verwenden, welche SSH-Variante Sie verwenden usw. Einige davon müssen möglicherweise leicht angepasst werden. Dies basiert auf einigermaßen aktuellen Versionen von OpenSSH, das auf vielen Unix-Varianten verwendet wird.

Dies ist alles von Ihrem lokalen Desktop-System.

ssh-keygen

Stellen Sie sicher, dass Sie die Standardeinstellung für den Schlüsselnamen verwenden. Ich schlage vor , dass Sie tun auf diesem Schlüssel ein Passwort gesetzt, andernfalls wird es ein Sicherheitsproblem ist. "-t rsa" wäre keine schlechte Idee, wird aber wahrscheinlich nicht benötigt.

ssh-copy-id username@server

Daraufhin werden Sie nach dem Kennwort gefragt, mit dem Sie sich anmelden möchten, und das authorised_keys-Zeug wird für Sie eingerichtet. (keine Notwendigkeit, es von Hand zu tun)

Dann das:

`ssh-agent`

oder vielleicht das:

exec ssh-agent sh

oder:

exec ssh-agent bash

Dadurch wird ein SSH-Agent gestartet, der Ihren Schlüssel enthalten kann. Bei vielen modernen Unix-Varianten hat dies bereits stattgefunden, wenn Sie grafisch angemeldet sind. Die erste Variante (mit den Backticks) stellt einen ssh-Agenten in den Hintergrund und richtet die Umgebungsvariablen ein, um mit ihm zu sprechen. Bei den zweiten beiden führt der Agent eine Shell für Sie aus, sodass der Agent beim Beenden der Shell beendet wird.

In vielen modernen Unix-Varianten wird bereits ein Agent für Sie ausgeführt, insbesondere wenn Sie sich grafisch angemeldet haben. Sie könnten versuchen " ps aux | grep ssh-agent" oder " ps -ef | grep ssh-agent"; Wenn schon etwas läuft, benutze das.

Dann endlich:

ssh-add

Es wird nach einer Passphrase gefragt. gib es dem, den du ssh-keygen gegeben hast. Es gibt auch Möglichkeiten, es grafisch abzufragen. Und Sie können den ssh-agent und das ssh-add-Zeug in Ihre Anmeldeskripte einfügen (Setup ist je nach verwendeter Shell unterschiedlich), aber einige Unix-Varianten (z. B. aktuelles Ubuntu Linux) tun dies meistens automatisch Alles, was Sie wirklich tun müssen, ist, einen Schlüssel zu erstellen und ihn mit ssh-copy-id auf dem Remote-Host einzurichten.

Jetzt sollte " ssh username@server" funktionieren, ohne nach einer Authentifizierung zu fragen. Hinter den Kulissen wird ein Schlüssel verwendet, den der SSH-Agent in der Hand hält, und der Agent wird aufgefordert, die Zaubertricks für die Signatur auszuführen.


11

Dies ist auch in PuTTY unter Windows möglich.

Sobald Sie das öffentliche / private Schlüsselpaar eingerichtet haben (wie andere Antworten hier zeigen), führen Sie PuttyGen aus. Laden Sie dort den vorhandenen privaten Schlüssel, den Sie bereits eingerichtet haben, und speichern Sie ihn als privaten PuTTY-Schlüssel (ppk).

Klicken Sie dann in PuTTY einfach auf die gespeicherte Sitzung, bei der Sie sich automatisch anmelden möchten, und klicken Sie auf Laden. Gehen Sie von hier aus in Verbindung -> Daten im linken Bereich und geben Sie in "Benutzername für automatische Anmeldung" den Benutzernamen für diesen Remote-Server ein:

PuTTY-Benutzernamen eingeben

Gehen Sie danach zu Connection -> SSH -> Auth und suchen Sie nach dem in PuttyGen erstellten ppk:

PuTTY Private Key-Eingabe

Kehren Sie dann zur Sitzungsseite zurück und speichern Sie die zuvor geladene Sitzung.


Der erste Bildlink "PuTTY-Benutzername eingeben" scheint defekt zu sein.
Peter Mortensen

2
PuTTY enthält eine eigene Version von ssh-agent. Es heißt Pageant. Es läuft in der Taskleiste und hält Ihren Schlüssel für Sie bereit. Sie müssen nie ssh-agent ausführen. Aktivieren Sie in PuTTY im Abschnitt "Authentifizierung" die Option "Agentenweiterleitung zulassen". Die Verbindung von Pageant wird an das Remote-Ende weitergeleitet, um Ihren Schlüsselagenten für PuTTY verfügbar zu machen.
Kevin Panko

3

Bei einer sehr ähnlichen Frage zu ServerFault würde ich die Verwendung von ssh-copy-id empfehlen , die alle Schritte zum Einrichten von Authentifizierungsschlüsseln für Sie ausführt :

ssh-copy-id ist ein Skript, das ssh verwendet, um sich bei einem Remote-Computer anzumelden (vermutlich mit einem Anmeldekennwort, daher sollte die Kennwortauthentifizierung aktiviert sein, es sei denn, Sie haben mehrere Identitäten geschickt verwendet).

Es ändert auch die Berechtigungen für das Home des Remote-Benutzers, ~ / .ssh und ~ / .ssh / authorized_keys, um die Gruppenbeschreibbarkeit zu entfernen (was Sie andernfalls daran hindern würde, sich anzumelden, wenn auf dem Remote-SSHD StrictModes in seiner Konfiguration festgelegt ist).

Wenn die Option -i angegeben ist, wird die Identitätsdatei (standardmäßig ~ / .ssh / identity.pub) verwendet, unabhängig davon, ob sich in Ihrem ssh-agent Schlüssel befinden.

Alles was Sie tun müssen, ist einfach das:

ssh-copy-id user@host

Geben Sie Ihr Passwort einmal ein und Sie können loslegen!


3

Abgesehen von allem, was bereits zum Festlegen von SSH- Schlüsseln gesagt wurde, empfehle ich Keychain als SSH -Agent- Konsolen-Frontend, mit dem Sie nur einen pro Systemprozess anstatt pro Login verwalten können.

Ich weiß, dass es bereits GNOME- und KDE-Tools gibt, die dasselbe tun, aber wenn Sie der Konsolen-Junkie- Typ sind, ist dies großartig (und kann auf den meisten Unix-Systemen verwendet werden).

Um es zu verwenden, hängen Sie einfach Folgendes an Ihr an ~/.bashrc(ähnlich wie bei anderen Shells):

if type keychain >/dev/null 2>/dev/null; then
  keychain --nogui -q <all your SSH/PGP keys>
  [ -f ~/.keychain/${HOSTNAME}-sh ] && . ~/.keychain/${HOSTNAME}-sh
  [ -f ~/.keychain/${HOSTNAME}-sh-gpg ] && . ~/.keychain/${HOSTNAME}-sh-gpg
fi

2

http://linuxproblem.org/art_9.html

Dein Zielen

Sie möchten Linux und OpenSSH verwenden, um Ihre Aufgaben zu automatisieren. Daher benötigen Sie eine automatische Anmeldung von Host A / Benutzer a zu Host B / Benutzer b. Sie möchten keine Passwörter eingeben, da Sie ssh aus einem Shell-Skript heraus aufrufen möchten.


1
Die Ablehnung war nicht meine, aber es würde mir nichts ausmachen, wenn Leute ihre Antwort löschen, wenn sie bemerken, dass jemand anderes ein paar Momente zuvor eine fast ähnliche Antwort gepostet hat.
Arjan

2
Arjan: Ich stimme Ihnen größtenteils zu, aber wenn die Posts nur einige Sekunden voneinander entfernt sind, halte ich es nicht unbedingt für fair, die Person auf dem zweiten Platz zu bestrafen. Ich sage nicht, dass Sie sie mit einer Gegenstimme belohnen müssen, aber eine Gegenstimme erweckt den Eindruck, dass die Antwort nicht rechtzeitig, sondern falsch ist
TheTXI

2

Ich habe dieses sehr, sehr kurze Tutorial geschrieben, nachdem ich von WIRKLICH WIRKLICH langen Tutorials wirklich frustriert war, weil es so einfach ist :)

test -f ~/.ssh/id_rsa.pub || ssh-keygen -t rsa #press enter twice if given prompts, then "ssh-add"

scp ~/.ssh/id_rsa.pub destID@destMachine:/tmp/ #type password

ssh destID@destMachine #type password

cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys

rm /tmp/id_rsa.pub

2

Putty hat eine -pwOption, mit der Sie eine Verknüpfung auf dem Desktop erstellen können:

"C:\Program Files\PuTTY\putty.exe" -ssh user@192.168.2.2 -pw your_password

1
  1. Führen Sie auf dem verbindenden Host aus ssh-keygen. (Wenn Sie aufgefordert werden, einen Typ anzugeben, gehen Sie folgendermaßen vor ssh-keygen -t rsa.) Wenn Sie nach einem Dateispeicherort gefragt werden, übernehmen Sie die Standardeinstellung. Wenn Sie nach einer Passphrase gefragt werden, drücken Sie die Eingabetaste, um keine Passphrase einzugeben.
  2. cat ~/.ssh/id_rsa.pub(oder was auch immer der Standardspeicherort der Datei ssh-keygenwar, obwohl Sie eine wirklich alte sshInstallation haben müssten, damit es anders ist); Kopieren Sie die Ausgabe in Ihre Zwischenablage.
  3. Melden Sie sich normalerweise beim Zielhost als das Konto an, zu dem Sie eine Verbindung herstellen möchten. Bearbeiten Sie die Datei ~/.ssh/authorized_keys(falls ~/.sshnicht vorhanden, sloginan einen anderen Ort; dies ist der einfache Weg, um sie mit den richtigen Berechtigungen zu erstellen). Fügen Sie Ihre Zwischenablage (die die id_rsa.pubvom anderen Host enthält) in diese Datei ein.

3
-1 für den Vorschlag, keine Passphrase hinzuzufügen. Ohne eine Passphrase kann sich jeder, der die Datei liest, als legitimer Benutzer ausgeben.
bortzmeyer

2
Zunächst bat er darum, sein Passwort nicht eingeben zu müssen. Ich dachte nicht wirklich, dass es eine Verbesserung wäre, eine Passphrase anstelle seines Passworts eingeben zu müssen. Zweitens liegst du falsch; Aus diesem Grund gibt es einen öffentlichen und einen privaten Schlüssel, damit der öffentliche Schlüssel weltweit verfügbar ist.
Chaos

Das fragliche Kennwort wird während der Schlüsselgenerierung eingegeben, nicht jedes Mal, wenn Sie eine Verbindung herstellen. Richtig?
Richard Hoskins

Nein. Für mit einer Passphrase erstellte Schlüssel muss die Passphrase bei jeder Verwendung des Schlüssels eingegeben werden.
Chaos

2
Falsch. Mit ssh-agent (siehe die akzeptierte Antwort) geben Sie das Passwort nur einmal pro Sitzung ein.
Bortzmeyer

0

Wenn Sie alles im Terminal unter Linux erledigen möchten:

Auf dem Host

cd ~ / .ssh /

ssh-keygen -t {rsa | dsa} -b {1024 | 2048 | 4096} -C "Kommentartext, falls gewünscht" -f id_ArbitraryName

Die Elemente in {} sind Optionen. Verwenden Sie rsa oder dsa und wählen Sie die Bitgröße (größer ist sicherer).

Anschließend müssen Sie die Berechtigungen zu den Dateien authorized_keys und authorized_keys2 hinzufügen.

cat id_ArbitraryName.pub >> authorized_keys

cat id_AribtraryName.pub >> authorized_keys2

Laden Sie dann die Datei id_AribtraryName in die Box herunter, von der Sie ssh möchten. Wenn die Verbindungsbox auf Unix basiert, ist möglicherweise eine Konfigurationsdatei erforderlich (in Putty hat das jemand oben behandelt).

Auf der Anschlussbox

In Ihrer Konfigurationsdatei - vim ~ / .ssh / config

Hosten Sie example.host.com # oder Ihren Computernamen

Benutzer Benutzername

IdentityFile ~ / .ssh / id_ArbitraryName

Die Konfigurationsdatei benötigt Berechtigungen von 600. Der SSh-Ordner benötigt 700.

Ich hoffe, das hilft, wenn Sie auf das häufig ausgelassene Konfigurationsproblem stoßen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.