Systemd

Смена пользователя, от имени которого юнит Systemd запускает процесс

Бывает так, что возникает необходимость поменять пользователя, от имени которого Systemd запускает процесс. Например, если установить TorrServer в Arch Linux, то по умолчанию процесс TorrServer запускается от имени пользователя root, что нежелательно и даже опасно. В этой небольшой заметке будет идти речь о том, как поменять в юните Systemd пользователя, от имени которого запускается процесс.

Итак, чтобы сменить пользователя в юните Systemd, нам нужно его (юнит) отредактировать. Для примера, будем редактировать юнит TorrServer. Открываем юнит для редактирования:

sudo systemctl edit torrserver.service

Видим следующее содержимое:

### Editing /etc/systemd/system/torrserver.service.d/override.conf
### Anything between here and the comment below will become the contents of the drop-in file


### Edits below this comment will be discarded


### /usr/lib/systemd/system/torrserver.service
# [Unit]
# Description = TorrServer
# After = syslog.target network.target nss-lookup.target
#
# [Service]
# Type = simple
# Environment="GODEBUG=madvdontneed=1"
# ExecStart = /usr/bin/torrserver -d /var/lib/torrserver
# ExecReload = /bin/kill -HUP ${MAINPID}
# ExecStop = /bin/kill -INT ${MAINPID}
# TimeoutSec = 30
# Restart = on-failure
# LimitNOFILE = 4096
#
# [Install]
# WantedBy = multi-user.target

Как видно, в нижней части в закомментированном виде находится оригинальное содержимое файла юнита. Фраза “Edits below this comment will be discarded” говорит нам о том, что все правки, которые будут осуществлены после этой строчки будут отклонены. Чтож, будем вносить правки до неё.

Чтобы сменить пользователя, от имени которого юнит Systemd будет запускать процесс, в секцию [Service] нужно добавить строку User= с именем пользователя, от которого будет запускаться процесс юнитом. Добавляем строки в юнит не забывая о том, что разместить их нужно выше той строчки. Теперь файл выглядит так:

### Editing /etc/systemd/system/torrserver.service.d/override.conf
### Anything between here and the comment below will become the contents of the drop-in file

[Service]
User=imatvey

### Edits below this comment will be discarded


### /usr/lib/systemd/system/torrserver.service
# [Unit]
# Description = TorrServer
# After = syslog.target network.target nss-lookup.target
#
# [Service]
# Type = simple
# Environment="GODEBUG=madvdontneed=1"
# ExecStart = /usr/bin/torrserver -d /var/lib/torrserver
# ExecReload = /bin/kill -HUP ${MAINPID}
# ExecStop = /bin/kill -INT ${MAINPID}
# TimeoutSec = 30
# Restart = on-failure
# LimitNOFILE = 4096
#
# [Install]
# WantedBy = multi-user.target

Сохраняем изменения в файле юнита и перезапускаем сервис:

sudo systemctl restart torrserver.service

Готово. Теперь процесс, запущенный сервисом, юнит которого мы отредактировали, будет запускаться от указанного нами пользователя.