CREATE USER ... IDENTIFIED WITH jwt не существует, и попытка выполнить его вызывает исключение. JWT-пользователи полностью управляются жизненным циклом токена.
Обзор
- Клиент передаёт подписанный JWT одним из поддерживаемых способов (через HTTP-заголовок
Authorization: Bearer, TCP собственный протокол или поле gRPCjwt). - ClickHouse проверяет подпись токена.
- Проверяются обязательные утверждения (
exp,iat,iss,sub,aud). - В памяти создаётся эфемерный пользователь с правами доступа, сформированными на основе утверждений токена
clickhouse:grantsиclickhouse:rolesи ограниченными верхней границей разрешений. - Когда срок действия токена истекает, пользователя удаляет фоновая задача сборки мусора.
Утверждения в токене
Обязательные утверждения
Утверждение
kid (идентификатор ключа) в заголовке также обязательно при использовании разрешения ключей на основе JWKS.
Режим JWKS поддерживает только ключи RSAХотя провайдеры со статическими ключами принимают любой из алгоритмов
HS256, RS256 или ES256, провайдеры на основе JWKS принимают только JWK, у которых kty равно RSA (то есть токены, подписанные с помощью RS256). Токены, подписанные ключами HMAC (HS256) или EC (ES256), не могут быть проверены через конечную точку JWKS и будут отклонены.Другие распознаваемые утверждения
Необязательные утверждения
Пример токена, заголовка и полезной нагрузки
Поведение эфемерного пользователя
Идентификация и именование
iss, sub и aud. Этот UUID остается стабильным при разных входах в систему. Пользователь, который входит в систему несколько раз с разными токенами (но с тем же издателем, субъектом и аудиторией), всегда получает один и тот же UUID.
Однако имя пользователя непостоянно. Оно формируется следующим образом:
<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.
Чтобы использовать этот аутентификатор, ничего настраивать не нужно. Он создаётся автоматически при создании сервиса.
Межсерверное взаимодействие
Устранение неполадок
- Права доступа не предоставлены: У указанной роли или пользователя может не быть необходимых привилегий. Убедитесь, что роли, указанные в
clickhouse:roles, существуют и включают соответствующие привилегии. - Токен отклонён: Убедитесь, что
iss,audи алгоритм подписи в вашем токене соответствуют ожидаемым провайдером JWT. Если используется JWKS, убедитесь, чтоkidтокена соответствует ключу в наборе ключей провайдера. - Пользователь исчезает между запросами: Эфемерные пользователи удаляются после истечения срока действия токена. Для длительных сеансов используйте клиент, поддерживающий обновление токена (например, режим
--login). CREATE USER ... IDENTIFIED WITH jwtзавершается с ошибкой: Это ожидаемое поведение. Пользователей JWT нельзя создавать через DDL. Ими полностью управляет жизненный цикл токена.