Назад | Перейти на главную страницу

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

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

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

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

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

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


Один из них - сделать службу пользовательской, а не системной.

Вместо создания системного модуля модуль systemd будет помещен в домашний каталог пользователя службы по адресу $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 для файлов rules.d JavaScript - проверьте с помощью 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 по-прежнему редкость. Использование "пользовательского модуля" systemd должно работать нормально, но исторически ваша цель достигалась много раз за счет использования возможности sudo чтобы позволить пользователю запускать определенные команды как root.