Was ist der Zweck von ssh-agent?

70

Ich habe die offizielle Definition gelesen:

ssh-agent ist ein Programm zur Speicherung privater Schlüssel für die Authentifizierung mit öffentlichen Schlüsseln (RSA, DSA, ECDSA). Die Idee ist, dass ssh-agent zu Beginn einer X-Sitzung oder einer Anmeldesitzung gestartet wird und alle anderen Fenster oder Programme als Clients für das Programm ssh-agent gestartet werden. Durch die Verwendung von Umgebungsvariablen kann der Agent gefunden und automatisch zur Authentifizierung verwendet werden, wenn Sie sich mit ssh (1) bei anderen Computern anmelden.

"..ein Programm zum Speichern privater Schlüssel .." - IMHO - SSH-Schlüssel werden vom Benutzer mit dem Befehl ssh-keygen generiert und einfach und direkt in ~ / .ssh gespeichert. Warum brauche ich einen Dämon, um diese Schlüssel zu speichern? Wie genau hält es sie überhaupt - sind sie nicht nur in .ssh gespeichert?

"werden als clients zum ssh-agent programm gestartet" - verstehe ich nicht. Wo würde man das brauchen? Normalerweise benutze ich ssh wie folgt:

 ssh -i ~/.ssh/private_key_name username@hostname

Was genau bedeutet Handbuch unter "Kunden" - welche Kunden? Führen Sie nicht einfach den Befehl ssh vom Terminal aus, um eine Verbindung herzustellen. Welche anderen Clients sind vorhanden, und warum können sie nicht einfach einen Pfad zu dieser privaten ssh-Datei verwenden, genau wie der Befehl ssh?

agent_smith
quelle

Antworten:

75

Der SSH-Agent übernimmt das Signieren der Authentifizierungsdaten für Sie. Bei der Authentifizierung bei einem Server müssen Sie einige Daten mit Ihrem privaten Schlüssel signieren, um zu beweisen, dass Sie es sind.

Aus Sicherheitsgründen schützen die meisten Benutzer ihre privaten Schlüssel mit einer Passphrase. Bei jedem Authentifizierungsversuch müssen Sie diese Passphrase eingeben. Dies kann unerwünscht sein, so dass der ssh-agent den Schlüssel für Sie zwischenspeichert und Sie das Kennwort nur einmal eingeben müssen, wenn der agent es entschlüsseln möchte (und oft nicht einmal, da der ssh-agent in pam integriert werden kann). was viele Distributionen tun).

Der SSH-Agent übergibt diese Schlüssel niemals an Client-Programme, sondern stellt lediglich einen Socket bereit, über den Clients Daten senden können und über den er mit signierten Daten antwortet. Ein Nebeneffekt davon ist, dass Sie Ihren privaten Schlüssel auch mit Programmen verwenden können, denen Sie nicht vollständig vertrauen.

Ein weiterer Vorteil des SSH-Agenten besteht darin, dass er über SSH weitergeleitet werden kann. Wenn Sie also zu Host A senden, während Sie Ihren Agenten weiterleiten, können Sie von A zu einem anderen Host B senden, ohne dass Ihr Schlüssel auf Host A vorhanden ist (nicht einmal in verschlüsselter Form).

Dennis Kaarsemaker
quelle
10
Ich halte dies für die vollständigste Antwort, aber es fehlt noch ein Punkt. Die Verwendung eines Schlüsselagenten ermöglicht auch die einfache Verwendung mehrerer Schlüssel. Anstatt den Pfad zum Schlüssel angeben zu müssen, wird ssh bei Verwendung eines Schlüsselagenten jeden Schlüssel darin ausprobieren.
Patrick
3
@Patrick kann auch ein Nachteil sein - versuchen Sie es mit zu vielen ungültigen Schlüsseln auf einem Server. Die Verbindung wird dann getrennt, bevor Sie den gültigen Schlüssel erhalten. Natürlich ist es das , was ~/.ssh/config‚s IdentityFileOption für gut ist, mit oder ohne Agent
Tobias Kienzler
@Patrick das scheint auch ohne einen Agenten möglich
Andrey Fedorov
@AndreyFedorov Ja, Sie können mehrere Schlüssel ohne einen Agenten haben, aber Sie können auch in Ihrem ~/.ssh/configSchlüssel angeben, welcher für welchen Remote-Host verwendet werden soll, damit er genau weiß, welchen er benötigt.
Patrick
3
kann man also davon ausgehen, dass dies ssh-agentnicht notwendig ist, wenn ein privater Schlüssel nicht durch eine Passphrase geschützt ist?
Karamol
16

Dies hat den Vorteil, ssh-agentdass Sie Ihre Passphrase nur einmal eingeben müssen. Wenn Ihr privater RSA-Schlüssel nicht mit einer Passphrase verschlüsselt ist, ist ssh-agent nicht erforderlich. Der sshBefehl wäre ein Beispiel für einen Client.

Jordanien
quelle
7

Wenn Sie routinemäßig sshauf verschiedene Computer zugreifen, von denen jeder einen eigenen Schlüssel und eine eigene Passphrase hat, ssh-agentkönnen Sie beim Ausführen die Passphrase für jeden Schlüssel einmal 1 zu Beginn Ihrer Sitzung eingeben und sich dann bei jedem Computer so oft wie möglich authentifizieren wie Sie möchten, ohne Ihre Passphrase erneut eingeben zu müssen.

