SSH-Agent und Bildschirm

8

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

Auf meinem Mac wird ssh-agent beim Systemstart gestartet, sodass es mir immer zur Verfügung steht. Ich denke, es wäre unter meinem Linux (redhat el5 / fedora) wahr, wenn ich X-Windows verwenden würde. Dies ist jedoch ein Remote-Server-Computer, und ich melde mich immer über ssh an.

Ich würde gerne SSH-Schlüssel richtig eingerichtet haben, damit ich mein Passwort während eines SVN-Updates oder Commits nicht mehrmals eingeben musste. Ich gebe meine Passphrase gerne einmal pro Sitzung ein und rate unserem Team davon ab, kennwortlose SSH-Schlüssel zu haben.

Für einen kurzen Moment schien es, als würde es funktionieren, "eval` ssh-agent -s` "in meinem .bash_profile auszuführen, gepaart mit einem Befehl, den ssh-agent zu töten, wenn ich mich abmeldete. Wir verwenden jedoch häufig den Bildschirm , um lang laufende interaktive Programme und Entwicklungsumgebungen zu verwalten. Wenn Sie ssh-agent wie oben beschrieben starten und stoppen, wird es beim Verlassen des Terminals beendet, und die Untersitzungen des Bildschirms, die sich früher auf diese ssh-agent-Instanz bezogen, werden abgebrochen.

Also ... wie kann ich ein Konsolenbenutzer sein, der den Bildschirm verwendet, der ein Passwort mit seinen SSH-Schlüsseln verwendet und der die Passphrase nicht ständig eingeben muss?

Michael H.
quelle

Antworten:

4

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

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

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

    setenv SSH_AUTH_SOCK "$HOME/tmp/ssh-agent-screen"
    
    • Dadurch wird sichergestellt , dass im Inneren screen, sshsieht für die Steckdose immer an der gleichen Stelle, anstatt einer sich verändernden Weg.
    • 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_profileder folgenden 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) zum realen Ort verlinkt und muss nach dem Start erscheinen ssh-agent.
    • Durch [ -n "$SSH_AUTH_SOCK" ]die Verwendung werden Fehler ordnungsgemäß verhindert, wenn sie SSH_AUTH_SOCKnicht eingestellt sind.
    • [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ]verhindert Bildschirmsitzungen, die $ HOME / tmp / ssh-agent-screen mit sich selbst verknüpfen, wenn Bildschirmquellen vorhanden sind .bash_profile.
  4. Statt Start ssh-agentin .bash_profile, können Sie erwägen , mit Anschluss ssh -A(auf eingesetztes Mittel Weiterleitung und den Remote - Maschine Gebrauch Ihren Agenten machen).

Nach diesem Setup können Sie einfach den Standard-Bildschirmbefehl verwenden. Sie müssen nur vorhandene Sitzungen neu erstellen oder SSH_AUTH_SOCK in ihnen manuell auf den festen Speicherort von Schritt 2 setzen.

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

Blaisorblade
quelle
2

Können Sie ssh-agent stattdessen von einem Initscript aus 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 angegeben haben, müssen Terminalsitzungen eine Verbindung zum Agenten herstellen können. Aus diesem Grund erstellt dieser Befehl die Datei .ssh_agent_envim Basisverzeichnis des Benutzers. Dann können Sie hinzufügen

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

in .bash_profile.

Sie können auch Folgendes eingeben .bash_profile

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

Dies wird ssh-agentnur gestartet , wenn es noch nicht ausgeführt wird. Dann musst du es nicht töten.

Als etwas andere Alternative zum zweiten Vorschlag, statt für die Existenz eines der Überprüfung ssh-agentProzesses, Sie für die Existenz der Datei überprüfen konnten ~/.ssh_agent_env,

