CREATE USER ... IDENTIFIED WITH jwt, e intentar hacerlo genera una excepción. Los usuarios JWT se gestionan por completo a través del ciclo de vida del token.
Descripción general
- Un cliente presenta un JWT firmado a través de uno de los mecanismos de transporte compatibles (el encabezado HTTP
Authorization: Bearer, el protocolo nativo TCP o el campojwtde gRPC). - ClickHouse valida la firma del token.
- Se verifican las claims obligatorias (
exp,iat,iss,sub,aud). - Se crea en memoria un usuario efímero con derechos de acceso derivados de las claims del token
clickhouse:grantsyclickhouse:roles, acotados por un límite de permisos. - Cuando el token caduca, una tarea de recolección de basura en segundo plano elimina al usuario.
Claims del token
Claims obligatorios
El claim
kid (ID de clave) del encabezado también es obligatorio cuando se usa la resolución de claves basada en JWKS.
El modo JWKS solo admite claves RSAMientras que los proveedores con clave estática aceptan
HS256, RS256 o ES256, los proveedores basados en JWKS solo aceptan JWK cuyo kty sea RSA (es decir, tokens firmados con RS256). Los tokens firmados con claves HMAC (HS256) o EC (ES256) no pueden verificarse con un endpoint de JWKS y se rechazarán.Otros claims reconocidos
Claims opcionales
Ejemplo de encabezado y carga útil de un token
Comportamiento de los usuarios efímeros
Identidad y nombres
iss, sub y aud. Este UUID es estable entre inicios de sesión. Un usuario que inicia sesión varias veces con distintos tokens (pero con el mismo emisor, sujeto y audiencia) siempre obtiene el mismo UUID.
Sin embargo, el nombre de usuario es volátil. Se construye así:
<claims_hash> cambia cada vez que cambian las claims clickhouse:roles o clickhouse:grants. Esto significa que los tokens con distintos conjuntos de roles o permisos generan nombres de usuario diferentes incluso para la misma identidad.
Permisos de acceso
permission_limit es el conjunto de derechos de acceso de un rol o usuario de referencia configurado como límite superior. Los derechos solicitados por el token que superen ese límite se descartan silenciosamente.
Vigencia del token
iat (issued-at) del token autenticado más reciente para cada identidad estable. Si se presenta un token con un iat igual o anterior al valor almacenado, el server reutiliza el usuario efímero existente sin volver a evaluar las claims. Esto evita que tokens más antiguos reduzcan los permisos de un usuario.
Tiempo de vida y recolección de basura
valid_until (derivado de exp). El intervalo de GC se controla mediante el parámetro gc_interval (valor predeterminado: 5 minutos).
Entre una ejecución de GC y la siguiente, es posible que los usuarios expirados sigan apareciendo en system.users, pero ya no podrán autenticarse.
Asignaciones persistentes de acceso
El nombre de usuario y el UUID de una identidad determinada pueden encontrarse en las columnas
name e id de system.users mientras el usuario esté activo.ALTER USER no funciona directamente con los usuarios JWT, ya que son de solo lectura. Para asignar perfiles de configuración, quotas o políticas, usa las sentencias ALTER SETTINGS PROFILE, ALTER QUOTA o ALTER ROW POLICY, como se muestra arriba.
Diferencias con los usuarios normales
Vistas con SQL SECURITY DEFINER
SQL SECURITY DEFINER, el servidor crea automáticamente una copia persistente de sombra del usuario para que actúe como definidor de la vista. Este usuario de sombra:
- Tiene el nombre
<original_jwt_username>:definer - Tiene
NO_AUTHENTICATION(no se puede usar para iniciar sesión) - Conserva los mismos derechos de acceso que el usuario JWT original en el momento en que se creó la vista
Uso del cliente
Pasar un token directamente
--jwt con clickhouse-client para autenticarse con un token obtenido previamente:
La opción
--jwt es mutuamente excluyente con --user. Cuando se especifica --jwt, el nombre de usuario se obtiene a partir del token.Interfaz HTTP
Authorization:
Inicio de sesión con código de dispositivo de OAuth2
clickhouse-client admite un flujo interactivo de código de dispositivo de OAuth2 mediante la opción --login. En los endpoints de ClickHouse Cloud, el cliente realiza automáticamente el intercambio de tokens para obtener un JWT específico de ClickHouse. Los tokens se renuevan de forma transparente durante la sesión. Cuando se obtiene un token nuevo, el cliente se reconecta automáticamente.
Autenticador JWT integrado de ClickHouse Cloud
--login de clickhouse-client. Este autenticador está configurado con:
El autenticador integrado tiene como límite de permisos el rol
default_role y el usuario default. Esto significa que los permisos efectivos de cualquier usuario JWT quedan limitados a la intersección de los grants de esas dos entidades, por lo que un token nunca puede elevar privilegios más allá de lo que default_role y default tienen permitido hacer.
No necesitas configurar nada para usar este autenticador. Se aprovisiona automáticamente cuando se crea el servicio.
Comunicación entre servidores
Solución de problemas
- No se han concedido permisos de acceso: Es posible que el rol o usuario al que se hace referencia no tenga los grants necesarios. Asegúrese de que los roles mencionados en
clickhouse:rolesexistan e incluyan los grants adecuados. - Token rechazado: Verifique que
iss,audy el algoritmo de firma de su token coincidan con lo que espera el proveedor de JWT. Si se usa JWKS, asegúrese de que elkiddel token coincida con una clave del conjunto de claves del proveedor. - El usuario desaparece entre consultas: Los usuarios efímeros se eliminan cuando vence el token. Use un cliente que admita la renovación del token (por ejemplo, el modo
--login) para sesiones de larga duración. CREATE USER ... IDENTIFIED WITH jwtfalla: Esto es normal. Los usuarios JWT no pueden crearse mediante DDL. Su gestión depende por completo del ciclo de vida del token.