polkit

De ArchwikiFR


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.

Astuce: N'hésitez pas à lire la page de manuel polkit (8) pour des informations plus à jour et plus complètes.

Sommaire

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 que auth_self_keep mais en demandant l'authentification d'un administrateur.
Astuce: Le terme administrateur désigne un utilisateur ou groupe défini dans les règles. Par défaut, le 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 :

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 :

Fichier: /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 :

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 :

Fichier: /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-kde (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/kde4/libexec/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:

Fichier: /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 :

Fichier: /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 +).

Outils personnels
Autres langues