Wie kann ich dem ssh-agent mitteilen, dass er sich beenden soll?
Mathias Bauer
mbauer at mailbox.org
So Dez 14 19:55:16 CET 2014
* Helmut Waitzmann schrieb am So, 14. Dez 2014, um 02:48 (+0100):
> Mathias Bauer <mbauer at mailbox.org> writes:
>
> > * Helmut Waitzmann schrieb am Fr, 12. Dez 2014, um 20:18 (+0100):
> >
> > hier läuft
> > $ gpg-agent --version
> > gpg-agent (GnuPG) 2.0.19
>
> Bei mir ist es
> $ gpg-agent --version
> gpg-agent (GnuPG) 2.0.14
>
> > Ein TERM beendet den Agenten; bei drei TERMs oder einem INT
> > geschieht das sofort (ohne Rücksicht auf Verluste). Die
> > Prozessnummer ist Teil von GPG_AGENT_INFO:
> > /path/to/socket/S.gpg-agent:12345:1
>
> [...] und auch nicht, was geschieht, wenn im Socketnamen ein
> Doppelpunkt enthalten ist.
Was meinst Du damit? Den Namen des Sockets, S.gpg-agent, kannst
Du nicht vorgeben und er enthält auch nie einen Doppelpunkt.
> Mein ssh-agent weigert sich, das Socket anzulegen, wenn ich ihm
> das Option â--use-standard-socketâ mitgebe und GNUPGHOME einen
> â:â enthält. Soweit also keine Gefahr für mehr als 2 â:â in
> GPG_AGENT_INFO. Nur das Handbuch schweigt halt dazu.
Ich ordne mal ein wenig:
- Du verwendest einen separaten SSH-Agenten und *nicht* gpg-agent
mit der Option --enable-ssh-support.
- Was der SSH-Agent macht oder nicht, lassen wir jetzt erstmal
auÃen vor.
Wo kommen bei Dir denn Doppelpunkte in Pfaden oder Namen vor?
Welches OS/Distribution verwendest Du denn? Startet man den
gpg-agent mit der Option --use-standard-socket, erhält man
GPG_AGENT_INFO=/home/you/.gnupg/S.gpg-agent:12345:1
Das kann man *nicht* machen, wenn das HOME-Verzeichnis per NFS
importiert wird, was auch so dokumentiert ist:
This option may not be used if the home directory is mounted
on a remote file system...
> > Das ganze Vorgehen ist abhängig davon, wie Deine Sessions
> > gestartet werden, ob Konsole und/oder X, ob mehrere parallel,
> > etc.
>
> Einen gpg-agent möchte ich bei jedem Einloggen zur Verfügung
> haben, egal, ob auf der Konsole oder mit X11.
Das funktioniert und ist auch kein Problem. Starte einfach bei
jeder Anmeldung einen neuen Agenten. Schwierig wird es in den
beiden folgenden Situationen:
- Es soll ein und derselbe Agenten benutzt werden.
- Für mehrere, auch parallel benutzte X- oder Konsole-Sessions
soll der Agent der *ersten* gestarteten Session für alle
anderen ebenfalls verwendet werden.
Da muss man ganz genau analysieren an welcher Stelle, X und
Konsole, der Agent jeweils gestartet wird, wo die
Environment-Variablen wirken, etc. und das Ganze dann
entsprechend modifizieren. Du bist Dir im Klaren darüber, dass
das u. U. tiefgreifende Ãnderungen im (Linux-)System erfordert?
Wenn ja, kannst Du beide Probleme mit der Option --write-env-file
beheben. Das wird sehr schnell sehr umfangreich werden...
Mein Rat: Beschränke Dich auf die Skripte des jeweiligen
Benutzers und lass die Finger von /etc/X11/Xsession.d/* - wenn Du
Linux verwendest. Das geht und ist umfangreich genug. Ich habe
eine solche Lösung hier am Laufen.
> Ich hätte nichts dagegen, wenn es machbar wäre, auf jedem
> Rechner, der das gemeinsame NFSâHOMEâVerzeichnis nutzt, nur
> einen gpg-agent für alle Sessions zu nutzen.
Auf jedem Rechner jeweils pro Benutzer für alle Sessions jeweils
nur einen Agenten zu verwenden funktioniert. NFS hat damit
nichts zu tun.
> Das hätte den Vorteil, dass ich diesen einen gpg-agent nicht
> beenden muss: Er soll ja sowieso für alle weitere Sessions
> (egal, ob augenblickliche oder zukünftige) verwendet werden.
> Das bedeutet aber, dass ich beim Einloggen nicht einfach einen
> gpg-agent starten kann, denn es könnte ja bereits einer laufen.
Ja.
> Deswegen kann dann der Fall eintreten (wenn doch noch kein
> gpg-agent läuft), dass gpg2 selber einen startet. Weil ich
> dabei aber keine Möglichkeit habe, "${GPG_AGENT_INFO}" an
> andere bereits laufende Prozesse (etwa ein Mailerprogramm)
> weiterzugeben,
Doch, die hast Du, wenn Du früh genug in den Sessions eingreifst.
> müsste das Socket des von gpg2 gestarteten gpg-agents dann
> immer an derselben Stelle im Dateisystem zu finden sein,
Der Socket befindet sich immer auf dem jeweiligen Rechner in
/tmp, nicht irgendwo per NFS. (Ausnahme: --use-standard-socket)
Du hast Recht, das Verzeichnis des Sockets ist nicht fix. Hier
z. B. gerade
/tmp/gpg-y5srdG/S.gpg-agent:12345:1
> ich müsste also in gpg-agents Konfigurationsdatei
> âuse-standard-socketâ vermerken. Das aber ist laut
> Dokumentation nicht erlaubt, wenn
> "${GNUPGHOME-"${HOME}/.gnupg"}" vom NFS kommt.
Genau, und das macht auch Sinn so. Sockets bleiben lokal.
> Also bleibt wohl nur die Vorgehensweise âfür jedes
> LoginâSession einen eigenen gpg-agentâ: Weil dabei bei jedem
> Login in jedem Fall ein gpg-agent gestartet wird, kann die von
> ihm herausgegebene Umgebungsvariable GPG_AGENT_INFO einfach an
> alle weiteren Prozesse des Sessions vererbt werden und es
> entsteht auch nicht das Problem, dass gpg2 selber einen
> gpg-agent startet.
Entweder so (Du hast dann mehrere Agenten) oder Du prüfst beim
Start jeder Session, ob bereits ein Socket läuft und startetst
ggf. einen neuen mit der Option --write-env-file.
Wie schon oben angedeutet, ist diese Prüfung des springende
Punkt. Dafür musst man an mehreren Stellen des Startprozeders
(Shell-Skripte!) eingreifen. Das ist sehr umfangreich und etwas
kompliziert, funktioniert jedoch.
> Ich habe durch Ausprobieren festgestellt: Die mit dem Option
> â--write-env-fileâ vom Agent erzeugte UmgebungsvariablenâDatei
> wird weder geleert noch entfernt, wenn sich der Agent nach
> Empfang eines TERMâSignals beendet. Das Socket aber wird
> entfernt.
>
> Kann ich daran, ob das in "${GPG_AGENT_INFO%:*:*}" genannte
> Socket vorhanden ist, sehen, ob ein gpg-agent läuft?
Ja, mit zusätzlichen Prüfungen wie meiner letzten E-Mail erwähnt.
Die genügen für das XXL-Szenario (mehrere Sessions, parallel,
etc.) natürlich nicht.
> Dann könnte ich das als weiteres notwendiges Kriterium nutzen,
> ehe ich beim Ausloggen ein TERMâSignal in Richtung gpg-agent
> schicke. Aber auch hier gäbe es dasselbe RaceâCondition wie
> oben.
Ich beende hier weder unter X noch auf der Konsole den Agenten
automatisch. Wenn man alle relevanten Möglichkeiten
ausfallsicher abdecken möchte, ist das Starten dieses einen
Agenten ausreichend umfangreich...
> Wird die vom Agent mit Option â--write-env-fileâ erzeugte
> UmgebungsvariablenâDatei von gpg2, gpg-connect-agent oder
> gpg-agent gelesen oder ist sie nur eine Alternative zu
>
> $ eval "$(gpg-agent --daemon)"
Diese Datei, deren Ort Du vorgibst, wird von niemandem gefunden
und daher auch nicht automatisch gelesen. Du kannst sie selbst
z. B. in Startskripten des Benutzers für X- und Konsole-Sessions
verwenden.
Mathias
--
CAcert Assurer - See http://www.CAcert.org for details or ask me
GnuPG/OpenPGP: B100 5DC4 9686 BE64 87E9 0E22 44C3 983F A762 9DE8
-------------- n�chster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname : nicht verfügbar
Dateityp : application/pgp-signature
Dateigröße : 760 bytes
Beschreibung: nicht verfügbar
URL : </pipermail/attachments/20141214/7ae454fb/attachment.sig>
Mehr Informationen über die Mailingliste Gnupg-de