Проброс gpg-agent
Система на systemd.
Выполняю ssh-add в начале каждого сеанса работы.
Добавил для одной из Host-записей в ~/.ssh/config проброс ssh-agent:
Host server
IdentityFile ~/.ssh/id_ed25519
ForwardAgent yes
RemoteForward /run/user/500/gnupg/S.gpg-agent /run/user/500/gnupg/S.gpg-agent.extra
Затем выполнил следующие команды:
$ systemctl --user enable --now gpg-agent.socket
$ systemctl --user enable --now gpg-agent-extra.socket
Оба сокета "запускаются" успешно:
● gpg-agent.socket - GnuPG cryptographic agent and passphrase cache
Loaded: loaded (/usr/lib/systemd/user/gpg-agent.socket; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-02-25 16:33:35 MSK; 27min ago
Triggers: ● gpg-agent.service
Docs: man:gpg-agent(1)
Listen: /run/user/500/gnupg/S.gpg-agent (Stream)
CGroup: /user.slice/user-500.slice/[email protected]/app.slice/gpg-agent.socket
фев 25 16:33:35 komputer systemd[3591]: Listening on GnuPG cryptographic agent and passphrase cache.
● gpg-agent-extra.socket - GnuPG cryptographic agent and passphrase cache (restricted)
Loaded: loaded (/usr/lib/systemd/user/gpg-agent-extra.socket; enabled; vendor preset: enabled)
Active: active (running) since Fri 2022-02-25 16:33:35 MSK; 27min ago
Triggers: ● gpg-agent.service
Docs: man:gpg-agent(1)
Listen: /run/user/500/gnupg/S.gpg-agent.extra (Stream)
CGroup: /user.slice/user-500.slice/[email protected]/app.slice/gpg-agent-extra.socket
фев 25 16:33:35 komputer systemd[3591]: Listening on GnuPG cryptographic agent and passphrase cache (restricted).
На удалённой системе выполняю (на всякий случай):
$ rm -rf /run/user/500/gnupg
После этого подключаюсь к серверу и смотрю ключи
$ ssh server
[server ~] $ gpg2 -K
/home/serg/.gnupg/pubring.gpg
-------------------------------
sec# ed25519 2022-01-25 [SC]
911BCF398150BA2F25DD8994B240A6DA71FB5DC9
uid [ неизвестно ] Sergey Valenkov <[email protected]>
ssb# cv25519 2022-01-25 [E]
Казалось бы, что всё хорошо.
Однако, если я параллельно открою ещё один эмулятор терминала, подключусь к серверу, то из обоих ssh-сессий я могу получать информацию о ключах. А вот когда я прерываю последнюю открытую сессию, то в первой открытой ssh-сессии я не могу получить доступ к ключами.
После того как отключить от сервера все открытые ssh-сессии, и попробовать подключиться заново, то доступа к ключам вообще нет (даже не выводятся).
И только после удаления на сервере директории с сокетами (/run/user/500/gnupg) с последующим открытием дополнительной ssh-сессии, можно опять получать доступ к ключами.
Мне кажется, что я что-то делаю не так, но не могу понять что. Прошу помочь разобраться.
(почта в ключе, имена хостов, даты и время изменены для сохранения конфиденциальности)
Ответы (1 шт):
Вам необходимо расшарить SSH-сессию в вашем SSH-соединении. Для этого добавьте настройки нужного хоста в ~/.ssh/config следующее:
ControlMaster = auto
ControlPath = ~/.ssh/master-%r@%h:%p
В вашем случае получится примерно следующее:
Host server
IdentityFile ~/.ssh/id_ed25519
ControlMaster = auto
ControlPath = ~/.ssh/master-%r@%h:%p
ForwardAgent yes
RemoteForward /run/user/500/gnupg/S.gpg-agent /run/user/500/gnupg/S.gpg-agent.extra
Подробнее об этом можно почитать в ssh_config(5).
Также на стороне сервера необходимо в /etc/openssh/sshd_config указать следующее:
StreamLocalBindUnlink yes
Это необходимо для того, чтобы удалить "протухшие" прокинутые сокеты из предыдущих, уже закрытых, SSH-сессий.
Если доступа к редактированию настроек sshd нету, тогда нужно будет удалять сокеты скриптом (или вручную). Для этого, к примеру, можно (на удалённой машине) в ~/.bash_logout написать следующее:
USER_SESSIONS_COUNT=$(users | sed 's/\ /\n/g' | grep $USER | wc -l)
if [ $USER_SESSIONS_COUNT -eq 1 ];
then
rm -rf /run/user/$UID/gnupg/*
fi