跳到主要内容
跳到主要内容

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 kerberosIDENTIFIED 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 个特殊字符

示例

  1. 以下用户名是 name1,不需要密码 - 这显然不能提供太多安全性

    CREATE USER name1 NOT IDENTIFIED
  2. 要指定明文密码

    CREATE USER name2 IDENTIFIED WITH plaintext_password BY 'my_password'
    提示

    密码存储在 /var/lib/clickhouse/access 中的 SQL 文本文件中,因此使用 plaintext_password 不是一个好主意。尝试使用 sha256_password 代替,如下所示...

  3. 最常见的选择是使用 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'。对于使用 SALTsha256_hash 身份验证 - 哈希必须从 'password' 和 'salt' 的串联计算得出。

  4. 通常不需要 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'
  5. bcrypt_password 是存储密码最安全的选项。它使用 bcrypt 算法,即使密码哈希被泄露,它也能抵抗暴力破解攻击。

    CREATE USER name5 IDENTIFIED WITH bcrypt_password BY 'my_password'

    使用此方法,密码长度限制为 72 个字符。bcrypt 工作因子参数定义了计算哈希和验证密码所需的计算量和时间,可以在服务器配置中修改

    <bcrypt_workfactor>12</bcrypt_workfactor>

    工作因子必须介于 4 和 31 之间,默认值为 12。

  6. 密码类型也可以省略

    CREATE USER name6 IDENTIFIED BY 'my_password'

    在这种情况下,ClickHouse 将使用服务器配置中指定的默认密码类型

    <default_password_type>sha256_password</default_password_type>

    可用的密码类型为:plaintext_passwordsha256_passworddouble_sha1_password

  7. 可以指定多种身份验证方法

    CREATE USER user1 IDENTIFIED WITH plaintext_password by '1', bcrypt_password by '2', plaintext_password by '3''

注意

  1. 旧版本的 ClickHouse 可能不支持多种身份验证方法的语法。因此,如果 ClickHouse 服务器包含此类用户并降级到不支持该语法的版本,则这些用户将变得不可用,并且一些用户相关操作将被破坏。为了平稳降级,必须在降级之前将所有用户设置为包含单一身份验证方法。或者,如果服务器在没有正确程序的情况下降级,则应删除有故障的用户。
  2. 出于安全原因,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 地址及其掩码),因为使用 hosthost_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 ANYHOST 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,并将他未来的所有角色设置为默认角色,但 role1role2 除外

CREATE USER john DEFAULT ROLE ALL EXCEPT role1, role2;

创建用户帐户 john,并允许他将其权限授予 jack 帐户的用户

CREATE USER john GRANTEES jack;