DRAFT — Preliminary version, do not share. · Version préliminaire, ne pas partager.

Rôles et autorisations

Fundamentum utilise un contrôle d'accès basé sur les rôles : un rôle est un ensemble d'autorisations, et vous l'accordez à une personne ou à un compte de service sur un projet, une licence ou un site précis. Les personnes obtiennent des rôles au moyen d'invitations par e-mail ; les machines les obtiennent au moyen de comptes de service.

Avant de commencer

Fonctionnement

User or service account ── holds ──▶ Role ── granted on ──▶ one item: a project, a license, a site
                                      │
                                   bundles
                                      ▼
                     Permission = action + container + scope

Une seule correspondance suffit : un gestionnaire de licence et un gestionnaire de projet peuvent tous deux gérer les utilisateurs d'un même site, chacun depuis son propre niveau.

1. Choisir un rôle

Ces rôles sont fournis avec chaque installation :

Rôle Accordé sur Permet de
project_viewer Un projet Lire le projet, ses appareils, ses sites et ses alertes. Gérer ses propres rapports
project_manager Un projet Tout ce que permet project_viewer, plus créer et modifier des appareils, des sites, des licences et des rapports, et gérer les utilisateurs
devices_manager Un projet Tout sur les appareils, et gérer les notificateurs d'alertes
devices_viewer Un projet Lire les appareils et les alertes
insight_manager Un projet Tout sur Insight et ses utilisateurs
function_manager Un projet Tout sur les fonctions cloud, y compris le téléversement, l'invocation et la surveillance
functions_invoker Un projet Exécuter et surveiller les fonctions cloud, sans les modifier
license_manager Une licence Lire et modifier la licence, et gérer les utilisateurs de celle-ci et de ses sites
license_viewer Une licence Consulter la licence
insight_user_manager Une licence Gérer les utilisateurs Insight de cette licence
container_admin L'organisation Tout, y compris les organisations, les projets, Insight et les fonctions
global_viewer L'organisation Tout lire, ne rien modifier
global_functions_manager L'organisation Tout sur les fonctions cloud, dans chaque projet

Les ID de rôle dépendent de l'environnement. Pour les trouver, listez les conteneurs, puis les rôles de celui sur lequel vous accordez l'accès (project, license ou location pour les sites) :

fun api v2 authorization-containers list-containers --project-id <project-id>
fun api v2 authorization-container-roles list-container-roles --project-id <project-id> --container-id <container-id>

2. Inviter un utilisateur

Dans Connect, ouvrez Users, sélectionnez New User, puis choisissez le rôle, le nom, l'e-mail et un message facultatif. Vous pouvez aussi utiliser l'API. Pour un projet, container_item_id est l'ID du projet :

fun api v2 projects-users-invitations create-invitation --project-id <project-id> --body '{
  "name": "Alex Martin",
  "email": "alex.martin@example.com",
  "role_id": <role-id>,
  "container_item_id": <project-id>,
  "options": {},
  "redirect_url": "https://hub.example.com/",
  "custom_message": "Welcome to the fleet project."
}'

Une invitation est en attente (pending) jusqu'à ce que l'utilisateur la termine, puis terminée (completed) une fois le rôle attribué. Elle se termine immédiatement lorsque l'utilisateur possède déjà un compte fonctionnel, détient déjà ce rôle sur cet élément, ou s'est invité lui-même. Une invitation porte un seul rôle : invitez de nouveau la même personne pour chaque rôle supplémentaire. Pour les licences et les sites, consultez Licences.

3. Examiner et révoquer les accès

fun api v2 projects-users-invitations list-invitations --project-id <project-id>
fun api v2 projects-users-invitations delete-invitation --project-id <project-id> --invitation-id <invitation-id>

La suppression d'une invitation terminée retire le rôle. Une invitation en attente peut encore être modifiée avec update-invitation.

4. Créer un compte de service pour l'automatisation

Un compte de service est une identité non humaine destinée à vos scripts, à vos pipelines CI et à vos intégrations. Il appartient à un seul projet.

# Create it
fun api v2 service-accounts create-service-account --project-id <project-id> --body '{"name": "ci-deployer"}'

# Grant it a project role
fun api v2 service-accounts create-service-account-role --project-id <project-id> \
  --service-account-id <service-account-id> --body '{"role_id": <role-id>}'

# Issue a token
fun api v2 service-accounts create-service-account-token --project-id <project-id> \
  --service-account-id <service-account-id> --body '{"name": "pipeline"}'

Le jeton se trouve dans accessToken, et il n'est affiché qu'une seule fois : conservez-le dans votre gestionnaire de secrets. Utilisez-le sous la forme Authorization: Bearer $TOKEN, ou avec la CLI au moyen de ses variables d'environnement (consultez La CLI fun). Supprimez un jeton compromis ou inutilisé avec delete-service-account-token.

Accordez le rôle le plus restreint qui permet de faire le travail, par exemple functions_invoker pour un pipeline qui ne fait qu'exécuter des fonctions.

5. Définir vos propres conteneurs (avancé)

Un projet peut sécuriser ses propres ressources en définissant des conteneurs. Un nouveau conteneur reçoit automatiquement list, show, store, update et delete. Ajoutez vous-même les autres actions, comme manage-users :

fun api v2 authorization-containers create-container --project-id <project-id> \
  --body '{"slug": "project-<project-id>-parking-gates", "name": "Parking gates"}'
fun api v2 authorization-container-actions create-container-action --project-id <project-id> --container-id <container-id> \
  --body '{"name": "open", "label": "Open gate", "short_label": "Open gate (All)", "scope": "global"}'

Accordez ensuite les actions à un rôle dans Connect. Vos applications les vérifient au moyen de fun api v2 users introspect-user, qui renvoie l'appelant avec ses rôles et ses autorisations.

Prochaines étapes