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

Ste*_*art 6 debian polkit systemd

我试图允许用户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;
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

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

按照pklocalauthority(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
Run Code Online (Sandbox Code Playgroud)

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

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

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

bla*_*imi 2

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

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