🐧 Как запустить сервисы Systemd без пользователя root / sudo

Мануал
Systemd – это современный инит и замена rc в стиле SysV для систем Linux, которая использует многие современные функции ядра Linux.
Он предоставляет диспетчер системы и услуг, который запускается как PID 1 и запускает остальную часть системы.
Systemd отвечает за управление тем, как службы запускаются, останавливаются, перезапускаются и каким-либо другим образом управляются в современных дистрибутивах Linux.
Стандартные файлы модулей Systemd , которые поставляются с системой Linux или устанавливаются сторонними приложениями, обычно запускаются от имени пользователя root или системного пользователя.
Это руководство покажет вам, как запустить службу Systemd без рута от обычного пользователя, вошедшего в систему.

Юнит службы Systemd

Файл модуля Systemd содержит директивы конфигурации, которые описывают модуль и определяют его поведение.

В этом руководстве мы напишем файл модуля systemd, которым может управлять зарегистрированный пользователь без sudo.

Запустим службу Systemd от стандартного пользователя

Пользовательский сервис Systemd должен быть помещен в каталог ~/.config/systemd/user , если вы хотите иметь полное право владения обычным пользователем.

Создайте его, если его не существует.

mkdir -p  ~/.config/systemd/user/

Мы создадим тестовый сервис, который запускает приложение Syncthing.

curl -s https://api.github.com/repos/syncthing/syncthing/releases/latest | grep browser_download_url | grep linux-amd64 | cut -d '"' -f 4 | wget -qi -
tar xvf syncthing-linux-amd64*.tar.gz
sudo cp syncthing-linux-amd64-*/syncthing  /usr/local/bin/
Давайте подтвердим, что наш бинарник приложения доступен.
$ syncthing --version
syncthing v1.4.0 "Fermium Flea" (go1.13.8 linux-amd64) teamcity@build.syncthing.net 2020-03-06 19:52:22 UTC
Создайте файл системного юнита  в каталоге.
$ vim  ~/.config/systemd/user/syncthing.service
[Unit]
Description=Syncthing - Open Source Continuous File Synchronization
Documentation=man:syncthing(1)

[Service]
ExecStart=/usr/local/bin/syncthing -no-browser -no-restart -logflags=0
Restart=on-failure
SuccessExitStatus=3 4
RestartForceExitStatus=3 4

# Hardening
SystemCallArchitectures=native
MemoryDenyWriteExecute=true
NoNewPrivileges=true

[Install]
WantedBy=default.target
Перезагрузите systemd.
$ systemctl --user daemon-reload

Подтвердите, что служба доступна.

$ systemctl --user list-unit-files syncthing.service
UNIT FILE         STATE   
syncthing.service disabled

1 unit files listed.
Вы можете запустить службу сразу после создания.
$ systemctl --user enable --now syncthing.service
Created symlink /home/vagrant/.config/systemd/user/default.target.wants/syncthing.service → /home/vagrant/.config/systemd/user/syncthing.service.

Давайте проверим состояние нашего сервиса.

$ systemctl --user status syncthing.service 
● syncthing.service - Syncthing - Open Source Continuous File Synchronization
   Loaded: loaded (/home/vagrant/.config/systemd/user/syncthing.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-04-03 17:18:54 UTC; 5s ago
     Docs: man:syncthing(1)
 Main PID: 22628 (syncthing)
   CGroup: /user.slice/user-1000.slice/user@1000.service/syncthing.service
           ├─22628 /usr/local/bin/syncthing -no-browser -no-restart -logflags=0
           └─22632 /usr/local/bin/syncthing -no-browser -no-restart -logflags=0
Используемая опция:
  • –user
Это тот же процесс, который вы можете использовать для создания любой другой службы Systemd, которой хотите управлять без повышения привилегий или создания другого системного пользователя для запуска службы.

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

  1. ELForcer

    А как автозапуск сделать с правами user и что бы юзер мог управлять службой без прав sudo?

    Ответить
    1. cryptoparty автор

      USER ALL = NOPASSWD: /usr/sbin/service

      Ответить
  2. ELForcer

    Получается что установленные сервисы через –user настроить на автозапуск нельзя ?Получается нужно установить сервис в раздел /etc/system/systemd, для возможности автозапуска, дать права в /etc/sudoers USER ALL = NOPASSWD: /usr/sbin/service что бы не просил пароль?

    Ответить
    1. cryptoparty автор

      Вообще можно. Можно сделать системный юнит, где указать пользователя и сделать скрипт запуска от пользователя. Но это больше трудозатрат

      Ответить
      1. ELForcer

        Ну я так и собирался делать. Другого варианта не вижу.

        Ответить
        1. cryptoparty автор

          Так каков вопрос? Чем могу подскажу

          Ответить