SSH-Agent und Bildschirm

4096
Michael H.

Vor einiger Zeit bei StackOverflow stellte ich diese Frage nach ssh-agent und crontab . Ich habe jetzt eine ähnliche Frage zu ssh-agent und screen auf Linux-Systemen.

Auf meinem Mac startet der ssh-agent also beim Systemstart, sodass er mir immer zur Verfügung steht. Ich denke, es wäre unter meinem Linux (redhat el5 / fedora) der Fall, wenn ich X-Windows verwende. Dies ist jedoch eine Remote-Server-Maschine, und ich logge mich immer über SSH ein.

Ich hätte gerne ssh-keys richtig eingerichtet, so dass ich mein Passwort während eines svn-Updates oder Commits nicht mehrmals eingeben musste. Ich gebe gerne einmal pro Sitzung meine Passphrase ein und entmutige unser Team, keine ssh-Schlüssel ohne Passwort zu verwenden.

Für einen kurzen Moment schien es, als würde "eval` ssh-agent -s "in meinem .bash_profile funktionieren, gepaart mit einem Befehl, den ssh-agent zu beenden, wenn ich mich abgemeldet habe. Wir nutzen jedoch den Bildschirm intensiv, um lang laufende interaktive Programme und Entwicklungsumgebungen zu verwalten. Wenn Sie ssh-agent wie oben beschrieben starten und stoppen, wird es beendet, wenn Sie das Terminal verlassen, und die Untersitzungen des Bildschirms, die sich auf diese ssh-agent-Instanz bezogen, werden abgebrochen.

Wie kann ich also ein Konsolenbenutzer sein, der screen verwendet, der ein Passwort mit seinen ssh-Schlüsseln verwendet, der nicht ständig die Passphrase eingeben muss?

8

6 Antworten auf die Frage

3
Blaisorblade

Mit dem folgenden Setup benötigen Sie keinen Wrapper zum Aufrufen screen. Darüber hinaus wird die Verwendung /tmp(mit den daraus folgenden Sicherheitsrisiken) vermieden .

  1. Stellen Sie sicher, dass Sie ein ~ / tmp-Verzeichnis haben:

    mkdir ~/tmp 
  2. Fügen Sie .screenrcfolgende Zeile hinzu:

    setenv SSH_AUTH_SOCK "$HOME/tmp/ssh-agent-screen" 
    • Dadurch wird sichergestellt, dass im Inneren screen, sshfür die Steckdose sieht immer an der gleichen Stelle, anstatt einer sich ändernden Pfad.
    • Sie müssen die von setenvIhnen verwendete Shell verwenden, da es sich um einen Bildschirm und nicht um einen Shell-Befehl handelt.
  3. Fügen Sie .bash_profilefolgende Zeile hinzu:

    [ -n "$SSH_AUTH_SOCK" ] && [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ] && ln -sf "$SSH_AUTH_SOCK" "$HOME/tmp/ssh-agent-screen" 
    • Dies wird vom festen Ort (wo es sshaussieht) mit dem realen verbunden und muss nach dem Start erscheinen ssh-agent.
    • Die Verwendung [ -n "$SSH_AUTH_SOCK" ]verhindert ordnungsgemäß Fehler, wenn SSH_AUTH_SOCKnicht festgelegt ist.
    • [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ]verhindert, dass Bildschirmsitzungen $ HOME / tmp / ssh-agent-screen mit sich selbst verknüpfen, wenn Bildschirmquellen verwendet werden .bash_profile.
  4. Statt beginnt ssh-agentin .bash_profile, können Sie mit Anschluss betrachten ssh -A(Agenten - Forwarding zu verwenden und den Remote - Rechner benutzen, um Ihre Agenten machen).

Nach diesem Setup können Sie einfach den Standardbildschirmbefehl verwenden. Sie müssen lediglich vorhandene Sitzungen neu erstellen oder SSH_AUTH_SOCK manuell auf den festen Speicherort von Schritt 2 setzen.

Dank an diese Website für die Idee; Ich vermied es zu benutzen /tmp. Diese Antwort ist ähnlich, verwendet jedoch zusätzliche Aliase.

Ich werde das überprüfen, danke! Michael H. vor 10 Jahren 0
2
David Z

Kann man ssh-agent statt aus einem Initscript starten .bash_profile? Zum Beispiel könnte ich sagen

su -c 'ssh-agent -s > ~/.ssh_agent_env' myusername 

im entsprechenden Teil von /etc/conf.d/local, obwohl RHEL / Fedora wahrscheinlich ein anderes System verwendet. Wie Sie in Ihrem Kommentar darauf hingewiesen haben, müssen Terminalsitzungen eine Verbindung zum Agenten herstellen können. Aus diesem Grund erstellt der Befehl die Datei .ssh_agent_envim Basisverzeichnis des Benutzers. Dann kannst du hinzufügen

[ -f ~/.ssh_agent_env ] && source ~/.ssh_agent_env >/dev/null 

in .bash_profile.

Sie könnten auch folgendes hinzufügen .bash_profile

ps -U myusername | grep -q ssh-agent || ssh-agent -s > ~/.ssh_agent_env source ~/.ssh_agent_env >/dev/null 

Das wird ssh-agentnur gestartet, wenn es noch nicht läuft. Dann musst du es nicht töten.

