systemd:授予非特权用户更改特定服务的权限

Sha*_*dur 34 linux systemd

我在无头 linux 机器上运行私人游戏服务器。因为我不是白痴,所以说服务器作为它自己的非特权用户运行,具有下载更新和修改世界数据库所需的最低访问权限。

我还创建了一个 systemd 单元文件,以便在需要时正确启动、停止和重新启动服务器(例如,对于上述更新)。

但是,为了实际调用systemctl或者service <game> start/stop/restart我仍然需要以 root 或有sudo能力的用户身份登录。

有没有办法告诉 systemd 对于该<game>服务,gamesrv允许非特权用户运行启动/停止/重启命令?

Mic*_*ton 62

我可以想到两种方法来做到这一点:


一种是使服务成为用户服务而不是系统服务。

systemd 单元将放置在服务用户的主目录下,而不是创建系统单元$HOME/.config/systemd/user/daemon-name.service。然后同一个用户可以管理服务systemctl --user <action> daemon-name.service

要允许用户单元在启动时启动,root 必须为该帐户启用 linger,即sudo loginctl enable-linger username. 单位也必须是WantedBy=default.target


另一种方式是允许用户通过 PolicyKit 访问管理系统单元。这需要 systemd 226 或更高版本(对于 JavaScript rules.d 文件,PolicyKit >= 0.106 – 检查pkaction --version)。请注意,Debian 故意将 PolicyKit 推迟到近十年前的 0.105 版本,该版本不支持此功能,显然是因为个人意见,无论是它还是从它派生的发行版(如 Ubuntu)都不能使用这种方法。

您将创建一个新的 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;
    }
});
Run Code Online (Sandbox Code Playgroud)

然后,命名用户可以使用systemctl或不使用 来管理命名服务sudo


Hen*_*gel 21

sudo是为此而生的。编辑您的/etc/sudoers文件,visudoCmd_alias您希望非特权用户能够使用的命令添加一个:

# game server commands
Cmnd_Alias GAME_CMDS = /usr/bin/systemctl start <game service>, /usr/bin/systemctl stop <game service>
Run Code Online (Sandbox Code Playgroud)

并添加一行以允许非特权用户使用使用别名定义的命令,如下所示:

unprivileged_user ALL=(ALL) NOPASSWD: GAME_CMDS
Run Code Online (Sandbox Code Playgroud)

阅读有关该主题的更多文档,了解sudo 命令的各种参数。

您可能需要安装sudo软件包才能sudo在您的系统上使用。