# Polkit (Français)

From ArchWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Related articles

- Session
- Sudo
- Users and groups

Cet article ou section a besoin d'être traduit(e).

Notes: Vérifier liens/pages à importer. (Discuss in Talk: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`.

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

## 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 :

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

Category:

- Security (Français)

Hidden category:

- Pages or sections flagged with Template:Translateme