Вопрос или проблема
Я пытаюсь использовать пользовательскую службу ssh-agent systemd из пакета openssh на Ubuntu 24.04.
Начиная с Ubuntu 16.10 и далее, пакет openssh-client
содержит файл службы пользователя ssh-agent.service
:
$ lsb_release -sr
No LSB modules are available.
24.04
$ dpkg -S user/ssh-agent.service
openssh-client: /usr/lib/systemd/user/ssh-agent.service
$ systemctl --user cat ssh-agent.service
# /usr/lib/systemd/user/ssh-agent.service
[Unit]
Description=OpenSSH Agent
Documentation=man:ssh-agent(1)
Before=graphical-session-pre.target
ConditionPathExists=/etc/X11/Xsession.options
Wants=dbus.socket
After=dbus.socket
[Service]
# Если вам нужно передать дополнительные аргументы ssh-agent, вы можете использовать "systemctl
# --user edit ssh-agent.service" для добавления drop-in unit с содержимым:
# [Service]
# ExecStart=
# ExecStart=/usr/lib/openssh/agent-launch start -- -t 1200
ExecStart=/usr/lib/openssh/agent-launch start
ExecStopPost=/usr/lib/openssh/agent-launch stop
$
Я пытался его запустить, но он не активен:
$ systemctl --user start ssh-agent.service
$ systemctl --user is-active ssh-agent.service
inactive
$
После некоторых исследований, я установил переменную SSH_AUTH_SOCK
:
$ ssh myUbuntu-24-04-Server
$ export SSH_AUTH_SOCK=$XDG_RUNTIME_DIR/openssh_agent
$ systemctl --user stop ssh-agent.service
$ systemctl --user start ssh-agent.service
$ ls $SSH_AUTH_SOCK
ls: невозможно получить доступ к '/run/user/1000/openssh_agent': Нет такого файла или каталога
$ systemctl --user is-active ssh-agent.service
inactive
$ systemctl --user status ssh-agent.service
○ ssh-agent.service - OpenSSH Agent
Loaded: загружен (/usr/lib/systemd/user/ssh-agent.service; static)
Active: неактивен (мертв)
Docs: man:ssh-agent(1)
Feb 21 17:41:56 myUbuntu-24-04-Server systemd[118809]: Запущен ssh-agent.service - OpenSSH Agent.
Feb 21 18:08:15 myUbuntu-24-04-Server systemd[119096]: Запущен ssh-agent.service - OpenSSH Agent.
Feb 21 18:10:31 myUbuntu-24-04-Server systemd[119096]: Запущен ssh-agent.service - OpenSSH Agent.
Feb 21 18:11:24 myUbuntu-24-04-Server systemd[119096]: Запущен ssh-agent.service - OpenSSH Agent.
Feb 21 18:18:49 myUbuntu-24-04-Server systemd[119442]: Запущен ssh-agent.service - OpenSSH Agent.
$
Однако эта служба работает нормально на предыдущей версии Ubuntu LTS (22.04):
$ ssh myUbuntu-22-04-Server
$ lsb_release -sr
22.04
$ export SSH_AUTH_SOCK=$XDG_RUNTIME_DIR/openssh_agent
$ systemctl --user start ssh-agent.service
$ systemctl --user status ssh-agent.service
● ssh-agent.service - OpenSSH Agent
Loaded: загружен (/usr/lib/systemd/user/ssh-agent.service; static)
Active: активен (работает) с Пт 2025-02-21 18:40:55 CET; 4 мин 17 с назад
Docs: man:ssh-agent(1)
Main PID: 23068 (ssh-agent)
Tasks: 1 (ограничение: 19005)
Memory: 1.1M
CPU: 6мс
CGroup: /user.slice/user-1000.slice/[email protected]/app.slice/ssh-agent.service
└─23068 ssh-agent -D -a /run/user/1000/openssh_agent
Feb 21 18:40:55 myUbuntu-22-04-Server systemd[22133]: Запущен OpenSSH Agent.
Feb 21 18:40:55 myUbuntu-22-04-Server agent-launch[23070]: dbus-update-activation-environment: установка SSH_AUTH_SOCK=/run/user/1000/openssh_agent
Feb 21 18:40:55 myUbuntu-22-04-Server agent-launch[23070]: dbus-update-activation-environment: установка SSH_AGENT_LAUNCHER=openssh
Feb 21 18:40:55 myUbuntu-22-04-Server agent-launch[23068]: SSH_AUTH_SOCK=/run/user/1000/openssh_agent; export SSH_AUTH_SOCK;
Feb 21 18:40:55 myUbuntu-22-04-Server agent-launch[23068]: echo Agent pid 23068;
$ ssh-add -l
Агент не имеет идентификаторов.
$
Можешь помочь мне?
Я подозреваю, что причина, по которой служба не “Активна”, заключается в том, что вы не определили use-ssh-agent
в /etc/X11/Xsession.options
и определили $SSH_AUTH_SOCK
до запуска ssh-agent.service
. Цитируя из Xsession.options(5) manpage:
use-ssh-agent Если программа ssh-agent(1) доступна и никакой процесс агента не запущен, X сессия будет запущена exec'ing ssh-agent с командой запуска, вместо команды запуска напрямую.
Посмотрев на файл юнита ssh-agent.service
, когда юнит запускается, вызывается скрипт /usr/lib/openssh/agent-launch
.
ExecStart=/usr/lib/openssh/agent-launch start
Посмотрев на этот скрипт, мы имеем следующее:
$ cat /usr/lib/openssh/agent-launch
#!/bin/sh
# вспомогательный скрипт для запуска ssh-agent, используемый юнитом systemd
set -e
if [ ! -d "$XDG_RUNTIME_DIR" ]; then
# shellcheck disable=SC2016
echo 'Это требует установки $XDG_RUNTIME_DIR' >&2
exit 1
fi
if [ "$1" = start ]; then
if [ -z "$SSH_AUTH_SOCK" ] && grep -s -q '^use-ssh-agent$' /etc/X11/Xsession.options; then
S="$XDG_RUNTIME_DIR/openssh_agent"
dbus-update-activation-environment --verbose --systemd SSH_AUTH_SOCK="$S" SSH_AGENT_LAUNCHER=openssh
exec ssh-agent -D -a "$S"
fi
elif [ "$1" = stop ]; then
if [ "$SSH_AGENT_LAUNCHER" = openssh ]; then
dbus-update-activation-environment --systemd SSH_AUTH_SOCK=
fi
else
echo "Неизвестная команда $1" >&2
exit 1
fi
Мы можем сделать несколько выводов из этого:
- Переменная окружения
$XDG_RUNTIME_DIR
должна быть определена - Переменная
$SSH_AUTH_SOCK
должна быть неопределена use-ssh-agent
должен быть определен в/etc/X11/Xsession.options
Поэтому отредактируйте /etc/X11/Xsession.options
и добавьте use-ssh-agent
:
$ cat /etc/X11/Xsession.options
use-ssh-agent
Далее, уберите определение $SSH_AUTH_SOCK
, если оно задано:
unset SSH_AUTH_SOCK
Затем запустите вашу службу:
systemctl --user start ssh-agent.service
Проверьте статус, и вы должны увидеть его active (running)
:
$ systemctl --user status ssh-agent
● ssh-agent.service - OpenSSH Agent
Loaded: загружен (/usr/lib/systemd/user/ssh-agent.service; static)
Active: активен (работает) с Сб 2025-02-22 08:43:57 PST; 4с назад
Docs: man:ssh-agent(1)
Main PID: 146724 (ssh-agent)
Tasks: 1 (ограничение: 19104)
Memory: 1.1M
CPU: 8мс
CGroup: /user.slice/user-1000.slice/[email protected]/app.slice/ssh-agent.service
└─146724 ssh-agent -D -a /run/user/1000/openssh_agent
Feb 22 08:43:57 gamekeeper systemd[146229]: Запущен OpenSSH Agent.
Feb 22 08:43:58 gamekeeper agent-launch[146727]: dbus-update-activation-environment: установка>
Feb 22 08:43:58 gamekeeper agent-launch[146727]: dbus-update-activation-environment: установка>
Feb 22 08:43:58 gamekeeper agent-launch[146724]: SSH_AUTH_SOCK=/run/user/1000/openssh_agent>
Feb 22 08:43:58 gamekeeper agent-launch[146724]: echo Agent pid 146724;
Как отмечено ранее, не следует определять SSH_AUTH_SOCK
как переменную окружения. Это берется на себя ssh-agent
при его запуске. Цитируя ssh-agent(1) manpage:
SSH_AUTH_SOCK Когда ssh-agent запускается, он создает UNIX-domain сокет и сохраняет его путь в этой переменной. Он доступен только текущему пользователю, но может быть легко использован с помощью root или другой копии того же пользователя.
Ответ или решение
Использование системы управления службами systemd для запуска ssh-agent
как пользовательской службы может значительно упростить работу с ключами SSH на системах Ubuntu. Однако, как и в любом сложном процессе, могут возникнуть трудности. Рассмотрим, как правильно настроить и использовать ssh-agent.service
на Ubuntu 24.04, учитывая возможные проблемы, описанные в условиях вопроса.
Теория
Служба ssh-agent.service
, доступная в составе пакета openssh-client
, позволяет автоматически запускать ssh-agent
в пользовательском контексте. Это особенно удобно для управления SSH ключами без необходимости вручную запускать агент в каждом новом сеансе.
В системах Ubuntu, начиная с версии 16.10, в составе openssh-client
предусмотрен файл службы ssh-agent.service
, который использует systemd для управления жизненным циклом ssh-agent
.
Ключевые элементы настройки:
-
Переменные среды:
XDG_RUNTIME_DIR
: определяет место временного хранения сокетов, и он должен быть установлен в системе.SSH_AUTH_SOCK
: путь к сокету агент-программы, который не должен быть вручную определен пользователем, посколькуssh-agent
установит его автоматически.
-
Опция Xsession:
use-ssh-agent
должна быть добавлена в файл/etc/X11/Xsession.options
, чтобы гарантировать, что агент запускается корректно и в нужный момент.
Пример
Следуйте приведенной инструкции, чтобы настроить и использовать ssh-agent.service
:
-
Проверка конфигурации Xsession:
Убедитесь, что в файле
/etc/X11/Xsession.options
присутствует строкаuse-ssh-agent
:sudo echo "use-ssh-agent" >> /etc/X11/Xsession.options
-
Настройка переменных окружения:
Убедитесь, что переменная
XDG_RUNTIME_DIR
определена в вашем окружении. Это может быть сделано автоматически при входе в систему. Не указывайтеSSH_AUTH_SOCK
вручную, так как это вносит противоречия в конфигурацию. -
Запуск службы:
После настройки конфигурационных файлов, перезапустите агент командой:
systemctl --user start ssh-agent.service
-
Проверка состояния службы:
Убедитесь, что служба запущена и работает:
systemctl --user status ssh-agent.service
Если всё настроено правильно, статус будет "active (running)".
Применение
После настройки ssh-agent.service
, пусковой файл /usr/lib/openssh/agent-launch позаботится о том, чтобы агент был стартован правильно. С этим подходом:
- Удобство: Вы преимущественно освобождены от ручных манипуляций с агентом в каждом новом сеансе.
- Постоянство: Параметры конфига и пути сокета синхронизируются с systemd, что исключает возможность ошибок из-за несоответствия середочных переменных.
Заключение
Использование ssh-agent
в составе systemd – это надежное и эффективное решение для управления ключами на системах Ubuntu. Следуя указанным рекомендациям, вы можете устранить проблемы с запуском и использовать агента максимально эффективно. Если вы столкнулись с проблемами, убедитесь, что системные требования соответствуют указанным, и все необходимые конфигурации выполнены корректно.