CREATE USER
Создаёт учётные записи пользователей.
Синтаксис:
Предложение ON CLUSTER позволяет создавать пользователей на кластере, см. Распределённый DDL.
Идентификация
Существует несколько способов идентификации пользователя:
IDENTIFIED WITH no_passwordIDENTIFIED WITH plaintext_password BY 'qwerty'IDENTIFIED WITH sha256_password BY 'qwerty'илиIDENTIFIED BY 'password'IDENTIFIED WITH sha256_hash BY 'hash'илиIDENTIFIED WITH sha256_hash BY 'hash' SALT 'salt'IDENTIFIED WITH double_sha1_password BY 'qwerty'IDENTIFIED WITH double_sha1_hash BY 'hash'IDENTIFIED WITH bcrypt_password BY 'qwerty'IDENTIFIED WITH bcrypt_hash BY 'hash'IDENTIFIED WITH ldap SERVER 'server_name'IDENTIFIED WITH kerberosилиIDENTIFIED WITH kerberos REALM 'realm'IDENTIFIED WITH ssl_certificate CN 'mysite.com:user'IDENTIFIED WITH ssh_key BY KEY 'public_key' TYPE 'ssh-rsa', KEY 'another_public_key' TYPE 'ssh-ed25519'IDENTIFIED WITH http SERVER 'http_server'илиIDENTIFIED WITH http SERVER 'http_server' SCHEME 'basic'IDENTIFIED BY 'qwerty'
Требования к сложности паролей можно изменить в config.xml. Ниже приведён пример конфигурации, который требует, чтобы пароли были длиной не менее 12 символов и содержали как минимум 1 цифру. Для каждого правила сложности пароля задаются регулярное выражение, по которому проверяются пароли, и описание правила.
По умолчанию в ClickHouse Cloud пароли должны соответствовать следующим требованиям к сложности:
- Иметь длину не менее 12 символов
- Содержать как минимум 1 цифру
- Содержать как минимум 1 заглавную букву
- Содержать как минимум 1 строчную букву
- Содержать как минимум 1 специальный символ
Примеры
-
Следующее имя пользователя —
name1, и для него не требуется пароль — что, очевидно, практически не обеспечивает безопасность: -
Чтобы указать пароль в виде открытого текста:
СоветПароль сохраняется в SQL-файле в
/var/lib/clickhouse/access, поэтому использованиеplaintext_password— не лучшая идея. Вместо этого используйтеsha256_password, как показано ниже... -
Наиболее распространённый вариант — использовать пароль, хэшированный с помощью SHA-256. ClickHouse вычислит хэш пароля за вас, когда вы укажете
IDENTIFIED WITH sha256_password. Например:Пользователь
name3теперь может входить, используяmy_password, но пароль хранится в виде хэшированного значения, приведённого выше. В/var/lib/clickhouse/accessбыл создан следующий SQL-файл, который выполняется при запуске сервера:СоветЕсли вы уже вычислили значение хэша и соответствующее значение соли для имени пользователя, вы можете использовать
IDENTIFIED WITH sha256_hash BY 'hash'илиIDENTIFIED WITH sha256_hash BY 'hash' SALT 'salt'. Для идентификации сsha256_hashс использованиемSALTхэш должен быть вычислен из конкатенации 'password' и 'salt'. -
Тип
double_sha1_passwordобычно не требуется, но бывает полезен при работе с клиентами, которые его требуют (например, интерфейс MySQL):ClickHouse генерирует и выполняет следующий запрос:
-
Тип
bcrypt_passwordявляется самым безопасным вариантом хранения паролей. Он использует алгоритм bcrypt, который устойчив к атакам перебором, даже если хэш пароля скомпрометирован.Длина пароля при этом методе ограничена 72 символами. Параметр work factor для bcrypt, определяющий объём вычислений и время, необходимое для вычисления хэша и проверки пароля, можно изменить в конфигурации сервера:
Значение work factor должно быть в диапазоне от 4 до 31, по умолчанию — 12.
ПримечаниеДля приложений с частой аутентификацией рассмотрите альтернативные методы аутентификации из-за вычислительных накладных расходов bcrypt при высоких значениях work factor.
-
Тип пароля также можно опустить:
В этом случае ClickHouse использует тип пароля по умолчанию, указанный в конфигурации сервера:
Доступные типы паролей:
plaintext_password,sha256_password,double_sha1_password. -
Можно указать несколько методов аутентификации:
Примечания:
- Более старые версии ClickHouse могут не поддерживать синтаксис с несколькими методами аутентификации. Поэтому, если на сервере ClickHouse есть пользователи с такими настройками и сервер понижен до версии, которая этого не поддерживает, эти пользователи станут недоступны, а некоторые операции, связанные с пользователями, перестанут работать. Чтобы выполнить понижение версии корректно, необходимо перед понижением настроить всех пользователей так, чтобы у каждого был только один метод аутентификации. Либо, если сервер был понижен без соблюдения предусмотренной процедуры, проблемных пользователей следует удалить.
no_passwordне может сосуществовать с другими методами аутентификации по соображениям безопасности. Поэтому вы можете указатьno_passwordтолько если это единственный метод аутентификации в запросе.
Хост пользователя
Хост пользователя — это хост, с которого может быть установлено соединение с сервером ClickHouse. Хост может быть указан в секции запроса HOST следующими способами:
HOST IP 'ip_address_or_subnetwork'— Пользователь может подключаться к серверу ClickHouse только с указанного IP‑адреса или подсети. Примеры:HOST IP '192.168.0.0/16',HOST IP '2001:DB8::/32'. Для использования в продакшене указывайте только элементыHOST IP(IP‑адреса и их маски), так как использованиеhostиhost_regexpможет привести к дополнительным задержкам.HOST ANY— Пользователь может подключаться из любого места. Это вариант по умолчанию.HOST LOCAL— Пользователь может подключаться только локально.HOST NAME 'fqdn'— Хост пользователя может быть указан как FQDN. Например,HOST NAME 'mysite.com'.HOST REGEXP 'regexp'— Можно использовать регулярные выражения PCRE при указании хостов пользователя. Например,HOST REGEXP '.*\.mysite\.com'.HOST LIKE 'template'— Позволяет использовать оператор LIKE для фильтрации хостов пользователя. Например,HOST LIKE '%'эквивалентенHOST ANY,HOST LIKE '%.mysite.com'отбирает все хосты в доменеmysite.com.
Другой способ указания хоста — использовать синтаксис @ после имени пользователя. Примеры:
CREATE USER mira@'127.0.0.1'— Эквивалентно синтаксисуHOST IP.CREATE USER mira@'localhost'— Эквивалентно синтаксисуHOST LOCAL.CREATE USER mira@'192.168.%.%'— Эквивалентно синтаксисуHOST LIKE.
ClickHouse рассматривает user_name@'address' как имя пользователя целиком. Таким образом, технически вы можете создать несколько пользователей с одинаковым user_name и разными конструкциями после @. Однако мы не рекомендуем делать это.
Оператор VALID UNTIL
Позволяет задать дату окончания срока действия и, при необходимости, время для метода аутентификации. В качестве параметра принимает строку. Рекомендуется использовать формат YYYY-MM-DD [hh:mm:ss] [timezone] для даты и времени. По умолчанию этот параметр имеет значение 'infinity'.
Оператор VALID UNTIL может быть указан только вместе с методом аутентификации, за исключением случая, когда в запросе не задан ни один метод аутентификации. В этом случае оператор VALID UNTIL будет применён ко всем существующим методам аутентификации.
Примеры:
CREATE USER name1 VALID UNTIL '2025-01-01'CREATE USER name1 VALID UNTIL '2025-01-01 12:00:00 UTC'CREATE USER name1 VALID UNTIL 'infinity'CREATE USER name1 VALID UNTIL '2025-01-01 12:00:00 `Asia/Tokyo`'CREATE USER name1 IDENTIFIED WITH plaintext_password BY 'no_expiration', bcrypt_password BY 'expiration_set' VALID UNTIL '2025-01-01''
Клауза GRANTEES
Указывает пользователей или роли, которым разрешено получать привилегии от этого пользователя при условии, что этому пользователю также выданы все требуемые привилегии с GRANT OPTION. Варианты клаузы GRANTEES:
user— Указывает пользователя, которому этот пользователь может выдавать привилегии.role— Указывает роль, которой этот пользователь может выдавать привилегии.ANY— Этот пользователь может выдавать привилегии кому угодно. Значение по умолчанию.NONE— Этот пользователь не может выдавать привилегии никому.
Вы можете исключить любого пользователя или роль с помощью выражения EXCEPT. Например, CREATE USER user1 GRANTEES ANY EXCEPT user2. Это означает, что если у user1 есть некоторые привилегии, выданные с GRANT OPTION, он сможет выдавать эти привилегии кому угодно, кроме user2.
Примеры
Создайте учетную запись пользователя mira с паролем qwerty:
Клиентское приложение mira следует запускать на хосте, где запущен сервер ClickHouse.
Создайте учетную запись пользователя john, назначьте ей роли и сделайте эти роли ролями по умолчанию:
Создайте учетную запись пользователя john и назначьте все его будущие роли ролями по умолчанию:
Когда в дальнейшем пользователю john будет назначена какая-либо роль, она автоматически станет ролью по умолчанию.
Создайте учетную запись пользователя john и сделайте все его будущие роли ролями по умолчанию, за исключением ролей role1 и role2:
Создайте учётную запись пользователя john и разрешите ему передавать свои привилегии пользователю jack:
Используйте параметр запроса для создания учетной записи пользователя john: