Ste*_*art 6 systemd non-root-user
我希望群组中的用户foogroup能够:
systemctl start foo.service,systemctl stop foo.service,systemctl status foo.service, 和journalctl -u foo.service 不使用提升的权限。那可能吗?
我有一个 systemd 服务,如下所示:
[Unit]
Description=foo service
[Service]
Type=simple
ExecStart=/bin/sleep infinity
User=foobot
Group=foogroup
Run Code Online (Sandbox Code Playgroud)
foobot系统用户在哪里。
我知道我们可以安装单元文件以~/.config/systemd/user/允许非特权用户使用 systemd,但这并不能真正帮助组。
注意:我计划在 cockpit 中使用sd - bus API ,因此添加不会有帮助。libsystem-devsystemctl/etc/sudoers
我不太关心systemctl enable,如果我需要更高的特权也没关系。
这是我最终想出的解决方案。我创建:
/etc/polkit-1/localauthority/50-local.d/service-auth.pkla
---
[Allow foogroup to start/stop/restart services]
Identity=unix-group:foogroup
Action=org.freedesktop.systemd1.manage-units
ResultActive=yes
Run Code Online (Sandbox Code Playgroud)
请注意,这特别适用于 Debian/Ubuntu 中使用的 polkit <106。其他发行版使用更新版本的 polkit ,它会执行如下操作:
/etc/polkit-1/rules.d/foogroup.rules
---
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
subject.isInGroup("foogroup")) {
return polkit.Result.YES;
} });
Run Code Online (Sandbox Code Playgroud)
如果您想将其限制为单个服务并且仅启动/停止/重新启动,请使用如下内容:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
subject.isInGroup("foogroup")) {
if (action.lookup("unit") == "foo.service") {
var verb = action.lookup("verb");
if (verb == "start" || verb == "stop" || verb == "restart") {
return polkit.Result.YES;
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
(来自https://wiki.archlinux.org/title/Polkit)