Polkit (Français)

From ArchWiki
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.

Tango-preferences-desktop-locale.pngCet article ou section a besoin d'être traduit(e).Tango-preferences-desktop-locale.png

Notes: Réécriture en cours, reste à traduire les sections Configuration, Exemples et Voir aussi. (Discuss in Talk:Polkit (Français)#)

Traduit de la page d'accueil de polkit :

polkit est une boîte à outils au niveau application pour définir et gérer la politique qui permet aux processus non privilégiés de parler aux processus privilégiés : Il s'agit d'un cadre permettant de centraliser le processus de prise de décision concernant l'octroi de l'accès aux opérations privilégiées pour les applications non privilégiées.

Polkit est utilisé pour contrôler les privilèges à l'échelle du système. Il fournit un moyen organisé pour les processus non privilégiés de communiquer avec les processus privilégiés. Contrairement à des systèmes tels que sudo, il n'accorde pas l'autorisation root à un processus entier, mais permet plutôt un niveau de contrôle plus fin de la politique système centralisée.

Polkit fonctionne en délimitant des actions distinctes, par exemple l'exécution de GParted, et en délimitant les utilisateurs par groupe ou par nom, par exemple les membres du groupe wheel. Il définit ensuite comment - le cas échéant - ces utilisateurs sont autorisés à effectuer ces actions, par exemple en s'identifiant comme membres du groupe en tapant leur mot de passe.

Installation

Installez le paquet polkit.

Agents d'authentification

Un agent d'authentification est utilisé pour que l'utilisateur d'une session prouve qu'il est bien l'utilisateur (en s'authentifiant en tant qu'utilisateur) ou un utilisateur administratif (en s'authentifiant en tant qu'administrateur). Le paquet polkit contient un agent d'authentification textuel appelé 'pkttyagent', qui est utilisé comme solution de repli générale.

Si vous utilisez un environnement graphique, assurez-vous qu'un agent d'authentification graphique est installé et démarré automatiquement à la connexion.

Cinnamon, Deepin, GNOME, GNOME Flashback, KDE, LXDE, LXQt, MATE, theShell et Xfce ont déjà un agent d'authentification. Dans les autres environnements de bureau, vous devez choisir l'une des implémentations suivantes :

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