创建用户
创建 用户账户.
语法
CREATE USER [IF NOT EXISTS | OR REPLACE] name1 [, name2 [,...]] [ON CLUSTER cluster_name]
[NOT IDENTIFIED | IDENTIFIED {[WITH {plaintext_password | sha256_password | sha256_hash | double_sha1_password | double_sha1_hash}] BY {'password' | 'hash'}} | WITH NO_PASSWORD | {WITH ldap SERVER 'server_name'} | {WITH kerberos [REALM 'realm']} | {WITH ssl_certificate CN 'common_name' | SAN 'TYPE:subject_alt_name'} | {WITH ssh_key BY KEY 'public_key' TYPE 'ssh-rsa|...'} | {WITH http SERVER 'server_name' [SCHEME 'Basic']}
[, {[{plaintext_password | sha256_password | sha256_hash | ...}] BY {'password' | 'hash'}} | {ldap SERVER 'server_name'} | {...} | ... [,...]]]
[HOST {LOCAL | NAME 'name' | REGEXP 'name_regexp' | IP 'address' | LIKE 'pattern'} [,...] | ANY | NONE]
[VALID UNTIL datetime]
[IN access_storage_type]
[DEFAULT ROLE role [,...]]
[DEFAULT DATABASE database | NONE]
[GRANTEES {user | role | ANY | NONE} [,...] [EXCEPT {user | role} [,...]]]
[SETTINGS variable [= value] [MIN [=] min_value] [MAX [=] max_value] [READONLY | WRITABLE] | PROFILE 'profile_name'] [,...]
ON CLUSTER
子句允许在集群上创建用户,参见 分布式 DDL.
身份验证
用户身份验证有多种方式
IDENTIFIED WITH no_password
IDENTIFIED 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>
<password_complexity>
<rule>
<pattern>.{12}</pattern>
<message>be at least 12 characters long</message>
</rule>
<rule>
<pattern>\p{N}</pattern>
<message>contain at least 1 numeric character</message>
</rule>
</password_complexity>
</clickhouse>
在 ClickHouse Cloud 中,默认情况下,密码必须满足以下复杂度要求
- 长度至少为 12 个字符
- 包含至少 1 个数字字符
- 包含至少 1 个大写字符
- 包含至少 1 个小写字符
- 包含至少 1 个特殊字符
示例
以下用户名为
name1
,不需要密码 - 这显然不提供太多安全性CREATE USER name1 NOT IDENTIFIED
要指定明文密码
CREATE USER name2 IDENTIFIED WITH plaintext_password BY 'my_password'
提示密码存储在
/var/lib/clickhouse/access
中的 SQL 文本文件中,因此最好不要使用plaintext_password
。尝试使用sha256_password
,如下所示...最常见的选项是使用使用 SHA-256 散列的密码。当您指定
IDENTIFIED WITH sha256_password
时,ClickHouse 会为您散列密码。例如CREATE USER name3 IDENTIFIED WITH sha256_password BY 'my_password'
name3
用户现在可以使用my_password
登录,但密码存储为上面散列的值。以下 SQL 文件是在/var/lib/clickhouse/access
中创建的,并在服务器启动时执行/var/lib/clickhouse/access $ cat 3843f510-6ebd-a52d-72ac-e021686d8a93.sql
ATTACH USER name3 IDENTIFIED WITH sha256_hash BY '0C268556C1680BEF0640AAC1E7187566704208398DA31F03D18C74F5C5BE5053' SALT '4FB16307F5E10048196966DD7E6876AE53DE6A1D1F625488482C75F14A5097C7';提示如果您已经为用户名创建了散列值和相应的盐值,那么可以使用
IDENTIFIED WITH sha256_hash BY 'hash'
或IDENTIFIED WITH sha256_hash BY 'hash' SALT 'salt'
。使用SALT
进行sha256_hash
身份验证 - 散列必须从 'password' 和 'salt' 的串联计算得出。double_sha1_password
通常不需要,但在与需要它的客户端(如 MySQL 接口)一起工作时非常有用CREATE USER name4 IDENTIFIED WITH double_sha1_password BY 'my_password'
ClickHouse 生成并运行以下查询
CREATE USER name4 IDENTIFIED WITH double_sha1_hash BY 'CCD3A959D6A004B9C3807B728BC2E55B67E10518'
bcrypt_password
是存储密码最安全的选项。它使用 bcrypt 算法,即使密码散列被泄露,也能抵御暴力破解攻击。CREATE USER name5 IDENTIFIED WITH bcrypt_password BY 'my_password'
使用此方法,密码长度限制为 72 个字符。bcrypt 工作因子参数定义了计算散列和验证密码所需的计算量和时间,可以在服务器配置中修改
<bcrypt_workfactor>12</bcrypt_workfactor>
工作因子必须介于 4 到 31 之间,默认值为 12。
也可以省略密码类型
CREATE USER name6 IDENTIFIED BY 'my_password'
在这种情况下,ClickHouse 将使用服务器配置中指定的默认密码类型
<default_password_type>sha256_password</default_password_type>
可用的密码类型包括:
plaintext_password
、sha256_password
、double_sha1_password
。可以指定多个身份验证方法
CREATE USER user1 IDENTIFIED WITH plaintext_password by '1', bcrypt_password by '2', plaintext_password by '3''
注释
- 旧版本的 ClickHouse 可能不支持多种身份验证方法的语法。因此,如果 ClickHouse 服务器包含此类用户并且降级到不支持此类用户的版本,则此类用户将无法使用,并且某些与用户相关的操作将中断。为了顺利降级,必须在降级之前将所有用户设置为包含单一身份验证方法。或者,如果服务器在没有正确操作的情况下降级,则应删除有问题的用户。
- 出于安全原因,
no_password
不能与其他身份验证方法共存。因此,只有当它是查询中唯一的身份验证方法时,才能指定no_password
。
用户主机
用户主机是从其建立与 ClickHouse 服务器连接的主机。可以在以下方式在 HOST
查询部分指定主机
HOST IP 'ip_address_or_subnetwork'
— 用户只能从指定的 IP 地址或 子网 连接到 ClickHouse 服务器。示例: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'
。
示例
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'
GRANTEES 子句
指定允许从该用户接收 权限 的用户或角色,前提是该用户也具有使用 GRANT OPTION授予的所有必需的访问权限。GRANTEES
子句的选项
user
— 指定该用户可以授予权限的用户。role
— 指定该用户可以授予权限的角色。ANY
— 该用户可以授予任何用户权限。这是默认设置。NONE
— 该用户不能授予任何人权限。
可以使用EXCEPT
表达式来排除任何用户或角色。例如,CREATE USER user1 GRANTEES ANY EXCEPT user2
。这意味着如果user1
被授予了带有GRANT OPTION
的某些权限,它将能够将这些权限授予除user2
之外的任何人。
示例
创建用户帐户mira
,密码为qwerty
保护。
CREATE USER mira HOST IP '127.0.0.1' IDENTIFIED WITH sha256_password BY 'qwerty';
mira
应该在运行 ClickHouse 服务器的主机上启动客户端应用程序。
创建用户帐户john
,为其分配角色,并将其角色设为默认角色。
CREATE USER john DEFAULT ROLE role1, role2;
创建用户帐户john
,并将其所有未来角色设置为默认角色。
CREATE USER john DEFAULT ROLE ALL;
将来为john
分配的任何角色都将自动成为默认角色。
创建用户帐户john
,并将其所有未来角色设置为默认角色,但role1
和role2
除外。
CREATE USER john DEFAULT ROLE ALL EXCEPT role1, role2;
创建用户帐户john
,并允许他将自己的权限授予具有jack
帐户的用户。
CREATE USER john GRANTEES jack;