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


20

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

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

但是,要真正打电话systemctlservice <game> start/stop/restart我仍然需要以root或有sudo能力的用户身份登录。

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


哪个版本的PolicyKit /发行版?Debian(和衍生产品)使用的旧版本需要不同的配置文件格式
Gert van den Berg '18

Answers:


37

我可以想到两种方法:


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

代替创建系统单元,将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)。

您将创建一个新的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


用户模式和loginctl工作。
Shadur

1
在Ubuntu 16.04上可以使用吗?rules.d目录不存在是否正常?我无法正常工作。我的规则被忽略了。
ygoe's

3
我是否需要重新启动才能启用PolicyKit?
Josir

@MichaelHampton使用systemd --user,我可以得到我想要的所有东西,除了启动时启动服务。我认为这在我在多个地方(例如archlinux Wiki)上阅读时是正常的,但是您说它应该起作用,您确定吗?
daks

@daks是的,它可以工作。如果仍然有问题,请提出一个新问题。
迈克尔·汉普顿

12

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,是的。我想知道是否有一个选项可以让我跳过,因为在这种情况下,systemd单位文件要做的第一件事就是指定它需要以方式运行gamesrv
沙杜尔17'Mar

1

您可以sudo提供与等效的访问权限root,但也可以用于允许特定用户的root用户访问特定的有限命令集。

在服务器故障上,如何解决此问题,请参见[ 将命令集授予非root用户而不使用sudo,而将命令集授予非root用户而不使用sudo。

使用PolicyKit仍然不常见。使用系统化的“用户单元”应该可以正常工作,但是从历史上看,sudo通过允许用户以root用户身份运行特定命令的能力,您的目标已经达到了很多次。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.