Utilisateurs et rôles

difuzio distingue deux notions :

  • un utilisateur (users) : un compte avec une adresse email, capable de se connecter à l'interface web et de détenir des rôles. Les administrateurs et les propriétaires de listes sont des utilisateurs.
  • un abonné (members) : une adresse inscrite à une liste donnée. Un abonné n'a pas nécessairement de compte utilisateur.

Cette page traite des utilisateurs et de leurs rôles. Pour les abonnés, voir Listes et la documentation utilisateur.

États d'un utilisateur

users.status vaut :

  • active : compte utilisable.
  • disabled : compte désactivé.
  • unverified : compte créé mais email non vérifié.

Le modèle de rôles (RBAC)

Quatre rôles, du plus large au plus restreint :

  • super_admin : contrôle global de l'instance (tous les domaines, toutes les listes, tous les réglages).
  • domain_admin : administre un ou plusieurs domaines (leurs listes, abonnés, modérateurs).
  • list_owner : propriétaire d'une ou plusieurs listes (réglages, abonnés, modération de ces listes).
  • moderator : modère une ou plusieurs listes (file de modération des posts et des abonnements), sans accès aux réglages.

Un même utilisateur peut cumuler plusieurs rôles, sur des périmètres différents (par exemple domain_admin sur un domaine et list_owner sur une liste d'un autre domaine).

Périmètre et isolation

Chaque rôle est attaché à un périmètre (l'instance, un domaine, ou une liste). À chaque requête, difuzio reconstruit le Principal de l'utilisateur à partir de ses rôles en base : une révocation prend donc effet immédiatement, sans attendre l'expiration d'une session.

Un acteur qui tente d'accéder à une ressource hors de son périmètre reçoit une réponse 404 Not Found (et non 403 Forbidden) : l'existence même de la ressource n'est pas révélée.

Créer le premier super_admin

CREDENTIALS_DIRECTORY=/etc/difuzio/secrets difuzio bootstrap-admin --config /etc/difuzio/config.yaml \
    --email vous@example.org --password-stdin

Le mot de passe est lu sur l'entrée standard (--password-stdin), ce qui évite de le laisser dans l'historique du shell. Si un super_admin existe déjà, la commande refuse ; --force permet d'en créer un autre. La page web /setup est un repli atomique tant qu'aucun super_admin n'existe.

Ajouter un administrateur de domaine

CREDENTIALS_DIRECTORY=/etc/difuzio/secrets difuzio add-admin --config /etc/difuzio/config.yaml \
    --email admin@example.org \
    --domain lists.example.org \
    --display-name "Admin Example" \
    --password-stdin

La commande crée l'utilisateur s'il n'existe pas, puis lui octroie le rôle domain_admin sur le domaine indiqué. Le mot de passe initial est optionnel (--password ou --password-stdin) ; sans mot de passe, le compte existe mais ne peut pas encore se connecter (poser un mot de passe ensuite avec reset-password).

Désigner un propriétaire de liste

Le rôle list_owner est octroyé à la création de la liste, via l'option --owner de create-list (voir Listes). Le propriétaire désigné doit déjà exister comme utilisateur actif.

Réinitialiser un mot de passe

CREDENTIALS_DIRECTORY=/etc/difuzio/secrets difuzio reset-password --config /etc/difuzio/config.yaml \
    --email utilisateur@example.org --password-stdin

Pose un nouveau mot de passe pour un utilisateur existant. Les mots de passe sont hachés avec argon2id ; un mécanisme de verrouillage protège contre le bourrage d'identifiants à la connexion.

Octroyer ou révoquer un rôle

Au-delà de add-admin (domain_admin) et create-list (list_owner initial), tout rôle s'octroie ou se révoque avec grant-role / revoke-role :

difuzio grant-role  --email u@example.org --role moderator \
    --domain lists.example.org --list announce
difuzio revoke-role --email u@example.org --role moderator \
    --domain lists.example.org --list announce

--role vaut super_admin, domain_admin, list_owner ou moderator. --domain est requis pour domain_admin/list_owner/moderator ; --list pour list_owner/moderator. L'utilisateur doit déjà exister. Le plafond d'octroi est re-vérifié (un domain_admin ne peut pas octroyer super_admin).

Note : l'octroi de rôle n'est volontairement PAS accessible via une clé d'API (seulement par session interactive ou CLI), pour empêcher une escalade latérale par une perm manage.

Clés d'API

Les automatisations s'authentifient par clé d'API plutôt que par session. Une clé est liée à un utilisateur, porte un périmètre (utilisateur, domaine ou liste) et un jeu de permissions. Voir API REST.