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 Clause
Specifies users or roles which are allowed to receive privileges from this user on the condition this user has also all required access granted with GRANT OPTION. Options of the GRANTEES clause:
user— Specifies a user this user can grant privileges to.role— Specifies a role this user can grant privileges to.ANY— This user can grant privileges to anyone. It's the default setting.NONE— This user can grant privileges to none.
You can exclude any user or role by using the EXCEPT expression. For example, CREATE USER user1 GRANTEES ANY EXCEPT user2. It means if user1 has some privileges granted with GRANT OPTION it will be able to grant those privileges to anyone except user2.
Examples
Create the user account mira protected by the password qwerty:
mira should start client app at the host where the ClickHouse server runs.
Create the user account john, assign roles to it and make this roles default:
Create the user account john and make all his future roles default:
When some role is assigned to john in the future, it will become default automatically.
Create the user account john and make all his future roles default excepting role1 and role2:
Create the user account john and allow him to grant his privileges to the user with jack account:
Use a query parameter to create the user account john: