Ich verwende Mac OS X Lion und melde mich täglich bei Remote-Hosts über SSH an. Obwohl ich zur Remote-Authentifizierung ein SSH-Schlüsselpaar verwende und nicht die Anmeldephrase jedes Hosts motorisieren muss, ist es dennoch sehr ärgerlich, dass das Terminal nach der Passphrase für den Zugriff auf meinen privaten SSH-Schlüssel fragt.
Aus Sicherheitsgründen ist meiner Meinung nach eine Passphrase für den Zugriff auf den privaten SSH-Schlüssel unbedingt erforderlich. Gibt es eine Möglichkeit, das Terminal dazu zu bringen, die Phrase beim Start genau nur einmal abzufragen, sie sich dann zu merken und meinen privaten Schlüssel in späteren SSH-Sitzungen automatisch zu verwenden?
Es gibt ein Skript namens keychain
, das unter Gentoo Linux einwandfrei funktioniert. Aber ich habe es unter Mac OS X Lion nie herausgefunden. Außerdem gibt es so viele einschüchternde Begriffe wie ssh-agent
, ssh-add
. Nachdem ich verschiedene Materialien über diese SSH-Toolkits gelesen und einige frustrierende Experimente durchgeführt hatte, war ich noch verwirrter.
Aus diesem Grund bin ich zu StackExchange gekommen, um Rat zu den folgenden Fragen zu suchen.
- Was sind
ssh-agent
,ssh-add
,keychain
,Keychain Access.app
und wie interagieren sie miteinander? - Wie kann ich die Passphrase für meinen privaten SSH-Schlüssel einmal beim Anmelden eingeben und sie beim späteren Erstellen einer SSH-Sitzung frei verwenden?
- Ähm... Was ist falsch an
Keychain Access.app
? Es speichert die SSH-Phrase nicht mehr wie vorher.
Ich liste hier auf, was ich getan habe. Hoffentlich gibt es Hinweise zu den Schritten, die ich vergessen habe.
Schritt 1. Erstellen Sie ein SSH-Schlüsselpaar auf meinem Mac.
$ ssh-keygen -t rsa -C "[email protected]"
# Set a passphrase for accessing the private key.
Schritt 2. Kopieren Sie meinen öffentlichen SSH-Schlüssel auf den Remote-Host. Als Beispiel kopiere ich den Schlüssel auf den lokalen Host, Mac.
$ ssh-copy-id USER@localhost
# Enter the login password for USER at localhost, not my SSH passphrase
Schritt 3. Versuchen Sie dann, über die SSH-Schlüsselpaar-Authentifizierung eine Verbindung zum Remote-Host (hier: localhost) herzustellen.
$ ssh USER@locahost
Enter passphrase for key '/Users/YOUR_ACCOUNT/.ssh/id_rsa':
# Enter my SSH passphrase, not the login password.
Schritt 4. Melden Sie sich vom Remote-Host ab und versuchen Sie erneut, eine Verbindung herzustellen. Verdammt, das Terminal fragt erneut nach der SSH-Phrase.
Eine häufig gestellte Frage lautet: „Funktioniert SSH-Agent auf Ihrem Mac einwandfrei?“ Ehrlich gesagt habe ich keine Ahnung, was hier los ist. Hier sind einige Ergebnisse.
$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(EMPTY)
$ ssh-add -l
Could not open a connection to your authentication agent.
$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-Z54zXukQiP/agent.26769; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26770; export SSH_AGENT_PID;
echo Agent pid 26770;
$ ssh-add -l
Could not open a connection to your authentication agent.
$ echo $SSH_AUTH_SOCK
/tmp/launch-M48niA/Listeners
$ echo $SSH_AUTH_PID
(STILL EMPTY)
$ ssh-agent # Oh no, anther ssh-agent with different PID
SSH_AUTH_SOCK=/tmp/ssh-cx0B4FUX8B/agent.26898; export SSH_AUTH_SOCK;
SSH_AGENT_PID=26899; export SSH_AGENT_PID;
echo Agent pid 26899;
$ ps -e | grep -i ssh
26769 ?? 0:00.03 ssh-agent
26899 ?? 0:00.02 ssh-agent
Wir freuen uns über jedes Feedback. Danke!
Antwort1
ssh-agent
ist das Teil, das Sie zum Laufen bringen möchten, da es genau das tut, wonach Sie fragen. Der Agent läuft als Daemon, und wenn Sie ihm einen privaten Schlüssel „hinzufügen“, merkt er sich diesen Schlüssel und stellt ihn der Remote-Instanz sshd
bei der ersten Verbindung automatisch zur Verfügung. ( ssh-add
ist einfach der Befehl, den Sie ausführen, um manuell einen privaten Schlüssel hinzuzufügen ssh-agent
).
In OS X ab Leopard sollten Sie es nie mehr ssh-agent
manuell ausführen müssen ssh-add
. Es sollte „einfach passieren“, wenn Sie versuchen, eine Verbindung zu einem Server herzustellen. Einmal pro Schlüssel wird Ihnen ein UI-Passwortdialog angezeigt, der (unter anderem) es Ihnen ermöglicht, den Schlüssel automatisch hinzuzufügen, ssh-agent
sodass Sie nie wieder dazu aufgefordert werden.
Dies wird durch eine Konfiguration erreicht launchd
, die auf Verbindungen am $SSH_AUTH_SOCK
Socket wartet und automatisch gestartet wird, ssh-agent
wenn dies zum ersten Mal nötig ist. Danach ssh-agent
werden Sie nur dann zur Eingabe von Anmeldeinformationen aufgefordert, wenn ein neuer Schlüssel geöffnet werden muss.
Wenn das nicht funktioniert, stellen Sie sicher, dass die richtige launchd
Konfigurationsdatei vorhanden ist:
/System/Library/LaunchAgents/org.openbsd.ssh-agent.plist
Wenn es aus irgendeinem Grund immer noch nicht funktioniert, können Sie die Dinge auf die „alte“ Art und Weise manuell zum Laufen bringen:
http://timesinker.blogspot.com/2007/08/getting-ssh-agent-going-on-mac-osx.html
Es gibt auch diese Anwendung, die ich seit dem Erscheinen von Leopard nicht mehr verwende, die aber in früheren Versionen von Mac OS X im Grunde dasselbe getan hat:
Antwort2
Während ich das "Problem" lösen wollte, habe ich einige verwandte Themen gegoogelt und mir Notizen darüber gemacht, wie ssh-agent
, ssh-add
, keychain
, KeyChain Access.app
funktionieren. Es stellte sich schließlich heraus, dass dieses Problem überhaupt kein Problem ist, sondern dass es nur um mich geht, und so genannteSSH-Anmeldung ohne jedes Mal nach der Passphrase zu fragenfunktioniert auf dem Mac sofort einwandfrei.
Ich habe durch diesen Prozess jedoch einige Erfahrungen gesammelt. Ich schreibe meine Notizen hier auf, in der Hoffnung, dass sie jemandem helfen, der diese Begriffe verwirrt.
Zwei Kennwortbegriffe:
passphrase
bezieht sich auf die erforderliche Phrase beim Zugriff auf Ihren privaten SSH-Schlüssel.password
bezieht sich auf die erforderliche Phrase zum Anmelden bei Ihrem Mac.
Jetzt kann ich herausfinden, was diese Toolkits machen, nämlich , , , ssh-agent
auf ssh-add
dem Mac.keychain
Keychain Access.app
ssh-agent
ist der kritische Dienst, der die Verwendung des privaten SSH-Schlüssels ohne Eingabe der SSH-Passphrase ermöglicht.ssh-agent
funktioniert auf diese Weise. Zuerst speichert es oderZwischenspeicher, Ihren privaten SSH-Schlüssel im Hauptspeicher. Wenn Ihr privater SSH-Schlüssel dann zu einem späteren Zeitpunkt in dieser Sitzung für die Remote-Authentifizierung benötigt wird,ssh-agent
wird Ihr privater Schlüssel im Hauptspeicher gefunden und an den Remote-Prozess übergeben. Sie werden nur dann aufgefordert, Ihre SSH-Passphrase einzugeben, wenn Ihr privater Schlüsselssh-agent
anfänglich hinzugefügt wird.ssh-add
ist Teil einerssh-agent
Sammlung, die Ihnen hilft, Ihre SSH-Schlüssel zu verwaltenssh-agent
. Wir verwendenssh-add
Befehle, um private Schlüssel im Schlüsselbund des SSH-Agenten aufzulisten, hinzuzufügen und zu entfernen. Anschließendssh-add
kommuniziert er mitssh-agent
dem Dienst, um die Aufgaben auszuführen.keychain
ist ein Skript zum Suchenssh-agent
eines Dienstes (falls dieser nicht vorhanden ist, starten Sie einen neuen) und zum Aufrufenssh-add
des Hinzufügens von privaten SSH-Schlüsseln.keychain
Hat eine einfache und unkomplizierte Idee und funktioniert gut unter Linux, wo der SSH-Agent normalerweise nicht automatisch gestartet wird.Keychain Access.app
scheint die komplizierteste Komponente zu sein. Es handelt sich um den universellen Token-Speicherdienst von Mac OS X. Er speichert verschiedene Token, wie Passwörter, Zertifikate usw. und dient als TokenAgentfür die Apps, die die Token anfordern. In unserem Fall mit dem privaten SSH-Schlüssel erfasst es zuerst die Anforderung zum Zugriff auf den privaten SSH-Schlüssel und öffnet ein Fenster, in dem Sie aufgefordert werden, die SSH-Passphrase, die eine Art Token ist, imKeychain Access.app
Schlüsselbund von zu speichern. Wenn Sie dann das nächste Mal private Schlüssel zur Authentifizierung verwenden,Keychain Access.app
öffnet sich erneut ein Fenster mit der Frage, ob das Privileg gewährt werden soll. Nach einer klaren Ja-Antwortkeychain Access.app
fügt es Ihren privaten Schlüssel zumssh-agent
Speicher von hinzu.
Zwei Dinge verdienen Ihre Aufmerksamkeit:
ssh-agent
Mac OS X Lion startet beim Systemstart automatisch einen Dienst, der auf einem Socket unter lauscht/tmp
.Keychain Access.app
speichert Ihre SSH-Passphrase, sodass Ihr privater Schlüssel hinzugefügt werden kann,ssh-agent
ohne dass Sie dabei unterbrochen werden. Ja, Sie müssen Ihre SSH-Phrase nicht eingeben, aber Sie müssen das Anmeldekennwort Ihres Mac-Kontos eingeben, um Berechtigungen zu erteilen, wenn Sie diesen Eintrag zum ersten Mal erstellen.
Zusammenfassend also:Die SSH-Anmeldung ohne Abfrage der Passphrase sollte unter Mac OS X sofort funktionieren.
Antwort3
Falls andere Lösungen hier für manche nicht funktionieren, hat bei mir Folgendes funktioniert.
Stellen Sie für jeden privaten Schlüssel in Ihrem ~/.ssh-Verzeichnis sicher, dass auch der entsprechende öffentliche Schlüssel vorhanden ist. Stellen Sie sicher, dass der öffentliche Schlüssel genau den gleichen Namen hat wie der private Schlüssel, jedoch mit .pub
am Ende. Wenn Sie bereits einen geeigneten öffentlichen Schlüssel hatten, versuchen Sie, ihn neu zu generieren.
Wenn Sie die öffentlichen Schlüssel neu erstellen müssen, können Sie dies ganz einfach tun: -
ssh-keygen -y -f ~/.ssh/my_key > ~/.ssh/my_key.pub
Ersetzen Sie my_key
es durch den Namen Ihres Schlüssels.
Danach merkt sich MacOS die Schlüsselpassphrase wie vorgesehen im Schlüsselbund.
Hinweis: Das Eingeben der Passphrase und das Speichern im Schlüsselbund ist jetzt eine einmalige Aktion (nicht einmal pro Anmeldesitzung, wie vom OP gewünscht), aber vorausgesetzt, die Anmeldung am betreffenden Mac ist passwortgeschützt, dann ist Ihre Passphrase durch dieses Anmeldepasswort geschützt. Außerdem ergibt diese Lösung für mich keinen Sinn ... zusätzlich zum privaten Schlüssel sollte kein öffentlicher Schlüssel erforderlich sein, aber aus irgendeinem Grund erfordert MacOSX ihn.
(ursprünglich ausAntwortzu einer ähnlichen Frage auf Apple Stack Exchange)
Antwort4
ssh-copy-id
Sie hätten auch versuchen können , durch etwas wie zu ersetzen .k="$(cat ~/.ssh/id_rsa.pub)"; ssh [email protected] "umask 0077; mkdir -p ~/.ssh; echo "$k" >> ~/.ssh/authorized_keys2"