Ich möchte zwischen mehreren Computern in meinem Netzwerk (statisches Ethernet) über SSH kommunizieren. Um dies zu tun, muss ich jedes Mal ssh-add ausführen, wenn ich mich auf einem bestimmten Computer anmelde. Wie kann ich es tun, damit es einmal eingerichtet wird und mich nicht jedes Mal nach der Passphrase fragt, wenn ich mich anmelde oder neu starte? meine Maschine?
Ich weiß, dass es eine Möglichkeit gibt, dem bash_profile
einige Zeilen hinzuzufügen Datei, aber ich muss das Passwort trotzdem jedes Mal eingeben, wenn ich neu starte/sich an einem bestimmten Computer anmelde.
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Akzeptierte Antwort:
Dies ist ein typisches Beispiel für einen Kompromiss zwischen Sicherheit und Komfort. Zum Glück gibt es mehrere Möglichkeiten. Die am besten geeignete Lösung hängt vom Nutzungsszenario und dem gewünschten Sicherheitsniveau ab.
ssh-key mit passphrase, nein ssh-agent
Jetzt muss die Passphrase jedes Mal eingegeben werden, wenn der Schlüssel zur Authentifizierung verwendet wird. Dies ist zwar aus Sicherheitsgründen die beste Option, bietet aber die schlechteste Benutzerfreundlichkeit. Dies kann auch dazu führen, dass eine schwache Passphrase gewählt wird, um die Belastung durch wiederholte Eingabe zu verringern.
ssh-key mit passphrase, mit ssh-agent
Folgendes zu ~/.bash_profile
hinzufügen startet automatisch ssh-agent
und laden Sie die ssh-Schlüssel beim Login:
if [ -z "$SSH_AUTH_SOCK" ] ; then
eval `ssh-agent -s`
ssh-add
fi
Nun muss die Passphrase bei jedem Login eingegeben werden. Dies ist zwar aus Sicht der Benutzerfreundlichkeit etwas besser, hat aber den Nachteil, dass ssh-agent
fordert zur Eingabe der Passphrase auf, unabhängig davon, ob der Schlüssel während der Anmeldesitzung verwendet werden soll oder nicht. Jede neue Anmeldung erzeugt auch einen eigenen ssh-agent
Instanz, die auch nach dem Abmelden mit den hinzugefügten Schlüsseln im Speicher weiterläuft, sofern sie nicht explizit beendet wird.
Um ssh_agent
zu beenden Fügen Sie beim Abmelden Folgendes zu ~/.bash_logout
hinzu
if [ -n "$SSH_AUTH_SOCK" ] ; then
eval `/usr/bin/ssh-agent -k`
fi
oder Folgendes zu ~/.bash_profile
trap 'test -n "$SSH_AUTH_SOCK" && eval `/usr/bin/ssh-agent -k`' 0
Erstellen mehrerer ssh-agent
Instanzen können vermieden werden, indem ein dauerhafter Kommunikationssocket zum Agenten an einer festen Stelle im Dateisystem erstellt wird, wie z. B. in Collin Andersons Antwort. Dies ist eine Verbesserung gegenüber dem Spawnen mehrerer Agenteninstanzen, jedoch bleibt der entschlüsselte Schlüssel nach dem Abmelden immer noch im Speicher, es sei denn, er wird explizit beendet.
Auf Desktops können ssh-Agenten, die in der Desktop-Umgebung enthalten sind, wie der Gnome Keyring SSH Agent, ein besserer Ansatz sein, da sie normalerweise dazu gebracht werden können, die Passphrase einzugeben, wenn der ssh-Schlüssel zum ersten Mal während einer Anmeldesitzung verwendet wird und Speichern Sie den entschlüsselten privaten Schlüssel bis zum Ende der Sitzung im Speicher.
ssh-key mit passphrase, mit ssh-ident
ssh-ident
ist ein Dienstprogramm, das ssh-agent
verwalten kann in Ihrem Namen und laden Identitäten nach Bedarf. Es fügt Schlüssel nur einmal bei Bedarf hinzu, unabhängig davon, wie viele Terminals, SSH- oder Anmeldesitzungen Zugriff auf einen ssh-agent
benötigen . Es kann auch einen anderen Agenten und einen anderen Satz von Schlüsseln hinzufügen und verwenden, je nachdem, mit welchem Host eine Verbindung hergestellt wird oder von welchem Verzeichnis aus ssh aufgerufen wird. Dies ermöglicht das Isolieren von Schlüsseln, wenn die Agentenweiterleitung mit verschiedenen Hosts verwendet wird. Es ermöglicht auch die Verwendung mehrerer Konten auf Websites wie GitHub.
Um ssh-ident
zu aktivieren , installieren Sie es und fügen Sie den folgenden Alias zu Ihrem ~/bash_profile
hinzu :
alias ssh='/path/to/ssh-ident'
ssh-key mit passphrase, mit keychain
keychain
ist ein kleines Dienstprogramm, das ssh-agent
verwaltet in Ihrem Namen und
erlaubt dem ssh-agent
ausgeführt zu bleiben, wenn die Anmeldesitzung endet. Bei späteren Anmeldungen keychain
verbindet sich mit dem bestehenden ssh-agent
Beispiel. In der Praxis bedeutet dies, dass die Passphrase nur beim ersten Login nach einem Neustart eingegeben werden muss. Bei nachfolgenden Anmeldungen der unverschlüsselte Schlüssel aus dem vorhandenen ssh-agent
Instanz verwendet wird. Dies kann auch nützlich sein, um eine passwortlose RSA/DSA-Authentifizierung in cron
zu ermöglichen Jobs ohne passwortlose SSH-Schlüssel.
Um keychain
zu aktivieren , installieren Sie es und fügen Sie etwas wie das Folgende zu ~/.bash_profile
hinzu :
eval `keychain --agents ssh --eval id_rsa`
Aus Sicherheitssicht ssh-ident
und keychain
sind schlechter als ssh-agent
Instanzen, die auf die Lebensdauer einer bestimmten Sitzung begrenzt sind, aber ein hohes Maß an Komfort bieten. Um die Sicherheit von keychain
zu verbessern , einige Leute fügen den --clear
hinzu Option zu ihrem ~/.bash_profile
hinzufügen Schlüsselbund-Aufruf. Dabei müssen Passphrasen wie oben beim Login neu eingegeben werden, aber cron
Jobs haben weiterhin Zugriff auf die unverschlüsselten Schlüssel, nachdem sich der Benutzer abgemeldet hat. Der keychain
Wiki-Seite enthält weitere Informationen und Beispiele.
ssh-Schlüssel ohne Passphrase
Aus Sicherheitsgründen ist dies die schlechteste Option, da der private Schlüssel im Falle einer Offenlegung völlig ungeschützt ist. Nur so kann jedoch sichergestellt werden, dass die Passphrase nach einem Neustart nicht erneut eingegeben werden muss.
ssh-key mit passphrase, mit ssh-agent
, Passphrase übergeben an ssh-add
aus dem Skript
Obwohl es wie eine einfache Idee erscheinen mag, die Passphrase an ssh-add
zu übergeben aus einem Skript, z. echo "passphrase\n" | ssh-add
, das ist nicht so einfach, wie es scheint, wie ssh-add
liest die Passphrase nicht aus stdin
, öffnet aber /dev/tty
direkt zum Lesen.
Dies kann mit expect
umgangen werden , ein Tool zur Automatisierung interaktiver Anwendungen. Unten sehen Sie ein Beispiel für ein Skript, das einen SSH-Schlüssel mit einer im Skript gespeicherten Passphrase hinzufügt:
#!/usr/bin/expect -f
spawn ssh-add /home/user/.ssh/id_rsa
expect "Enter passphrase for /home/user/.ssh/id_rsa:"
send "passphrase\n";
expect "Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)"
interact
Beachten Sie, dass, da die Passphrase im Klartext im Skript gespeichert ist, dies aus Sicherheitsgründen kaum besser ist als ein passwortloser SSH-Schlüssel. Wenn dieser Ansatz verwendet werden soll, ist es wichtig sicherzustellen, dass der expect
Für das Skript, das die Passphrase enthält, sind die richtigen Berechtigungen festgelegt, sodass es nur vom Eigentümer des Schlüssels gelesen, geschrieben und ausgeführt werden kann.