use-ssh-agent in /etc/X11/Xsession.options auskommentieren, das started die X-Session mit dem ssh-agent damit er dort verfügbar ist - wollen wir hier aber nicht, wir wollen den tollen gcr-ssh-agent
gnome-keyring-daemon systemd USER-unit ändern (systemctl --user edit gnome-keyring-daemon für Vorlage), dort ist nur wichtig bei components --components="pkcs11,secrets,ssh" mit drin zu haben.
wir wollen also als override:
[Service]
ExecStart=/usr/bin/gnome-keyring-daemon --foreground --components="pkcs11,secrets,ssh" --control-directory=%t/keyring
Sollte dann so aussehen:
user@linux:~/ systemctl --user cat gnome-keyring-daemon
# /usr/lib/systemd/user/gnome-keyring-daemon.service
[Unit]
Description=GNOME Keyring daemon
Requires=gnome-keyring-daemon.socket
[Service]
Type=simple
StandardError=journal
ExecStart=/usr/bin/gnome-keyring-daemon --foreground --components="pkcs11,secrets" --control-directory=%t/keyring
Restart=on-failure
[Install]
Also=gnome-keyring-daemon.socket
WantedBy=graphical-session-pre.target
# ---> /homes/user/.config/systemd/user/gnome-keyring-daemon.service.d/override.conf
[Service]
# needed to clear out all other ExecStart values
ExecStart=
ExecStart=/usr/bin/gnome-keyring-daemon --foreground --components="pkcs11,secrets,ssh" --control-directory=%t/keyring
Für Systemd-user Services wie z.B. mounten von sshfs braucht man die Environment-Variablen im environment.d:
~/.config/environment.d/99-gcr-ssh-agent.conf
export SSH_AUTH_SOCK=$XDG_RUNTIME_DIR/gcr/ssh
Und für den User selbst ist wichtig Sie an DBUS weiterzugeben und im Terminal verfügbar zu haben:
~/.bashrc
# Braucht man für gnome-keyring unter Wayland
dbus-update-activation-environment --systemd DISPLAY
# Braucht man damit man im Terminal, etc. den korrekten Socket hat
export SSH_AUTH_SOCK=$XDG_RUNTIME_DIR/gcr/ssh
Jetzt hat man aber das Problem, dass man mit ssh -A user@andererserver den weitergeleiteten Agenten verliert wenn man sich mit demselben Nutzer anmeldet (also das gleiche Homeverzeichnis hat) weil dann dieselbe .bashrc nochmal läuft.
Angenommen ich entsperre den SSH-Key auf meiner workstation und verbinde mich dann mit meinem Nutzer zu einem Server der denselben Nutzer über Kerberos/LDAP nutzt --> der lädt wieder SSH_AUTH_SOCK=$XDG_RUNTIME_DIR/gcr/ssh und "vergisst" meinen weitergeleiteten agenten.
Wir ändern daher in .bashrc:
# nur überschreiben wenn die Sitzung keine ssh-verbindung ist
if [ -z "$SSH_CONNECTION" ]; then
export SSH_AUTH_SOCK=$XDG_RUNTIME_DIR/gcr/ssh
dbus-update-activation-environment --systemd DISPLAY
fi
# SSH_AUTH_SOCK ist jetzt
# /run/user/1234/gcr/ssh für lokal und
# /tmp/ssh-aBcDeFgHiJ/agent.1234567 für eine ssh-sitzung mit weitergeleitetem Agenten
# overwrite systemds user environment with whatever is now SSH_AUTH_SOCK
systemctl --user import-environment SSH_AUTH_SOCK
jetzt kann man in der SSH-Sitzung den Agenten nutzen und auch Systemd kennt ihn für mounts, etc:
user@andererserver:~# systemctl --user show-environment | grep SSH_AUTH_SOCK
SSH_AUTH_SOCK=/tmp/ssh-aBcDeFgHiJ/agent.1234567
Wenn systemctl --user show-environment noch den alten run/openssh_agent anzeigt kann man das versuchen in ~/.config/environment.d zu setzen, es ist aber einfacher den ssh-agent Socket und Service für diesen Nutzer abzuschalten.
Den Socket und Service für diesen User einfach "masken" (das schickt ihn auf /dev/null):
user@linux:~/ systemctl --user mask ssh-agent && systemctl --user mask ssh-agent.socket
Alternativ:
systemctl --user disable ssh-agent.socket
systemctl --user stop ssh-agent.socket
Das meckert aber bei mir, daher Mask.