CREATE USER ... IDENTIFIED WITH jwt, e tentar executá-la gera uma exceção. Os usuários JWT são totalmente gerenciados pelo ciclo de vida do token.
Visão geral
- Um cliente apresenta um JWT assinado por meio de um dos mecanismos de transporte compatíveis (cabeçalho HTTP
Authorization: Bearer, o protocolo nativo TCP ou o campo gRPCjwt). - O ClickHouse valida a assinatura do token.
- As claims obrigatórias (
exp,iat,iss,sub,aud) são verificadas. - Um usuário efêmero é criado na memória com direitos de acesso derivados das claims do token
clickhouse:grantseclickhouse:roles, em interseção com um limite de permissões. - Quando o token expira, uma tarefa de coleta de lixo em segundo plano remove o usuário.
Claims do token
Claims obrigatórias
A claim
kid (ID da chave) do cabeçalho também é obrigatória quando a resolução de chaves baseada em JWKS é usada.
O modo JWKS oferece suporte apenas a chaves RSAEnquanto provedores com chave estática aceitam
HS256, RS256 ou ES256, provedores baseados em JWKS aceitam apenas JWKs cujo kty é RSA (ou seja, tokens assinados com RS256). Tokens assinados com chaves HMAC (HS256) ou EC (ES256) não podem ser verificados em um endpoint JWKS e serão rejeitados.Outras claims reconhecidas
Claims opcionais
Exemplo de cabeçalho e payload do token
Comportamento de usuário efêmero
Identidade e nomenclatura
iss, sub e aud. Esse UUID é estável entre logins. Um usuário que faz login várias vezes com tokens diferentes (mas com o mesmo emissor, sujeito e audiência) sempre recebe o mesmo UUID.
O nome de usuário, no entanto, é volátil. Ele é construído da seguinte forma:
<claims_hash> muda sempre que as claims clickhouse:roles ou clickhouse:grants são alteradas. Isso significa que tokens com diferentes conjuntos de roles ou grants geram nomes de usuário diferentes, mesmo quando a identidade é a mesma.
Direitos de acesso
permission_limit representa o conjunto de direitos de acesso de uma role ou usuário de referência configurado como limite superior. Os direitos solicitados pelo token que excederem esse limite são descartados silenciosamente.
Recência do token
iat (issued-at) do token autenticado mais recentemente para cada identidade estável. Se for apresentado um token com iat igual ou anterior ao valor armazenado, o servidor reutiliza o usuário efêmero existente sem reavaliar as claims. Isso impede que tokens mais antigos reduzam as permissões do usuário.
Tempo de vida e coleta de lixo
valid_until (derivado de exp) expirar. O intervalo de GC é controlado pelo parâmetro gc_interval (padrão: 5 minutos).
Entre as execuções do GC, usuários expirados ainda podem aparecer em system.users, mas não podem mais se autenticar.
Atribuições persistentes de acesso
O nome de usuário e o UUID de uma determinada identidade podem ser encontrados nas colunas
name e id de system.users enquanto o usuário estiver ativo.ALTER USER não funciona diretamente com usuários JWT, pois eles são somente leitura. Para atribuir perfis de configurações, quotas ou políticas, use as instruções ALTER SETTINGS PROFILE, ALTER QUOTA ou ALTER ROW POLICY, como mostrado acima.
Diferenças em relação aos usuários regulares
Views com SQL SECURITY DEFINER
SQL SECURITY DEFINER, o servidor cria automaticamente uma cópia sombra persistente desse usuário para servir como definidor da view. Esse usuário sombra:
- Tem o nome
<original_jwt_username>:definer - Tem
NO_AUTHENTICATION(não pode ser usado para fazer login) - Mantém os mesmos direitos de acesso do usuário JWT original no momento em que a view foi criada
Uso do cliente
Informando um token diretamente
--jwt com o clickhouse-client para autenticar usando um token obtido previamente:
A flag
--jwt é incompatível com --user. Quando --jwt é especificada, o nome de usuário é derivado do token.interface HTTP
Authorization:
Login OAuth2 com código do dispositivo
clickhouse-client oferece suporte a um fluxo interativo de código do dispositivo OAuth2 por meio da flag --login. Para endpoints do ClickHouse Cloud, o cliente faz automaticamente a troca de token para obter um JWT específico do ClickHouse. Os tokens são atualizados de forma transparente durante a sessão. Quando um novo token é obtido, o cliente se reconecta automaticamente.
Autenticador JWT integrado do ClickHouse Cloud
--login do clickhouse-client. Esse autenticador é configurado com:
O autenticador integrado tem um limite de permissões definido para a role
default_role e para o usuário default. Isso significa que as permissões efetivas de qualquer usuário JWT ficam restritas à interseção com os grants dessas duas entidades, portanto um token nunca pode elevar privilégios além do que default_role e default têm permissão para fazer.
Você não precisa configurar nada para usar esse autenticador. Ele é provisionado automaticamente quando o serviço é criado.
Comunicação entre servidores
Solução de problemas
- Nenhum direito de acesso concedido: A role ou o usuário referenciado pode não ter os privilégios necessários. Verifique se as roles referenciadas em
clickhouse:rolesexistem e incluem os privilégios apropriados. - Token rejeitado: Verifique se
iss,aude o algoritmo de assinatura do seu token correspondem ao que o provedor JWT espera. Se JWKS estiver em uso, verifique se okiddo token corresponde a uma chave no conjunto de chaves do provedor. - O usuário desaparece entre queries: Usuários efêmeros são removidos após a expiração do token. Use um cliente com suporte à renovação do token (por exemplo, no modo
--login) para sessões de longa duração. CREATE USER ... IDENTIFIED WITH jwtfalha: Isso é esperado. Usuários JWT não podem ser criados via DDL. Eles são gerenciados inteiramente pelo ciclo de vida do token.