Estou tentando permitir que os usuários de um somegroup
gerenciem o someunit
serviço systemd.
Em polkit (>=0.106)
, isso pode ser feito adicionando regras:
/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;
}
}
});
No entanto, estou no Debian stretch/buster onde estamos polkit 0.105
desde 2012. polkit(<0.106)
não suporta os rules.d/*
arquivos. Em vez disso, contamos com /etc/polkit-1/localauthority/50-local.d/*.pkla
.
Seguindo alguns exemplos em pklocalauthority(8) , consigo fazer a maior parte disso funcionar em um arquivo pkla equivalente:
/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
No entanto, isso concede acesso para TODAS as ações em TODOS os serviços. Existe um equivalente para permitir action.lookup()
recursos específicos?
Eu experimentei systemctl enable
e systemctl edit
, dos quais ambos ainda falharam (isso é bom). Portanto, action.lookup("verb")
pode não ser necessário, mas action.lookup("unit")
ainda é bastante importante.
Há muitas perguntas sem resposta sobre este assunto:
não é possível. Este recurso foi implementado apenas para a variante .rules
https://github.com/systemd/systemd/pull/1159
funciona para um usuário embora:
Na verdade, era a única maneira de fazê-lo funcionar no raspian, porque não honra as regras do polkit escritas em javascript por algum motivo estranho.