Как использовать системный агент openssh user “ssh-agent.service” в системе systemd?

Вопрос или проблема

Я пытаюсь использовать пользовательскую службу 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

Мы можем сделать несколько выводов из этого:

  1. Переменная окружения $XDG_RUNTIME_DIR должна быть определена
  2. Переменная $SSH_AUTH_SOCK должна быть неопределена
  3. 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.

Ключевые элементы настройки:

  1. Переменные среды:

    • XDG_RUNTIME_DIR: определяет место временного хранения сокетов, и он должен быть установлен в системе.
    • SSH_AUTH_SOCK: путь к сокету агент-программы, который не должен быть вручную определен пользователем, поскольку ssh-agent установит его автоматически.
  2. Опция Xsession:

    • use-ssh-agent должна быть добавлена в файл /etc/X11/Xsession.options, чтобы гарантировать, что агент запускается корректно и в нужный момент.

Пример

Следуйте приведенной инструкции, чтобы настроить и использовать ssh-agent.service:

  1. Проверка конфигурации Xsession:

    Убедитесь, что в файле /etc/X11/Xsession.options присутствует строка use-ssh-agent:

    sudo echo "use-ssh-agent" >> /etc/X11/Xsession.options
  2. Настройка переменных окружения:

    Убедитесь, что переменная XDG_RUNTIME_DIR определена в вашем окружении. Это может быть сделано автоматически при входе в систему. Не указывайте SSH_AUTH_SOCK вручную, так как это вносит противоречия в конфигурацию.

  3. Запуск службы:

    После настройки конфигурационных файлов, перезапустите агент командой:

    systemctl --user start ssh-agent.service
  4. Проверка состояния службы:

    Убедитесь, что служба запущена и работает:

    systemctl --user status ssh-agent.service

    Если всё настроено правильно, статус будет "active (running)".

Применение

После настройки ssh-agent.service, пусковой файл /usr/lib/openssh/agent-launch позаботится о том, чтобы агент был стартован правильно. С этим подходом:

  • Удобство: Вы преимущественно освобождены от ручных манипуляций с агентом в каждом новом сеансе.
  • Постоянство: Параметры конфига и пути сокета синхронизируются с systemd, что исключает возможность ошибок из-за несоответствия середочных переменных.

Заключение

Использование ssh-agent в составе systemd – это надежное и эффективное решение для управления ключами на системах Ubuntu. Следуя указанным рекомендациям, вы можете устранить проблемы с запуском и использовать агента максимально эффективно. Если вы столкнулись с проблемами, убедитесь, что системные требования соответствуют указанным, и все необходимые конфигурации выполнены корректно.

Оцените материал
Добавить комментарий

Капча загружается...