Inhalt
Spätestens wenn man bemerkt, dass altgediente Tools wie gksudo oder kdesudo auf den neuesten Systemversionen nicht mehr funktionieren, muss man sich mit dem PolicyKit oder kurz PolKit auseinandersetzen, wenn man weiterhin Programme mit root-Rechten vom Desktop eines Users starten können will.
Debian und davon abgeleitete Systeme wie Ubuntu haben gksudo schon längere Zeit nicht mehr installiert. Seit Debian 10 gibt es in den debian stable- und testing-Repositories nicht mal mehr die entsprechenden Pakete zum Nachinstallieren.
Unter Debian 10 sind im Cinnamon-Desktop eines unprevilegierten Nutzers zwar die Systemverwaltungswerkzeuge wie Synaptic oder verschiedene cinnamon-settings-… Einträge im Menü vorhanden, aber sie funktionieren nicht mehr (und zwar ohne jegliche Fehlermeldung).
Um sie wieder zum Laufen zu bringen, müssen wir am PolKit schrauben
Synaptic unter Debian 10 (Buster) zum Laufen bringen
Debian nutzt, anders als viele anderen Linux-Distributionen, auch bei Buster noch das „alte” PolicyKit (Version 0.105). Diese Version arbeitet noch mit localauthority und kennt keine Rules.
Um Synaptic wieder benutzbar zu machen, ohne sich extra als root anmelden zu müssen, kann man die zugehörige policy-Datei ändern:
$ sudo vi /usr/share/polkit-1/actions/com.ubuntu.pkexec.synaptic.policy
...
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
<allow_active>yes</allow_active>
</defaults>
...
Das Starten mit pkexec funktioniert nicht mit dem Eintragen des Befehls direkt im Starter, sondern nur über ein Script im Ordner der ausführbaren Datei:
$ sudo vi /usr/sbin/synaptic-pkexec
/usr/bin/pkexec "/usr/sbin/synaptic" "$@"
$ sudo chmod o+x /usr/sbin/synaptic-pkexec
In der Desktop-Datei wird dann als Befehl /usr/sbin/synaptic-pkexec
anstelle /usr/sbin/synaptic
eingetragen.
Jetzt kann man zwar Synaptic wieder über einen Desktop-Starter oder das Menü benutzen, aber das darf jetzt jeder beliebige angemeldete Nutzer. Will man das auf einen einzelnen Nutzer oder eine Gruppe beschränken, muss man etwas tiefer in PolKit einsteigen.
Aufbau der Policy-Dateien
Die Policies sind in XML-Dateien mit der Endung .policy
unter /usr/share/polkit-1/actions/
definiert. Das PolKit-Paket bringt schon eine Reihe vordefinierter Policies mit, etwa für die verschiedenen Systemeinstellungsdialoge. Auch andere installierte Pakete können eigene Policies mitbringen.
Einen Überblick über die installierten Policies bietet das pkaction
Kommando:
$ pkaction
com.hp.hplip.installplugin
com.ubuntu.pkexec.gdebi.gtk
com.ubuntu.pkexec.synaptic
...
Die Details der Policies für Synaptic kann man sich ebenso mit pkaction unter Angabe der Action-ID mit dem --verbose
Schalter ansehen:
$ pkaction --action-id com.ubuntu.pkexec.synaptic --verbose
com.ubuntu.pkexec.synaptic:
description:
message: Authentication is required to run the Synaptic Package Manager
vendor:
vendor_url:
icon: synaptic
implicit any: auth_admin
implicit inactive: auth_admin
implicit active: yes
annotation: org.freedesktop.policykit.exec.path -> /usr/sbin/synaptic
annotation: org.freedesktop.policykit.exec.allow_gui -> true
$
Dabei sind die Einstellungen schon entsprechend der Umgebung interpretiert, z.B. anhand der eingestellten Sprache. Die XML-Datei /usr/share/polkit-1/actions/com.ubuntu.pkexec.synaptic.policy
enthält die vollständigen Informationen:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policyconfig PUBLIC
"-//freedesktop//DTD PolicyKit Policy Configuration 1.0//EN"
"http://www.freedesktop.org/standards/PolicyKit/1/policyconfig.dtd">
<policyconfig>
<action id="com.ubuntu.pkexec.synaptic">
<message>Authentication is required to run the Synaptic Package Manager</message>
<message xml:lang="de">Um die Synaptic-Paketverwaltung zu benutzen, ist eine Legitimation notwendig</message>
<icon_name>synaptic</icon_name>
<defaults>
<allow_any>auth_admin</allow_any>
<allow_inactive>auth_admin</allow_inactive>
<allow_active>auth_admin</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/usr/sbin/synaptic</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>
</policyconfig>
Nach dem Header startet die eigentliche Definition mit
<policyconfig>
<action id=„com.ubuntu.pkexec.synaptic”>
Damit wird die Action-ID festgelegt, die wir später noch an verschiedenen Stellen brauchen. Das <message>
Tag definiert einen Text, der beim Anfordern des Passworts angezeigt wird. Mit xml:lang=...
kann man ihn für verschiedene Sprachen definieren.
Die Funktion des optionalen icon_name
ist etwas unklar beschrieben; es soll den Erzeuger der Policy repräsentieren. Es hat aber scheinbar weder mit dem Menü- noch mit dem Desktop-Icon zu tun.
Wichtiger sind die <defaults>
. Hier werden die Rechte oder deren Verweigerung eingetragen. Die drei Abschnitte allow_any
, allow_inactive
und allow_active
bezeichnen die verschiedenen Arten von User Sessions. Inaktive Sessions sind Sitzungen, die entfernt über z.B. ssh oder vnc geöffnet wurden, während aktive Sessions direkt angemeldete Benutzer sind, etwa an einem TTY oder über X-11.
Für jede Session-Art können folgende Rechte vergeben werden:
no | Der Nutzer ist für die Aktion nicht autorisiert. |
yes | Der Nutzer ist ohne weitere Anmeldung für die Aktion autorisiert |
auth_self | Der Nutzer muss sich für die Aktion selbst anmelden, muss aber kein administrativer Nutzer sein |
auth_admin | Der Nutzer muss sich für die Aktion als Administrator anmelden |
auth_self_keep | Wie auth_self , aber die Anmeldunggilt wie bei sudo einige Minuten |
auth_admin_keep | Wie auth_admin , aber die Anmeldunggilt wie bei sudo einige Minuten |
Diese Standard-Rechte gelten für alle Nutzer, können aber später durch Regeln überschrieben werden.
Lokale Policies
In der bei Debian verwendeten Version werden Ausnahmen von den Standard-Rechten in policy kit local authority
(.pkla
) Dateien unter /etc/polkit-1/localauthority/
definiert. Unter diesem Verzeichnis ist eine Hierarchie definiert, in der Dateien mit Berechtigungen auf der Ebene von Betriebssystem (10-vendor.d, 90-mandatory.d), Organisation (20-org.d), Ort (30-site.d) und einzelner Rechner (50-local.d) erzeugt werden können.
In der .pkla
Datei wird die Aktion (Action
), der Nutzer oder die Nutzergruppe (Identy
) und das Resultat des Berechtigungs-Checks (ResultActive
, ResultInactive
, ResultAny
) eingetragen. Der Dateiname muss eindeutig sein. Die .pkla
-Dateien werden in alphabetischer Reihenfolge der Verzeichnis- und Dateinamen abgearbeitet. Auch nach einem Treffer werden die restlichen Dateien weiter ausgeführt, so dass man auch negative Autorisierungen definieren kann.
Für unser Synaptic-Beispiel sähe die Datei /etc/polkit-1/localauthority/50-local.d/synaptic-sudo.pkla
dann so aus:
[Allow sudo members to use synaptic]
Identity=unix-group:sudo
Action=com.ubuntu.pkexec.synaptic
ResultActive=yes
Statt ResultActive
für lokal angemeldete Nutzer kann auch ResultInactive
für remote Sessions oder ResultAny
für jegliche Sessions eingetragen werden. Der Wert entspricht denen der Standard-Berechtigungen (yes, no, auth_self, auth_self_keep, auth_admin
oder auth_admin_keep
).
Die Identity
beginnt mit unix-user:,
unix-group:
oder unix-netgroup:
- der Wert kann ein Nutzer- oder Gruppenname oder ein glob-Pattern sein.
Zusätzlich können mit ReturnValue
noch weitere optionale Parameter (als durch Semikolon getrennte key=value Paare) angegeben werden, die bei positivem Resultat an das aufrufende Programm übergeben werden.
Regeln
Regeln sind eine Neuerung in PolKit-Versionen >0.105 und somit noch nicht in Debian verfügbar. Dabei können für spezielle Nutzer oder Nutzergruppen Berechtigungen in .rules
Dateien in /etc/polkit-1/rules.d
definiert werden. Ihr Aufbau sähe für das Synaptic-Beispiel so aus:
/* Nutzern der sudo Gruppe die Ausführung von Synaptic erlauben */
polkit.addRule(function(action, subject) {
if (action.id == "com.ubuntu.pkexec.synaptic" &&
subject.isInGroup("sudo")) {
return polkit.Result.YES;
}
});
Quellen:
- Arch Wiki: Policy Kit
https://wiki.archlinux.org/index.php/Polkit - Freedesktop PolKit Reference Manual
https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html
Steht scheinbar alles Wichtige drin!
Danke!