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

我正在一个无头的Linux机器上运行一个私人游戏服务器。 因为我不是白痴,所以说服务器作为自己的非特权用户运行,只需要最小的访问权限就可以下载更新并修改世界数据库。

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

但是,为了实际调用systemctlservice <game> start/stop/restart我仍然需要以root用户或sudo能力用户身份login。

有没有办法告诉systemd对于<game>服务,非特权用户gamesrv被允许运行start / stop / restart命令?

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


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

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

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


另一种方式是允许用户通过PolicyKit访问pipe理系统单元。 这需要systemd 226或更高版本。

您将创build一个新的PolicyKitconfiguration文件,例如/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; } }); 

指定的用户可以使用systemctlpipe理指定的服务,而不使用sudo

sudo是为此而制作的。 用visudo编辑你的/etc/sudoers文件,为你希望非特权用户可以使用的命令添加一个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访问特定的,有限的一组命令。

如何在服务器错误上解决这个问题,如[在没有sudo的情况下将一组命令的访问权限授予非root用户,而没有使用sudo权限访问非root用户的命令)。

使用PolicyKit仍然不常见。 使用systemd“用户单元”应该可以正常工作,但是历史上你的目标已经被使用sudo的能力来允许用户以root身份运行特定的命令。