Я запускаю частный игровой сервер на 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.