polkit-Regel um Usern poweroff zu erlauben

Auf meinem Arch Linux mpd-Server wollte ich dem User mpd erlauben den Rechner herunter zu fahren. Die einfachste Variante ist es, den Benutzer mpd einfach zur Gruppe wheel hinzuzufügen. Diese wird auch in polkit als Admingruppe anerkannt. Nun wollte ich mpd aber nur erlauben herunter zu fahren und nicht gleich Zugriff auf alle Adminfunktionalität zu geben.

Dazu muss eine Datei /etc/polkit-1/rules.d/mpd.rules angelegt werden:

polkit.addRule(function(action, subject) {

    if (action.id == 'org.freedesktop.login1.power-off' &&
        subject.isInGroup('mpd')
    ) {
        return polkit.Result.YES;
    }
});

Ich habe hiermit gleich der Gruppe mpd Berechtigungen zum poweroff gegeben. Mit subject.user == 'mpd', hätte dies auf nur den einen Benutzer begrenzt werden können.

Was passiert hier?

Wenn eine Action mit der id 'org.freedesktop.login1.power-off' kommt und der Benutzer sich in der Gruppe mpd befindet, gibt die Funktion polkit.Result.YES zurück. Damit weiß das fragende Programm, dass es die gewünschte Aktion durchführen darf.

Das Resultat ist also, dass mpd nur herunterfahren, aber nicht z.B. reboot, suspend oder hibernate darf. Außerdem ist ein Herunterfahren nur erlaubt wenn es keine weiteren Sessions auf dem Rechner gibt. org.freedesktop.login1.power-off-multiple-sessions ist die Aktion, nach der bei mehr als einem angemeldeten Benutzer gefragt wird.

In jedem nicht explizit erlaubten Kommando (z.B. reboot) wird nach dem root-Passwort gefragt.

[mpd@server ~]$ reboot

==== AUTHENTICATING FOR org.freedesktop.login1.reboot ===
Authentication is required for rebooting the system.
Authenticating as: root
Password:

Ist der User root angemeldet wird poweroff unüberwindbar abgelehnt

[mpd@server ~]$ poweroff

User root is logged in on sshd.
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl poweroff -i'.

Das ganze sieht auf den ersten Blick wie JavaScript aus, stellt sich raus... ist JavaScript:

$ man polkit

Rules files are written in the JavaScript[7] programming
language and interface with polkitd through the global polkit object
(of type Polkit).