[ -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 Möglichkeiten geben.

David Z.
quelle
Die Initscript-Idee ist interessant - starten Sie sie einfach beim Systemstart für alle Benutzer, die sie möchten. Das könnte funktionieren. Wir haben nicht viele Benutzer, die sich darum kümmern würden. Ob dies wesentlich besser ist, als überhaupt keine Passphrase zu haben, ist eine interessante Frage, da ich vermute, dass Sie sie nur einmal pro Neustart des Computers eingeben müssen. Hmm. Sowohl das als auch der zweite Vorschlag setzen voraus, dass neue Terminalsitzungen eine Verbindung zum ssh-agent herstellen können, wenn dieser bereits ausgeführt wird. Ich bin mir nicht ganz sicher, ob es so einfach ist, aber ich habe es noch nicht versucht. Danke für die Ideen!
Michael H.
@khedron: Ja, aber Sie müssten /etc/conf.d/localfür jeden Benutzer, der den Agenten verwendet, eine Zeile (oder eine entsprechende Zeile) eingeben , um einen separaten ssh-agentProzess pro Benutzer zu starten . Wenn Sie, wie Sie sagen, nicht viele Benutzer haben, wäre das nicht schlecht. Sie sprechen einen guten Punkt (den ich vergessen habe zu berücksichtigen) über Terminalsitzungen an, die an den Agenten angehängt sind. siehe meine Bearbeitung zur Antwort.
David Z
2

Überprüfen Sie den Schlüsselbund . Es macht all das oben Genannte. Schauen Sie sich vor allem die --clearund --timeoutOptionen an.

Neil Mayhew
quelle
2

Ein besserer Ansatz ist die Verwendung der SSH-Agentenweiterleitung ( -AOption). Auf diese Weise kann die Person, die ssh verwendet, Schlüssel vom ssh-Agenten verwenden, der auf dem Computer ausgeführt wird, von dem sie kommt, vermutlich von der Workstation, an der sie tatsächlich sitzt.

Neil Mayhew
quelle
Auf diese Weise kann ein Angreifer, der Ihr Konto gefährdet, auch Konten auf anderen Computern gefährden, auf die dieser Agent zugreifen kann. Ich versuche daher, die Weiterleitung von SSH-Agenten auf ein Minimum zu beschränken.
Paul Price
2

Um die Weiterleitung des SSH-Agenten zu verfolgen, werden Sie feststellen, dass die weitergeleiteten SSH-Anmeldeinformationen standardmäßig nicht für Ihre Bildschirmsitzung verfügbar sind, sobald Sie sich abmelden, wieder anmelden und erneut eine Verbindung zu Ihrer Sitzung herstellen.

Sie können dies jedoch umgehen, indem Sie die Umgebungsvariable SSH_AUTH_SOCK auf einen bekannten Wert setzen und diesen bekannten Speicherort auf Ihren aktuellen Authentifizierungssocket aktualisieren lassen.

Ich benutze diese Shell-Funktion, um den Bildschirm erneut aufzurufen und die SSH-Authentifizierungssocke zu reparieren:

function sr () { 
    if [ ${+STY} = 1 ] ;then 
            echo already in screen\!
    else
            if [ "${SSH_AUTH_SOCK}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.

Dan Pritts
quelle
Die Verwendung von / tmp bedeutet, dass jeder andere auf dem Computer Ihre Dateien blockieren kann, wenn er deren Pfad kennt.
Blaisorblade
1

Wenn ich Sie richtig verstanden habe, möchten Sie nur eine Bildschirmsitzung, die Sie manchmal trennen und erneut anbringen, aber nie wieder die Kennwörter für den ssh-agent (Ihr Kennwort für den privaten Schlüssel) erneut eingeben möchten.

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. Dh

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
erik
quelle
Das ist im Wesentlichen was ich tue. Ich benutze den Bildschirm, um eine der "Registerkarten" im Inneren als ssh-agent-fähig zu kennzeichnen, und verwende diese für svn-Arbeiten usw. Es gibt eine zusätzliche Falte, bei der ich ssh-agent zwinge, nach einigen Stunden eine erneute Autorisierung durchzuführen, aber yup, Hier bin ich im Grunde.
Michael H.