使用 pkla 的 systemd 服务管理相当于 Debian 上的 polkit 规则

使用 pkla 的 systemd 服务管理相当于 Debian 上的 polkit 规则

我试图允许用户somegroup管理someunitsystemd 服务。

在 中polkit (>=0.106),这可以通过添加规则来完成:

/etc/polkit-1/rules.d/20-someunit.rules
---
polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.systemd1.manage-units" 
        && subject.isInGroup("somegroup")
        && (action.lookup("unit") == "someunit.service") )
    {
        var verb = action.lookup("verb");
        if (verb == "start" || verb == "stop" || verb == "restart") {
            return polkit.Result.YES;
        }
    }
});

然而,我使用的是 Debianstretch/buster,我们polkit 0.105自 2012 年以来 一直使用该版本。polkit(<0.106)不支持这些rules.d/*文件。相反,我们依赖/etc/polkit-1/localauthority/50-local.d/*.pkla.

以下是一些例子PK地方当局(8),我可以在等效的 pkla 文件中完成大部分工作:

/etc/polkit-1/localauthority/50-local.d/manage-units.pkla
----
[Allow users to manage services]
Identity=unix-group:somegroup
Action=org.freedesktop.systemd1.manage-units
ResultActive=yes

但是,这会授予对所有服务的所有操作的访问权限。是否有相当于允许特定action.lookup()功能的功能?

我确实尝试了systemctl enablesystemctl edit,但仍然失败(这很好)。所以action.lookup("verb")可能不是必需的,但action.lookup("unit")仍然相当重要。

关于这个主题有很多悬而未决的问题:

答案1

这是不可能的。此功能仅针对 .rules-variant 实现

https://github.com/systemd/systemd/pull/1159

答案2

但适用于用户:

sudo cat /etc/polkit-1/localauthority/50-local.d/54-manage-units.pkla
[systemd]
Identity=unix-user:pi
Action=org.freedesktop.systemd1.manage-units
ResultAny=yes
ResultInactive=yes
ResultActive=yes

事实上,这是让它在 raspian 上工作的唯一方法,因为出于某种奇怪的原因,它不遵守用 javascript 编写的 polkit 规则。

相关内容