Ein weiterer Vorteil ist, dass mander Agent laut Seite niemals einen privaten Schlüssel über seinen Anforderungskanal sendet. Wenn Sie also zwischen verschiedenen Boxen wechseln, sind Ihre privaten Schlüssel geschützt.

1 Sie können die lifeZeit einstellen, zu der die Schlüssel im Agenten gehalten werden.

jasonwryan
quelle
6

Wikipedia-Artikel hat wahrscheinlich die beste Beschreibung:

Die Überprüfung des Servers basiert auf der Challenge-Response-Authentifizierung. ssh verbindet sich mit dem Server mit einem Benutzernamen und der Anforderung eines Schlüssels. Der ssh-Daemon erhält die Anforderung und sendet eine Abfrage basierend auf dem in der Authentifizierungsdatei gespeicherten öffentlichen Schlüssel zurück. ssh verwendet den privaten Schlüssel, um eine Schlüsselantwort zu erstellen, und sendet sie an den wartenden sshd am anderen Ende der Verbindung. Der private Schlüssel selbst wird nicht gesendet. Der ssh-Daemon validiert die Schlüsselantwort und gewährt, falls gültig, Zugriff auf das System. ssh-agent vereinfacht dies, indem ein Socket erstellt wird, der auf SSH-Verbindungen wartet. Der Benutzer startet einfach ssh-agent und teilt ihm mit, wie er seine Schlüssel findet (wenn sie sich nicht am Standardspeicherort befinden). Er gibt die Passphrase für jeden zu verwendenden Schlüssel einmalig ein.

Nochmals wörtlich aus dem Wikipedia-Artikel:

... ssh-agent erstellt einen Socket und überprüft dann die Verbindungen von ssh. Jeder, der sich mit diesem Socket verbinden kann, hat auch Zugriff auf den ssh-agent. Die Berechtigungen werden wie in einem normalen Linux- oder Unix-System festgelegt. Wenn der Agent gestartet wird, erstellt er ein neues Verzeichnis in / tmp mit eingeschränkten Berechtigungen. Der Socket befindet sich im Ordner.

Es wird normalerweise entweder in die rc-Dateien eines Systems oder eines Benutzers wie $HOME/.bashrcoder $HOME/.profile(für Bash-Shells) eingefügt, damit die ssh-agentfestgelegten Umgebungsvariablen vollständig in Ihre Umgebung integriert werden.

Auf meinem Fedora 14-System wird es als Teil des X11-Subsystems ziemlich früh gestartet. In dieser Datei /etc/X11/xinit/xinitrc-common:

# Prefix launch of session with ssh-agent if available and not already running.
SSH_AGENT=
if [ -z "$SSH_AGENT_PID" ] && [ -x /usr/bin/ssh-agent ]; then
    if [ "x$TMPDIR" != "x" ]; then
        SSH_AGENT="/usr/bin/ssh-agent /bin/env TMPDIR=$TMPDIR"
    else
        SSH_AGENT="/usr/bin/ssh-agent"
  fi
fi

Die Variable $SSH_AGENTwird dann in anderen X11-Startskripten verwendet, z. B . /etc/X11/xinit/Xclients:

exec -l $SHELL -c "$SSH_AGENT $XCLIENTS_D/Xclients.$1.sh"

Durch das Einfügen in diese Datei werden die folgenden Umgebungsvariablen als Teil einer übergeordneten Shell festgelegt. Daher sollten alle verzweigten Kinder diese auch haben, zum Beispiel:

SSH_AUTH_SOCK=/tmp/ssh-PspRF18958/agent.18958; export SSH_AUTH_SOCK;
SSH_AGENT_PID=18959; export SSH_AGENT_PID;

Das ist etwas komplexer, aber auf den Punkt gebracht, ist dies im Grunde das, was los ist ssh-agent.

Beispielsweise wird in GNOME ssh-agenttatsächlich pro Benutzer als Startanwendung gestartet:

                     ss von Startup-Apps

TL; DR

Unterm Strich ssh-agentmüssen Sie Ihre SSH-Schlüssel nur einmal mit ihrer Passphrase entsperren (vorausgesetzt, sie verfügen über eine Passphrase), und von da an sind sie in ihrer entschlüsselten Form im Arbeitsspeicher (RAM) verfügbar.

slm
quelle
1

„als Clients mit dem ssh-agent - Programm gestartet“ bezieht sich auf die Idee , dass ssh-agent bei (lokaler) Login - Sitzung Initialisierung gestartet wird , so dass alle Programme , die Umgebungsvariablen erhalten $SSH_AGENT_PIDund $SSH_AUTH_SOCKdie für den Anschluss des Agenten erforderlich sind.

Ein weiterer Vorteil, den Umgang mit privaten Schlüsseln aus ssh herauszunehmen, ist, dass ssh-agent durch gpg-agent ersetzt werden kann. Daher können Sie OpenPGP-Schlüssel (mit Authentifizierungsfunktion) für SSH verwenden. Das ist eine schöne Lösung für OpenPGP-Schlüssel auf einer Smartcard.

Hauke ​​Laging
quelle