CREATE USER
创建 用户账户。
语法
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']} [VALID UNTIL datetime]
[, {[{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';提示如果您已经为用户名创建了哈希值和相应的 salt 值,则可以使用
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'
。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
保护
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;