CREATE USER ... IDENTIFIED WITH jwt, et toute tentative en ce sens provoque une exception. Les utilisateurs JWT sont entièrement gérés par le cycle de vie du jeton.
Vue d’ensemble
- Un client présente un JWT signé via l’un des mécanismes de transport pris en charge (en-tête HTTP
Authorization: Bearer, protocole natif TCP ou champ gRPCjwt). - ClickHouse valide la signature du jeton.
- Les claims obligatoires (
exp,iat,iss,sub,aud) sont vérifiés. - Un utilisateur éphémère est créé en mémoire avec des droits d’accès dérivés des claims de jeton
clickhouse:grantsetclickhouse:roles, recoupés avec une limite d’autorisations. - Lorsque le jeton expire, une tâche de garbage collection en arrière-plan supprime l’utilisateur.
Claim du jeton
Claims obligatoires
Le claim d’en-tête
kid (ID de clé) est également requis lorsque la résolution de clés basée sur JWKS est utilisée.
Le mode JWKS prend uniquement en charge les clés RSAAlors que les fournisseurs à clé statique acceptent
HS256, RS256 ou ES256, les fournisseurs basés sur JWKS n’acceptent que les JWK dont le kty est RSA (c.-à-d. les jetons signés avec RS256). Les jetons signés avec des clés HMAC (HS256) ou EC (ES256) ne peuvent pas être vérifiés via un endpoint JWKS et seront rejetés.Autres claims reconnues
Claims facultatifs
Exemple de jeton, d’en-tête et de charge utile
Comportement des utilisateurs éphémères
Identité et nommage
iss, sub et aud. Cet UUID est stable d’une connexion à l’autre. Un utilisateur qui se connecte plusieurs fois avec des jetons différents (mais avec le même émetteur, le même sujet et la même audience) obtient toujours le même UUID.
Le username, en revanche, est volatile. Il est construit comme suit :
<claims_hash> change chaque fois que les claims clickhouse:roles ou clickhouse:grants changent. Cela signifie que des tokens avec des ensembles de rôles ou de grants différents produisent des noms d’utilisateur différents, même pour la même identité.
Droits d’accès
permission_limit correspond à l’ensemble des droits d’accès détenus par un rôle ou un utilisateur de référence, configuré comme limite supérieure. Les droits demandés par le jeton qui dépassent cette limite sont silencieusement supprimés.
Fraîcheur du jeton
iat (issued-at) du jeton authentifié le plus récemment pour chaque identité stable. Si un jeton dont le iat est identique à la valeur enregistrée ou lui est antérieur est présenté, le serveur réutilise l’utilisateur éphémère existant sans réévaluer les claims. Cela empêche d’anciens jetons de réduire les autorisations d’un utilisateur.
Durée de vie et garbage collection
valid_until (dérivé de exp) dépassé. L’intervalle du GC est défini par le paramètre gc_interval (par défaut : 5 minutes).
Entre deux exécutions du GC, les utilisateurs expirés peuvent encore apparaître dans system.users, mais ne peuvent plus s’authentifier.
Attributions d’accès persistantes
Le nom d’utilisateur et l’UUID d’une identité donnée se trouvent dans les colonnes
name et id de system.users tant que l’utilisateur est actif.ALTER USER ne fonctionne pas directement sur les utilisateurs JWT, car ils sont en lecture seule. Pour attribuer des profils de paramètres, des quotas ou des politiques, utilisez les instructions ALTER SETTINGS PROFILE, ALTER QUOTA ou ALTER ROW POLICY comme indiqué ci-dessus.
Différences avec les utilisateurs classiques
Vues avec SQL SECURITY DEFINER
SQL SECURITY DEFINER, le serveur crée automatiquement une copie fantôme permanente de l’utilisateur pour faire office de définisseur de la vue. Cet utilisateur fantôme :
- A pour nom
<original_jwt_username>:definer - A
NO_AUTHENTICATION(ne peut pas être utilisé pour se connecter) - Conserve les mêmes droits d’accès que l’utilisateur JWT d’origine au moment de la création de la vue
Utilisation du client
Passer directement un jeton
--jwt avec clickhouse-client pour vous authentifier à l’aide d’un jeton obtenu au préalable :
Les options
--jwt et --user sont mutuellement exclusives. Lorsque --jwt est spécifié, le nom d’utilisateur est déduit du jeton.Interface HTTP
Authorization :
Connexion OAuth2 par code d’appareil
clickhouse-client prend en charge un flux interactif de code d’appareil OAuth2 via l’option --login. Pour les endpoints ClickHouse Cloud, le client effectue automatiquement un échange de jeton afin d’obtenir un JWT spécifique à ClickHouse. Les jetons sont renouvelés de manière transparente pendant la session. Lorsqu’un nouveau jeton est obtenu, le client se reconnecte automatiquement.
Authentificateur JWT intégré à ClickHouse Cloud
--login de clickhouse-client. Cet authentificateur est configuré comme suit :
L’authentificateur intégré a une limite d’autorisations définie sur le rôle
default_role et l’utilisateur default. Cela signifie que les droits effectifs de tout utilisateur JWT résultent de l’intersection avec les grants accordés à ces deux entités : un token ne peut donc jamais obtenir plus de privilèges que ce que default_role et default sont autorisés à faire.
Vous n’avez rien à configurer pour utiliser cet authentificateur. Il est provisionné automatiquement lors de la création du service.
Communication interserveur
Dépannage
- Aucun droit d’accès accordé : Le rôle ou l’utilisateur référencé peut ne pas avoir les grants requis. Assurez-vous que les rôles référencés dans
clickhouse:rolesexistent et incluent les grants appropriés. - Jeton rejeté : Vérifiez que
iss,audet l’algorithme de signature de votre jeton correspondent à ce qu’attend le fournisseur JWT. Si JWKS est utilisé, assurez-vous que lekiddu jeton correspond à une clé du jeu de clés du fournisseur. - L’utilisateur disparaît entre les requêtes : Les utilisateurs éphémères sont supprimés après l’expiration du jeton. Utilisez un client prenant en charge le renouvellement du jeton (par exemple, le mode
--login) pour les sessions de longue durée. CREATE USER ... IDENTIFIED WITH jwtéchoue : C’est normal. Les utilisateurs JWT ne peuvent pas être créés via DDL. Leur gestion repose entièrement sur le cycle de vie du jeton.