Polkit (Français)
polkit est un ensemble d'outils permettant de gérer des règles pour autoriser la communication entre, d'un côté, des processus privilégiés offrant des services et de l'autre, des processus non privilégiés. Pour donner un exemple concret, ça peut selon la configuration permettre, à un simple utilisateur de modifier l'heure sans pour autant avoir l'accès à l'utilisateur root
.
Installation
L'installation explicite n'est pas nécessaire, si vous installez une application qui y fait appel, le paquet polkit sera de la partie.
Fonctionnement
polkit s'articule autour :
- d'une autorité (Authority) qui permet aux applications de faire des demandes d'autorisation.
- d'actions définies par les applications.
- d'un ensemble de règles définissant les autorisations (Authorization Rules).
- d'un agent d'authentification (Authentification Agent) dans le cas où il y aurait une demande de mot de passe.
Autorité
L'autorité est représentée par le service D-Bus fourni par le programme polkitd
. Le service est lancé à la demande (quelque soit le système init).
Actions
Les actions sont définies par les applications et se présentent sous la forme d'un fichier /usr/share/polkit-1/actions/*.policy
.
Une action est déclarée avec des autorisations par défaut selon l'état de la session utilisateur (session ici désigne les sessions telles que définies par systemd-logind). Les 3 états possibles sont :
-
implicit_active
: La session de l'utilisateur est locale (non distante) et active (l'utilisateur peut interagir avec). -
implicit_inactive
: La session de l'utilisateur est locale (non distante) mais non active. -
implicit_any
: Tous les autres cas.
Pour chaque état, l'autorisation peut être :
-
no
: pas d'accès. -
yes
: accès sans restriction. -
auth_self
: donne l'accès une seule fois après avoir demandé à l'utilisateur de s'authentifier. -
auth_admin
: il faut s'authentifier en tant qu'administrateur. -
auth_self_keep
: demande l'authentification de l'utilisateur et garde l'autorisation pour cinq minutes. -
auth_admin_keep
: même chose queauth_self_keep
mais en demandant l'authentification d'un administrateur.
root
et les utilisateurs du groupe wheel
sont considérés comme administrateur.Pour l'exemple, prenons l'action de monter une partition : org.freedesktop.udisks2.filesystem-mount
. Cette action est définie dans le fichier :
/usr/share/polkit-1/actions/org.freedesktop.udisks2.policy
<?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="org.freedesktop.udisks2.filesystem-mount"> <description>Mount a filesystem</description> <!-- ... --> <message>Authentication is required to mount the filesystem</message> <!-- ... --> <defaults> <allow_any>auth_admin</allow_any> <allow_inactive>auth_admin</allow_inactive> <allow_active>yes</allow_active> </defaults> </action> <!-- ... --> </policyconfig>
On peut avoir des infos sur l'action avec la commande pkaction
:
pkaction --verbose --action-id org.freedesktop.udisks2.filesystem-mount
org.freedesktop.udisks2.filesystem-mount: description: Mount a filesystem message: Authentication is required to mount the filesystem vendor: The udisks Project vendor_url: http://udisks.freedesktop.org/ icon: drive-removable-media implicit any: auth_admin implicit inactive: auth_admin implicit active: yes
Passons la partie présentation de l'action regroupant les entrées description
, message
, vendor*
et icon
et intéressons nous aux autorisations. Par défaut, seul un utilisateur connecté localement et dont la session est active peut monter une partition sans s'authentifier (implicit active
), tout autre cas demande l'authentification en tant qu'administrateur.
Règles
Les règles sont lu depuis /etc/polkit-1/rules.d/*.rules
et /usr/share/polkit-1/rules.d/*.rules
en fonction de leur noms et en prenant ceux de /etc
en premier en cas de noms identiques.
Les fichiers sont des programmes javascript rajoutant des règles à polkit (man polkit
pour plus d'informations).
A titre d'exemple, nous pouvons voir le fichier livré par défaut :
/etc/polkit-1/rules.d/50-default.rules
polkit.addAdminRule(function(action, subject) { return ["unix-group:wheel"]; });
Ce fichier représente l'ajout du groupe wheel
comme groupe d'administrateur.
Pour donner un autre exemple, prenons le cas du montage d'une partition système (partition interne). Par défaut :
pkaction --verbose --action-id org.freedesktop.udisks2.filesystem-mount-system
org.freedesktop.udisks2.filesystem-mount-system: description: Mount a filesystem on a system device message: Authentication is required to mount the filesystem vendor: The udisks Project vendor_url: http://udisks.freedesktop.org/ icon: drive-removable-media implicit any: auth_admin implicit inactive: auth_admin implicit active: auth_admin_keep
Il faut donc s'authentifier quelque soit l'état de la session. On peut le vérifier avec la commande pkcheck
:
pkcheck --action-id org.freedesktop.udisks2.filesystem-mount-system --process $$
polkit\56retains_authorization_after_challenge=1 Authorization requires authentication and -u wasn't passed.
Modifions cela en créant un fichier :
/etc/polkit-1/rules.d/10-mount-system.rules
polkit.addRule (function (a,s) { if (a.id == 'org.freedesktop.udisks2.filesystem-mount-system' && s.user == 'tuxce') return polkit.Result.YES; });
Et là :
pkcheck --action-id org.freedesktop.udisks2.filesystem-mount-system --process $$ && echo Succès
Succès
On peut aussi permettre toutes les opérations udisks2 à un utilisateur sans authentification :
/etc/polkit-1/rules.d/10-mount.rules
polkit.addRule (function (a,s) { if (a.id.indexOf ('org.freedesktop.udisks2.') == 0 && s.user == 'tuxce') return polkit.Result.YES; });
Agent d'authentification
polkit a besoin d'un agent authentificateur, autrement dit une application se lançant lorsqu'il y a besoin de rentrer un mot de passe. Par défaut, polkit en fournit un en mode texte. Vous pouvez éventuellement avoir besoin d'installer un agent en mode graphique. Pour savoir si vous en avez besoin, exécutez :
pkexec ls
Si vous n'avez pas de fenêtre qui s'ouvre pour la demande de mot de passe, installez selon votre environnement (gtk/qt) l'un des paquets suivants : polkit-gnome (gtk) ou polkit-kdeAUR (qt). Il faut lancer au démarrage de votre session :
# pour gtk /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 # ou pour qt /usr/lib/polkit-kde-authentication-agent-1
Outils
Trois commandes sont fournies avec l'application :
-
pkaction
permet d'afficher les détails d'une action. -
pkcheck
permet de savoir si vous avez le droit d'utiliser une action.
Ces 2 commandes ont été vues dans les précédentes sections.
-
pkexec
est un peu spécial, c'est un genre de sudo, il permet d'exécuter un programme avec un autre utilisateur.
On va voir un exemple de configuration de commande, on va prendre comme exemple le lancement d'un terminal, et on va permettre à notre utilisateur de le lancer sous un autre identifiant sans demande de mot de passe.
Pour commencer, il faut définir une nouvelle action:
/etc/polkit-1/actions/fr.archlinux.wiki.example.pkexec.policy
<?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> <vendor>Archlinux.fr</vendor> <vendor_url>http://wiki.archlinux.fr/Policykit</vendor_url> <action id="fr.archlinux.wiki.example.pkexec.urxvt"> <description>Lance urxvt</description> <description xml:lang="en">Run urxvt</description> <message>L'authentification est requise pour lancer urxvt</message> <message xml:lang="en">Authentification is required to run urxvt</message> <icon_name>utilities-terminal</icon_name> <defaults> <allow_any>no</allow_any> <allow_inactive>no</allow_inactive> <allow_active>auth_admin</allow_active> </defaults> <annotate key="org.freedesktop.policykit.exec.path">/usr/bin/urxvt</annotate> </action> </policyconfig>
En dehors de ce qu'on a vu auparavant, on a rajouté la ligne:
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/urxvt</annotate>
Qui permet d'indiquer à pkexec
pour quelle commande cette application s'applique.
Si on lance:
pkexec urxvt
On a une demande d'authentification en tant qu'administrateur.
Ensuite, on modifie la réponse de cette action par rapport à notre utilisateur :
/etc/polkit-1/rules.d/10-pkexec-urxvt
polkit.addRule (function (a,s) { if (a.id == 'fr.archlinux.wiki.example.pkexec.urxvt' && s.user == 'tuxce') return polkit.Result.YES; });
Et voilà, tuxce peut maintenant lancer urxvt quel que soit l'utilisateur cible.
pkexec --user test urxvt
Il faut néanmoins donner le droit à test d'accéder à X (xhost +
).