CREATE USER ... IDENTIFIED WITH jwt не существует, и попытка выполнить его вызывает исключение. JWT-пользователи полностью управляются жизненным циклом токена.
Обзор
- Клиент передаёт подписанный JWT одним из поддерживаемых способов (через HTTP-заголовок
Authorization: Bearer, TCP собственный протокол или поле gRPCjwt). - ClickHouse проверяет подпись токена.
- Проверяются обязательные утверждения (
exp,iat,iss,sub,aud). - В памяти создаётся эфемерный пользователь с правами доступа, сформированными на основе утверждений токена
clickhouse:grantsиclickhouse:rolesи ограниченными верхней границей разрешений. - Когда срок действия токена истекает, пользователя удаляет фоновая задача сборки мусора.
Утверждения в токене
Обязательные утверждения
Утверждение
kid (идентификатор ключа) в заголовке также обязательно при использовании разрешения ключей на основе JWKS.
Другие распознаваемые утверждения
Необязательные утверждения
Пример токена, заголовка и полезной нагрузки
Поведение эфемерного пользователя
Идентификация и именование
iss, sub и aud. Этот UUID остается стабильным при разных входах в систему. Пользователь, который входит в систему несколько раз с разными токенами (но с тем же издателем, subject и аудиторией), всегда получает один и тот же UUID.
Однако имя пользователя непостоянно. Оно формируется следующим образом:
<claims_hash> — это хеш, вычисляемый на основе утверждений iss, sub и aud вместе с утверждениями clickhouse:roles и clickhouse:grants. Утверждения iss и aud участвуют только через этот хеш; они больше не включаются напрямую в видимый префикс имени пользователя. Благодаря этому имя остается компактным и читаемым, когда iss/aud — это длинные непрозрачные URL IdP (например, Microsoft Entra или Okta), при этом по-прежнему гарантируется, что разные кортежи (iss, sub, aud) и разные наборы clickhouse:roles / clickhouse:grants сопоставляются разным стабильным именам. Утверждения, которые не участвуют в вычислении хеша (например, iat, exp, nbf или несвязанные пользовательские утверждения), не изменяют имя пользователя.
Часть <claims_hash> изменяется всякий раз, когда изменяются утверждения clickhouse:roles или clickhouse:grants. Это означает, что токены с разными наборами ролей или привилегий будут давать разные имена пользователей даже для одной и той же учетной записи.
Права доступа
permission_limit — это набор прав доступа у эталонной роли или пользователя, заданных в качестве верхней границы. Права, запрашиваемые токеном сверх этого предела, отбрасываются без уведомления.
Актуальность токена
iat (время выдачи) у последнего аутентифицированного токена для каждой стабильной идентичности. Если предъявляется токен, у которого iat совпадает с сохранённым значением или меньше него, server повторно использует существующего эфемерного пользователя без повторной проверки утверждений. Это не позволяет более старым токенам снижать разрешения пользователя.
Срок жизни и сборка мусора
valid_until (который вычисляется из exp). Интервал запуска GC задаётся параметром gc_interval (по умолчанию — 5 минут).
Между запусками GC пользователи с истёкшим сроком действия могут по-прежнему отображаться в system.users, но аутентифицироваться уже не смогут.
Постоянные назначения прав доступа
Имя пользователя и UUID для заданной идентификационной сущности можно найти в столбцах
name и id таблицы system.users, пока пользователь активен.ALTER USER не работает напрямую с пользователями JWT, так как они доступны только в режиме только для чтения. Чтобы назначить профили настроек, квоты или политики, используйте команды ALTER SETTINGS PROFILE, ALTER QUOTA или ALTER ROW POLICY, как показано выше.
Отличия от обычных пользователей
Представления с SQL SECURITY DEFINER
SQL SECURITY DEFINER, сервер автоматически создаёт постоянную теневую копию пользователя, которая выступает в качестве определителя представления. Этот теневой пользователь:
- Имеет имя
<original_jwt_username>:definer - Имеет
NO_AUTHENTICATION(не может использоваться для входа) - Сохраняет те же права доступа, что и исходный JWT-пользователь на момент создания представления
Использование клиента
Передача токена напрямую
--jwt с clickhouse-client для аутентификации с помощью заранее полученного токена:
Флаг
--jwt нельзя использовать вместе с --user. Если указан --jwt, имя пользователя берётся из токена.HTTP-интерфейс
Authorization как Bearer-токен:
Вход по коду устройства OAuth2
clickhouse-client поддерживает интерактивный OAuth2-поток Device Code через флаг --login. Для конечных точек ClickHouse Cloud клиент автоматически выполняет обмен токенов, чтобы получить JWT для ClickHouse. Токены прозрачно обновляются в течение сеанса. При получении нового токена клиент автоматически переподключается.
Встроенный JWT-аутентификатор ClickHouse Cloud
clickhouse-client с параметром --login. Этот аутентификатор настроен следующим образом:
Для встроенного аутентификатора верхняя граница разрешений установлена на роль
default_role и пользователя default. Это означает, что итоговые права любого JWT-пользователя ограничиваются пересечением с привилегиями этих двух сущностей, поэтому токен никогда не сможет повысить привилегии сверх того, что разрешено default_role и default.
Чтобы использовать этот аутентификатор, ничего настраивать не нужно. Он создаётся автоматически при создании сервиса.
Включение JWT-аутентификации для сервиса
Межсерверное взаимодействие
Устранение неполадок
- Права доступа не предоставлены: У указанной роли или пользователя может не быть необходимых привилегий. Убедитесь, что роли, указанные в
clickhouse:roles, существуют и включают соответствующие привилегии. - Токен отклонён: Убедитесь, что
iss,audи алгоритм подписи в вашем токене соответствуют ожидаемым провайдером JWT. Если используется JWKS, убедитесь, чтоkidтокена соответствует ключу в наборе ключей провайдера. - Пользователь исчезает между запросами: Эфемерные пользователи удаляются после истечения срока действия токена. Для длительных сеансов используйте клиент, поддерживающий обновление токена (например, режим
--login). CREATE USER ... IDENTIFIED WITH jwtзавершается с ошибкой: Это ожидаемое поведение. Пользователей JWT нельзя создавать через DDL. Ими полностью управляет жизненный цикл токена.