Wie kann ich eine SSH-Schlüssel-Passphrase einmal und nur bei Bedarf anfordern?

15

(Ich habe viele der Fragen auf dieser Website gelesen, die im Zusammenhang stehen, und ich glaube, dass dies eine wirklich neue Frage ist.)

Ich habe viele Schlüssel auf vielen Servern und sie sind alle mit Passphrasen geschützt.

Ich mag die Eingabe von Passwörtern genauso wie die Eingabe von Passwörtern - es ist ein echter Produktivitätsverlust.

  • ssh-agent + ssh-add- Befehle können in einer Login-Shell verwendet werden, um zu bedeuten, dass Sie Ihre Passphrase nur einmal bei der Anmeldung eingeben müssen

  • Der Schlüsselbund kann verwendet werden, um einen ssh-Agenten über das Abmelden hinaus am Leben zu halten. Sie müssen ihn beispielsweise beim Booten nur einmal eingeben, oder Sie können ihn eine Stunde lang am Leben halten.

Das Problem, das ich habe, ist, dass diese beiden Lösungen normalerweise bei einer Shell-Anmeldung initiiert werden (z. B. .zshrc), wenn ich meine Passphrase beim Anmelden eingebe, auch wenn ich sie nicht entsperren muss. (Ich bin nicht zufrieden mit dem Schlüsselbund, der einen Agenten auf unbestimmte Zeit am Leben hält.)

Was ich möchte, ist, dass ich nur bei Bedarf zur Eingabe einer Passphrase (für einen Agenten) aufgefordert werde .

Ich kann mich also bei Server A anmelden, ein paar Dinge erledigen, dann bei Server B ssh und an diesem Punkt nach der Passphrase gefragt werden. Mach ein paar Sachen auf Server B, logge dich aus. Zurück auf A, mach noch ein paar Sachen, ssh wieder auf B und brauche meine Passphrase nicht (sie wird von einem Agenten gehalten).

Ich stelle fest, dass dies auf grafischen Desktops wie Gnome möglich ist - Sie werden in einem Popup-Fenster aufgefordert, die Passphrase einzugeben, um Ihren privaten Schlüssel zu entsperren, sobald Sie versuchen, ssh auszuführen. Das ist es, wonach ich aber von einer Konsole aus suche.

Kunstvollroboter
quelle
Warum nicht einfach SSH-Schlüssel ohne Passphrasen generieren? Wenn Sie sowieso durch all diese Schwierigkeiten gehen werden?
am
1
Wenn jemand einbricht und es kennwortlose Schlüssel (oder einen aktiven SSH-Agenten) gibt, kann er auch auf viele andere Server zugreifen. Passphrasenlose Schlüssel können auch gestohlen und an anderer Stelle verwendet werden.
Artfulrobot
Soweit ich weiß, gibt es keine Möglichkeit, das zu tun, was Sie wollen, ohne ein gewisses Maß an Sicherheit zu opfern, was sich so anhört, als ob Sie es nicht wollen. Hier gab es eine ausführliche Antwort von Thomas Nyman, die viele Möglichkeiten aufzeigt, falls Sie sie noch nicht gelesen haben: unix.stackexchange.com/a/90869/82289 . Ich kann das in meinem Unternehmen umgehen, indem ich einen Zwischenserver verwende, der SSH-Sitzungen mit Tmux verwaltet.
Devnull
@ DevNull scheint seltsam, dass Sie es mit einem Desktop, aber nicht mit einem Terminal tun können, nicht wahr? Sicherlich muss der Agent nur zum tty springen, wenn keine Schlüssel hinzugefügt wurden? So müssen die Guis arbeiten?
Artfulrobot
Sie können meine Antwort hier einsehen : unix.stackexchange.com/a/184160/89706 (Link der Frage: unix.stackexchange.com/questions/90853/… )
Johnny Wong

Antworten:

14

Fügen Sie nichts zu Ihren Shell-Startskripten hinzu, dies ist unnötiger Hacker.

Fügen Sie stattdessen hinzu

AddKeysToAgent yes

in deine .ssh / config

Auf diese Weise wird ssh-add automatisch ausgeführt, wenn Sie das erste Mal in eine andere Box ssh. Sie müssen Ihren Schlüssel nur erneut eingeben, wenn er von ssh-agent abläuft oder nachdem Sie neu gestartet haben.

