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.