Als etwas andere Alternative zum zweiten Vorschlag können Sie anstelle der Prüfung auf Vorhandensein eines ssh-agentProzesses prüfen, ob die Datei vorhanden ~/.ssh_agent_envist.

[ -f ~/.ssh_agent_env ] || ssh-agent -s > ~/.ssh_agent_env source ~/.ssh_agent_env >/dev/null 

Wenn alles richtig funktioniert, sollte es keinen signifikanten Unterschied zwischen den beiden Wegen geben.

Die initscript-Idee ist interessant - im Grunde nur beim Systemstart für alle Benutzer, die es wollen? Das könnte funktionieren. Wir haben nicht viele Benutzer, die sich dafür interessieren würden. Ob dies wesentlich besser ist oder nicht, als über keine Passphrase zu verfügen, ist eine interessante Frage, da ich vermute, dass Sie sie nur einmal pro Computer-Neustart eingeben müssen. Hmm. Sowohl dieser als auch der zweite Vorschlag sind darauf angewiesen, dass neue Terminalsitzungen eine Verbindung zum ssh-agent herstellen können, wenn dieser bereits ausgeführt wird. Ich bin nicht ganz sicher, dass es so einfach ist, aber ich habe es noch nicht versucht. Danke für die Ideen! Michael H. vor 13 Jahren 0
@khedron: Ja, aber Sie müssten für jeden Benutzer, der den Agenten verwendet, eine Zeile in `/ etc / conf.d / local '(oder Ihr Äquivalent) einfügen, um pro Benutzer einen separaten` ssh-agent'-Prozess zu starten . Wenn Sie, wie Sie sagen, keine große Anzahl von Benutzern hat, wäre das nicht so schlimm. Sie sprechen einen guten Punkt an (was ich vergessen habe zu berücksichtigen), wenn Terminalsitzungen mit dem Agenten verbunden werden. siehe meine Bearbeitung zur Antwort. David Z vor 13 Jahren 0
2
Neil Mayhew

Karo heraus keychain . Es tut all das oben. Sehen Sie sich insbesondere die Optionen --clearund an --timeout.

2
Neil Mayhew

Ein besserer Ansatz ist die Verwendung der ssh-Agentenweiterleitung ( -AOption). Dies ermöglicht es der Person, die ssh verwendet, Schlüssel des ssh-agent zu verwenden, der auf dem Computer läuft, von dem sie kommen, vermutlich die Workstation, auf der sie sich gerade befinden.

Auf diese Weise kann ein Angreifer, der Ihr Konto kompromittiert, auch Konten auf anderen Computern gefährden, auf die der Agent zugreifen kann. Ich versuche daher, die Weiterleitung von ssh-Agenten auf ein Minimum zu beschränken. Paul Price vor 9 Jahren 0
2
Dan Pritts

Um die Weiterleitung des SSH-Agenten zu verfolgen, werden Sie feststellen, dass die weitergeleiteten SSH-Anmeldedaten standardmäßig nicht für Ihre Bildschirmsitzung verfügbar sind, wenn Sie sich abgemeldet haben, sich erneut anmelden und sich erneut mit Ihrer Sitzung verbinden.

Sie können dies jedoch umgehen, indem Sie die Umgebungsvariable SSH_AUTH_SOCK auf einen bekannten Wert setzen und den bekannten Ort auf Ihren aktuellen auth-Socket aktualisieren.

Ich benutze diese Shell-Funktion, um den Bildschirm erneut aufzurufen und die Ssh-Auth-Socke zu korrigieren:

function sr () {  if [ ${+STY} = 1 ] ;then  echo already in screen\! else if [ "$x" != "x" ]; then if [ ! -d /tmp/screenssh ]; then mkdir /tmp/screenssh  fi rm -f /tmp/screenssh/socket ln -s $SSH_AUTH_SOCK /tmp/screenssh/socket echo $REMIP > /tmp/screenssh/remip fi  screen -DR fi } 

und ich habe dies in meinem .screenrc:

setenv SSH_AUTH_SOCK /tmp/screenssh/socket 

Hoffe das hilft.

Die Verwendung von / tmp bedeutet, dass alle anderen Personen auf dem Computer jede Ihrer Dateien blockieren können, wenn sie deren Pfad kennen. Blaisorblade vor 10 Jahren 0
1
erik

Wenn ich Sie richtig verstanden habe, möchten Sie nur eine Bildschirmsitzung, die Sie manchmal trennen und neu anhängen, die Kennworte für den ssh-agent (Ihr privates Schlüsselkennwort) jedoch nicht erneut eingeben müssen.

Ich denke, der einfachste Weg ist, den Bildschirm zu starten, als ssh-agent mit einer Sub-Shell zu starten und dann in dieser Sub-Shell zu bleiben. Ie

screen ssh-agent bash ssh-add # enter your password once  # some commands, some logins and logouts to remote servers via ssh public key  # <ctrl>+<a>, <ctrl>+<d> to detach screen # you can now logout from this computer # login again  # reattach to your screen screen -r # ssh-agent is still running 
Das ist im Wesentlichen das, was ich tue. Ich benutze einen Bildschirm, um eine der "Registerkarten" im Inneren als "ssh-agent" zu kennzeichnen, und benutze das für svn-Arbeit usw. Es gibt eine zusätzliche Falte, bei der ich ssh-agent zwinge, nach einigen Stunden eine erneute Autorisierung durchzuführen. Das ist im Grunde, wo ich bin. Michael H. vor 10 Jahren 0