Keycloak¶
Authentification unique, gestion des identités et contrôle d'accès basé sur les rôles.
| URL | https://identity.akko.local |
| Console d'administration | https://identity.akko.local/admin/ |
| Service Docker | keycloak |
Aperçu¶
Keycloak est le fournisseur d'identité de l'ensemble de la plateforme AKKO. Chaque service disposant d'une interface web s'authentifie via Keycloak en utilisant OAuth2 / OpenID Connect, offrant une expérience de connexion unifiée à travers tous les outils.
Fonctionnalités clés :
- Single Sign-On (SSO) -- connectez-vous une fois, accédez à tous les services
- Contrôle d'accès basé sur les rôles (RBAC) -- cinq rôles plateforme contrôlent ce que les utilisateurs peuvent voir et faire
- Export du realm -- la configuration complète est versionnée dans
keycloak/realm-akko.json - Protection contre la force brute -- activée par défaut (verrouillage après 5 tentatives échouées)
Realm : akko¶
Toute la configuration AKKO réside dans un seul realm Keycloak nommé akko. Le realm est importé automatiquement au premier démarrage depuis keycloak/realm-akko.json.
Paramètres clés du realm :
| Paramètre | Valeur |
|---|---|
| Nom du realm | akko |
| Nom d'affichage | AKKO |
| Thème de connexion | akko (personnalisé) |
| Algorithme de signature | RS256 |
| Durée de vie du jeton d'accès | 300 secondes (5 min) |
| Délai d'inactivité de session SSO | 1800 secondes (30 min) |
| Durée de vie maximale de session SSO | 36000 secondes (10 heures) |
| Inscription | Désactivée |
| Protection force brute | Activée (5 échecs, verrouillage de 5 min) |
Clients OAuth2¶
Le realm inclut 13 clients OAuth2 (10 services AKKO + 3 clients Keycloak internes exposés par défaut) :
| Client | Type | Service |
|---|---|---|
jupyterhub |
Confidentiel | Environnement de notebooks JupyterHub |
superset |
Confidentiel | Apache Superset BI |
airflow |
Confidentiel | Orchestration Apache Airflow |
grafana |
Confidentiel | Tableaux de bord Dashboards |
trino |
Confidentiel | Moteur SQL Trino |
polaris |
Confidentiel | Catalogue Apache Polaris |
openmetadata |
Confidentiel | Gouvernance OpenMetadata |
oauth2-proxy |
Confidentiel | OAuth2 Proxy (protège les services sans OAuth natif) |
minio |
Confidentiel | Console stockage objet |
svc-cockpit-admin |
Confidentiel | Compte de service Cockpit (API Admin Keycloak) |
account |
Public | Gestion de compte Keycloak (intégré) |
admin-cli |
Public | CLI d'administration Keycloak (intégré) |
realm-management |
Confidentiel | Gestion du realm Keycloak (intégré) |
Clients Keycloak supplémentaires
Keycloak embarque aussi account-console, broker et security-admin-console dans chaque realm pour sa propre UI d'admin. Ils ne sont pas comptés dans les « 13 clients » car ils sont internes à Keycloak et non consommés par les services AKKO.
Clients confidentiels vs publics
Les clients confidentiels utilisent un secret client pour le flux par code d'autorisation côté serveur. Les clients publics utilisent PKCE pour les flux navigateur. OpenMetadata nécessite spécifiquement un client confidentiel pour éviter les boucles de connexion avec les certificats auto-signés dans Safari.
Rôles RBAC¶
Cinq rôles à l'échelle de la plateforme contrôlent l'accès à travers tous les services :
| Rôle | Description | Accès typique |
|---|---|---|
akko-admin |
Administrateur de la plateforme | Accès complet à tous les services, consoles d'administration, opérations DDL |
akko-engineer |
Ingénieur de données | Spark, Airflow, Trino DDL, écriture notebook, gestion de pipelines |
akko-analyst |
Analyste de données | Notebooks, Superset, Trino en lecture seule, navigation dans le catalogue |
akko-user |
Utilisateur standard / conformité | Trino en lecture seule avec masquage PII, audit, navigation dans le catalogue |
akko-viewer |
Visualiseur de tableaux de bord | Tableaux de bord Superset (lecture seule), tableaux de bord Dashboards |
Rôle par défaut
Les nouveaux utilisateurs se voient automatiquement attribuer le rôle akko-analyst via le rôle composite default-roles-akko.
Pour la matrice d'accès complète (par service, par catalogue, masquage de colonnes, filtrage par lignes), voir le Guide d'administration RBAC.
Utilisateurs par défaut¶
Cinq utilisateurs de test sont pré-configurés dans le realm :
| Nom d'utilisateur | Rôle | Mot de passe | Description |
|---|---|---|---|
alice |
akko-admin |
alice123 (dev) |
Administratrice de la plateforme |
bob |
akko-engineer |
bob123 (dev) |
Ingénieur de données |
carol |
akko-analyst |
carol123 (dev) |
Analyste de données |
eve |
akko-user |
eve123 (dev) |
Utilisatrice standard |
dave |
akko-viewer |
dave123 (dev) |
Visualiseur de tableaux de bord |
emailVerified doit être true
Tous les utilisateurs doivent avoir emailVerified=true dans Keycloak. Le service oauth2-proxy rejette les utilisateurs sans email vérifié, provoquant des échecs de connexion pour JupyterHub et les autres services protégés par proxy.
Console d'administration¶
La console d'administration Keycloak est accessible à :
Les identifiants d'administration sont définis dans les valeurs Helm (global.auth.keycloakAdminPassword) et stockés dans le Secret Kubernetes akko-keycloak.
Depuis la console d'administration, vous pouvez :
- Gérer les utilisateurs (créer, désactiver, réinitialiser les mots de passe)
- Attribuer des rôles et des groupes
- Configurer les clients OAuth2
- Consulter les sessions actives
- Surveiller les événements de connexion et les erreurs
Ajouter un nouvel utilisateur¶
- Ouvrez la console d'administration à
https://identity.akko.local/admin/ - Sélectionnez le realm akko (menu déroulant en haut à gauche)
- Naviguez vers Users > Add user
- Remplissez :
- Nom d'utilisateur (obligatoire)
- Email (obligatoire)
- Prénom, Nom
- Basculez Email verified sur ON
- Cliquez sur Create
- Allez dans l'onglet Credentials et définissez un mot de passe
- Allez dans l'onglet Role mapping :
- Cliquez sur Assign role
- Filtrez par rôles du realm
- Sélectionnez le rôle approprié (
akko-admin,akko-engineer,akko-analystouakko-viewer)
Configuration persistante
Les modifications utilisateur effectuées dans la console d'administration sont stockées dans la base de données PostgreSQL de Keycloak et survivent aux redémarrages. Elles ne sont pas réécrites dans realm-akko.json. Pour exporter l'état actuel du realm :
Ajouter un nouveau client de service¶
Lors de l'ajout d'un nouveau service à AKKO nécessitant l'authentification Keycloak :
- Ouvrez la console d'administration et naviguez vers Clients > Create client
- Définissez le Client ID (par ex.
my-service) - Choisissez Client authentication = ON pour les clients confidentiels
- Configurez les Valid redirect URIs :
https://my-service.akko.local/* - Configurez les Web origins :
https://my-service.akko.local - Sauvegardez et copiez le secret client depuis l'onglet Credentials
- Ajoutez la configuration du client dans
keycloak/realm-akko.jsonpour le contrôle de version
Problèmes connus¶
KC_HOSTNAME, pas KC_HOSTNAME_URL
Keycloak 26.x utilise la configuration hostname v2. La variable d'environnement est KC_HOSTNAME (pas KC_HOSTNAME_URL, qui est v1 et silencieusement ignorée). Utilisez KC_HOSTNAME_BACKCHANNEL_DYNAMIC: false pour un émetteur (issuer) cohérent entre l'accès interne et externe.
L'import du realm se fait uniquement au premier démarrage
Le fichier realm-akko.json est importé lorsque la base de données Keycloak est vide (premier démarrage). Les modifications ultérieures du fichier JSON ne seront pas appliquées automatiquement. Réimportez manuellement ou effectuez les modifications via la console d'administration.
Persistance des mots de passe dans PostgreSQL
Keycloak stocke ses données dans PostgreSQL. Si vous régénérez le fichier .env avec de nouveaux mots de passe, l'ancien mot de passe administrateur Keycloak persiste dans la base de données. Vous devez soit :
- Réinitialiser via
ALTER USERdans PostgreSQL - Soit supprimer le volume Keycloak :
docker volume rm akko_keycloak-data