systemd: предоставьте непривилегированному пользователю разрешение на изменение одной конкретной службы

У меня частный игровой сервер на безголовом ящике Linux. Поскольку я не идиот, указанный сервер работает как собственный непривилегированный пользователь с минимальными правами доступа, необходимыми для загрузки обновлений и изменения мировой базы данных.

Я также создал системный файл systemd для правильного запуска, остановки и перезапуска сервера при необходимости (например, для упомянутых обновлений).

Однако для того, чтобы на самом деле позвонить systemctl или же service <game> start/stop/restart Мне все еще нужно войти как root или sudo способный пользователь.

Есть ли способ сказать systemd, что для <game> сервис, непривилегированный пользователь gamesrv разрешено запускать команды пуска / остановки / перезапуска?

3 ответа

Решение

Я могу придумать два способа сделать это:


Один из них - сделать сервис пользовательским, а не системным сервисом.

Вместо создания системного модуля системный модуль будет помещен в домашний каталог пользователя службы по адресу $HOME/.config/systemd/user/daemon-name.service, Затем тот же пользователь может управлять службой с systemctl --user <action> daemon-name.service,

Чтобы пользовательский модуль мог запускаться при загрузке, root должен включить задержку для учетной записи, т.е. sudo loginctl enable-linger username, Блок также должен быть WantedBy=default.target,


Другой способ - предоставить пользователю доступ к управлению системным блоком через PolicyKit. Для этого требуется systemd 226 или выше (и PolicyKit >= 0.106 для файлов JavaScript rules.d - проверьте с помощью pkaction --version).

Вы должны создать новый файл конфигурации PolicyKit, например /etc/polkit-1/rules.d/57-manage-daemon-name.rules который проверяет атрибуты, которые вы хотите разрешить. Например:

// Allow alice to manage example.service;
// fall back to implicit authorization otherwise.
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" &&
        action.lookup("unit") == "example.service" &&
        subject.user == "alice") {
        return polkit.Result.YES;
    }
});

Затем указанный пользователь может управлять именованным сервисом с помощью systemctl и без использования sudo,

sudo сделано для этого. Отредактируйте свой /etc/sudoers файл с visudo добавить Cmd_alias для команд, которые вы хотите использовать непривилегированному пользователю:

# game server commands
Cmnd_Alias GAME_CMDS = /usr/bin/systemctl start <game service>, /usr/bin/systemctl stop <game service>

и добавьте строку, чтобы позволить непривилегированному пользователю использовать команды, определенные с псевдонимом, например так:

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS

Прочитайте дополнительную документацию по этой теме для различных параметров команды sudo.

Вам может понадобиться установить sudo пакет иметь sudo доступно в вашей системе.

Вы можете ассоциировать sudo с предоставлением доступа, эквивалентного root, но его также можно использовать, чтобы разрешить конкретному пользователю root-доступ для определенного ограниченного набора команд.

Как на это уже ответили при сбое сервера, в [ Предоставление доступа к набору команд пользователю без полномочий root без доступа sudo к набору команд для пользователя без полномочий root без sudo).

Использование PolicyKit все еще редко. Использование системного "пользовательского модуля" должно работать нормально, но исторически ваша цель была достигнута много раз с помощью способности sudo чтобы позволить пользователю запускать определенные команды от имени пользователя root.

Другие вопросы по тегам