Toby
quelle
Ich wünschte, die Leute würden Kommentare abgeben, wenn sie abstimmen. Wenn es nicht richtig ist, wissen wir, warum es nicht richtig ist. Vielen Dank für Ihre Nachricht. Ich hatte keine Zeit, Ihren Vorschlag selbst zu testen.
Artfulrobot
Ich habe mich auch gefragt, vielleicht wegen meiner Cross-Posts?
Toby
Das funktioniert bei mir. Es ist jedoch eine sehr neue Erweiterung von openssh (7.2). Falls es jemandem hilft, ist openssh 7.3 in Debian Sid verfügbar.
Artfulrobot
@artfulrobot: Seltsam, da ich das selbe Verhalten (auto-ssh-add beim ersten Aufruf von ssh) jahrelang hatte, bis es vor einiger Zeit endlich aufhörte. Auf der Suche nach der Ursache fand ich AddKeysToAgent und nahm an, dass der Grund dafür, dass es gestoppt wurde, darin bestand, dass ich aus Versehen meine .ssh / config und AddKeysToAgent zusammen mit dieser gelöscht haben musste. Jetzt frage ich mich, warum es lange vor der Veröffentlichung von OpenSSH 7.2 funktioniert hat. Ich bilde mir das nicht ein :-)
Toby
@Toby das ist genau was ich brauche. Leider scheint ssh-agent in kubuntu nicht automatisch zu starten, also ist das das nächste, was ich lösen muss.
Ogaday
7

Zsh hat einen preexecHook, der eine Funktion ausführt, bevor ein in der Befehlszeile eingegebener Befehl ausgeführt wird. Hier ist ein Haken, der sshin Ihrer Befehlszeile nach sucht und, falls er gefunden wird, nach einem ssh-Agenten sucht . Wenn das nicht gefunden wird, wird keychain ausgeführt.

Auf diese Weise wird der Schlüsselbund nur vor ssh-Befehlen ausgeführt und nur dann, wenn dies erforderlich ist.

Fügen Sie dies in Ihre ~/.zshrc:

function check_ssh {
  [[ $3 =~ '\bssh\b' ]] || return
  [[ -n "$SSH_AGENT_PID" && -e "/proc/$SSH_AGENT_PID" ]] \
    && ssh-add -l >/dev/null && return
  eval `keychain --eval id_dsa --timeout 60`
}    
autoload -U add-zsh-hook
add-zsh-hook preexec check_ssh

Was hier passiert, ist, wann immer ein Befehl eingegeben wird, der check_sshaufgerufen wird, bevor der Befehl ausgeführt wird.

Die erste Zeile der Funktion überprüft den erweiterten Befehl auf die sshVerwendung einer Zsh-Regex. sshmuss auf \bbeiden Seiten Wortgrenzen haben . Wird dies nicht gefunden, kehrt die Funktion zurück.

In der nächsten Zeile wird überprüft, ob die Umgebungsvariable einen SSH-Agentenprozess enthält und ob dieser Prozess noch in der Prozesstabelle vorhanden ist. Anschließend wird überprüft, ob dem Agenten mindestens ein Schlüssel hinzugefügt wurde. Wenn das alles in Ordnung ist, ist der ssh-Agent eingerichtet und wir müssen nichts tun, sodass er zurückkehrt.

Schließlich starten wir den Schlüsselbund mit dem Agenten, der eine Stunde lang am Leben bleiben soll.

Es bleibt immer noch das Problem mit eingebettetem ssh-Zeug, wie gitoder rsyncoder, scpda dies die Funktion nicht auslöst (Sie könnten diese dem regulären Ausdruck hinzufügen).

Kunstvollroboter
quelle
Auch ohne zshkönnte man ein kurzes Skript mit dem gleichen Effekt erstellen und es PATHvor dem eigentlichen sshClient platzieren. Könnte sogar mit rsyncet al arbeiten, wenn sie lesen, PATHanstatt /usr/bin/sshdirekt zu laufen .
Ilkkachu
2

Für zsh habe ich eine Reihe von Hilfsprogrammen und Wrappern geschrieben, um mehr oder weniger das zu tun, was Sie wollen: https://www.vinc17.net/unix/index.de.html#zsh-ssh-utils

Tatsächlich macht dies sogar noch mehr, da das ssh-agentvon allen Anmeldesitzungen gemeinsam genutzt wird (Desktop oder über SSH, und GNU Screen wird auch unterstützt, wenn Sie von dort aus Anmeldeshells starten, z. B. mit shell -zshin der ~/.screenrcDatei), und es wird erst nach dem beendet Die letzte Sitzung wird beendet.

Hinweis: Ich verwende nur eine Passphrase für alle meine Schlüssel. Ich bin mir nicht sicher, wie sich die verschiedenen Passphrasen verhalten. Möglicherweise müssen einige Änderungen vorgenommen werden.

vinc17
quelle
Wow, das ist ziemlich viel Code. Gute Arbeit und vielen Dank für das Teilen. Ich denke, ich brauche etwas Einfacheres - SSH ist ein hübsches Kernwerkzeug für mich.
Artfulrobot