跳转到主要内容
users.xml 配置文件中的 users 部分包含用户设置。
ClickHouse 也支持通过 SQL 驱动的工作流 管理用户。我们建议优先使用这种方式。
users 部分的结构:
<users>
    <!-- 如果未指定用户名,则使用 'default' 用户。 -->
    <user_name>
        <!-- 在 users.user_name 级别只能指定一种身份验证方法。例如: -->
        <password></password>
        <!-- 或(exclusive) -->
        <password_sha256_hex></password_sha256_hex>
 
        <!-- 或(exclusive)(注意:为向后兼容,允许配置多个 SSH 密钥) -->
        <ssh_keys>
            <ssh_key>
                <type>ssh-ed25519</type>
                <base64_key>AAAAC3NzaC1lZDI1NTE5AAAAIDNf0r6vRl24Ix3tv2IgPmNPO2ATa2krvt80DdcTatLj</base64_key>
            </ssh_key>
            <ssh_key>
                <type>ecdsa-sha2-nistp256</type>
                <base64_key>AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNxeV2uN5UY6CUbCzTA1rXfYimKQA5ivNIqxdax4bcMXz4D0nSk2l5E1TkR5mG8EBWtmExSPbcEPJ8V7lyWWbA8=</base64_key>
            </ssh_key>
            <ssh_key>
                <type>ssh-rsa</type>
                <base64_key>AAAAB3NzaC1yc2EAAAADAQABAAABgQCpgqL1SHhPVBOTFlOm0pu+cYBbADzC2jL41sPMawYCJHDyHuq7t+htaVVh2fRgpAPmSEnLEC2d4BEIKMtPK3bfR8plJqVXlLt6Q8t4b1oUlnjb3VPA9P6iGcW7CV1FBkZQEVx8ckOfJ3F+kI5VsrRlEDgiecm/C1VPl0/9M2llW/mPUMaD65cM9nlZgM/hUeBrfxOEqM11gDYxEZm1aRSbZoY4dfdm3vzvpSQ6lrCrkjn3X2aSmaCLcOWJhfBWMovNDB8uiPuw54g3ioZ++qEQMlfxVsqXDGYhXCrsArOVuW/5RbReO79BvXqdssiYShfwo+GhQ0+aLWMIW/jgBkkqx/n7uKLzCMX7b2F+aebRYFh+/QXEj7SnihdVfr9ud6NN3MWzZ1ltfIczlEcFLrLJ1Yq57wW6wXtviWh59WvTWFiPejGjeSjjJyqqB49tKdFVFuBnIU5u/bch2DXVgiAEdQwUrIp1ACoYPq22HFFAYUJrL32y7RxX3PGzuAv3LOc=</base64_key>
            </ssh_key>
        </ssh_keys>

        <!-- 或(exclusive)用于多种身份验证方法: -->
        <auth_methods>
            <method1>
                <password></password>
            </method1>
            <method2>
                <password_sha256_hex></password_sha256_hex>
            </method2>
            <!-- ... -->
            <methodN>
                <!-- ... -->
            </methodN>
        </auth_methods>

        <access_management>0|1</access_management>

        <networks incl="networks" replace="replace">
        </networks>

        <profile>profile_name</profile>

        <quota>default</quota>
        <default_database>default</default_database>
        <databases>
            <database_name>
                <table_name>
                    <filter>expression</filter>
                </table_name>
            </database_name>
        </databases>

        <grants>
            <query>GRANT SELECT ON system.*</query>
        </grants>
    </user_name>
    <!-- 其他用户设置 -->
</users>

user_name/password

密码可以指定为明文或 SHA256 (十六进制格式) 。
  • 如需将密码设为明文 (不推荐) ,请将其放在 password 元素中。 例如:<password>qwerty</password>。密码也可以留空。
  • 如需使用密码的 SHA256 哈希值,请将其放在 password_sha256_hex 元素中。 例如:<password_sha256_hex>65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5</password_sha256_hex> 在 shell 中生成密码的示例:
    PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'
    
    结果的第一行是密码,第二行是对应的 SHA256 哈希值。
  • 为兼容 MySQL 客户端,密码也可以指定为 double SHA1 哈希值。请将其放在 password_double_sha1_hex 元素中。 例如:<password_double_sha1_hex>08b4a0f1de6ad37da17359e592c8d74788a83eb0</password_double_sha1_hex> 在 shell 中生成密码的示例:
    PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-'
    
    结果的第一行是密码,第二行是对应的 double SHA1 哈希值。

TOTP 身份验证配置

基于时间的一次性密码 (TOTP) 可通过生成在有限时间内有效的临时访问码,用于对 ClickHouse 用户进行身份验证。 这种 TOTP 身份验证方法符合 RFC 6238 标准,因此兼容 Google Authenticator、1Password 等常见 TOTP 应用及类似工具。 除基于密码的身份验证外,还可以通过 users.xml 配置文件进行设置。 目前,SQL 驱动的访问控制尚不支持此功能。 使用 TOTP 进行身份验证时,用户必须提供主密码,以及由其 TOTP 应用生成的一次性密码;可以通过 --one-time-password 命令行选项提供,也可以使用 ’+’ 字符将其拼接到主密码后。 例如,如果主密码为 some_password,生成的 TOTP 代码为 345123,则用户在连接到 ClickHouse 时可以指定 --password some_password+345123--password some_password --one-time-password 345123。如果未指定密码,clickhouse-client 会以交互方式提示输入。 要为用户启用 TOTP 身份验证,请在 users.xml 中配置 time_based_one_time_password 部分。该部分定义了 TOTP 设置,例如 secret、有效期、位数和哈希算法。 示例
<clickhouse>
    <!-- ... -->
    <users>
        <my_user>
            <!-- 基于密码的主身份验证: -->
            <password>some_password</password>
            <password_sha256_hex>1464acd6765f91fccd3f5bf4f14ebb7ca69f53af91b0a5790c2bba9d8819417b</password_sha256_hex>
            <!-- ... 或任何其他受支持的身份验证方法 ... -->

            <!-- TOTP 身份验证配置 -->
            <time_based_one_time_password>
                <secret>JBSWY3DPEHPK3PXP</secret>      <!-- Base32 编码的 TOTP 密钥 -->
                <period>30</period>                    <!-- 可选:OTP 有效期(秒) -->
                <digits>6</digits>                     <!-- 可选:OTP 的位数 -->
                <algorithm>SHA1</algorithm>            <!-- 可选:哈希算法:SHA1、SHA256、SHA512 -->
            </time_based_one_time_password>
        </my_user>
    </users>
</clickhouse>

Parameters:

- secret - (Required) The base32-encoded secret key used to generate TOTP codes.
- period - Optional. Sets the validity period of each OTP in seconds. Must be a positive number not exceeding 120. Default is 30.
- digits - Optional. Specifies the number of digits in each OTP. Must be between 4 and 10. Default is 6.
- algorithm - Optional. Defines the hash algorithm for generating OTPs. Supported values are SHA1, SHA256, and SHA512. Default is SHA1.

Generating a TOTP Secret

To generate a TOTP-compatible secret for use with ClickHouse, run the following command in the terminal:

```bash
$ base32 -w32 < /dev/urandom | head -1
此命令会生成一个经过 base32 编码的密钥,可将其添加到 users.xml 的 secret 字段中。 要为特定用户启用 TOTP,请在现有任一基于密码的字段 (如 passwordpassword_sha256_hex) 中,额外添加一个 time_based_one_time_password 部分。 可以使用 qrencode 工具为 TOTP 密钥生成二维码。
$ qrencode -t ansiutf8 'otpauth://totp/ClickHouse?issuer=ClickHouse&secret=JBSWY3DPEHPK3PXP'
为用户配置 TOTP 后,如上所述,可将一次性密码用作身份验证流程的一部分。

用户名/ssh-key

该设置支持使用 SSH 密钥进行身份验证。 给定一个 SSH 密钥 (例如使用 ssh-keygen 生成的密钥) ,如下所示
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDNf0r6vRl24Ix3tv2IgPmNPO2ATa2krvt80DdcTatLj john@example.com
ssh_key 元素应为
<ssh_key>
     <type>ssh-ed25519</type>
     <base64_key>AAAAC3NzaC1lZDI1NTE5AAAAIDNf0r6vRl24Ix3tv2IgPmNPO2ATa2krvt80DdcTatLj</base64_key>
 </ssh_key>
对于其他受支持的算法,将 ssh-ed25519 替换为 ssh-rsaecdsa-sha2-nistp256

多种身份验证方法

可以使用 <auth_methods> 元素为单个用户配置多种身份验证方法。这样,用户可以通过列出的任意一种方法进行身份验证——例如,某个用户既可以同时设置密码和 LDAP 凭据,也可以使用其中任意一种成功登录。 <auth_methods> 的每个子元素都是一个可任意命名的包装元素,其中必须且只能包含一种身份验证类型。包装元素的名称 (例如 <method1><primary><a1>) 并不重要;实际生效的只有内部的身份验证元素。 示例:多个密码
<users>
    <my_user>
        <auth_methods>
            <primary>
                <password>password_one</password>
            </primary>
            <secondary>
                <password_sha256_hex>65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5</password_sha256_hex>
            </secondary>
        </auth_methods>
    </my_user>
</users>
示例:混合身份验证类型
<users>
    <my_user>
        <auth_methods>
            <a1>
                <password>plaintext_pass</password>
            </a1>
            <a2>
                <password_sha256_hex>e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855</password_sha256_hex>
            </a2>
            <a3>
                <ldap>
                    <server>my_ldap_server</server>
                </ldap>
            </a3>
        </auth_methods>
    </my_user>
</users>
<auth_methods> 中支持以下身份验证类型:
  • password — 明文密码
  • password_sha256_hex — SHA256 密码哈希
  • password_scram_sha256_hex — SCRAM-SHA-256 密码哈希
  • password_double_sha1_hex — double SHA1 密码哈希
  • ldap — LDAP 服务器身份验证
  • kerberos — Kerberos 身份验证
  • ssl_certificates — SSL 证书身份验证
  • ssh_keys — SSH 密钥身份验证
  • http_authentication — HTTP 身份验证
规则和限制:
  • <auth_methods> 不能与在用户级别指定的身份验证方法同时使用。请二选一,不要混用。
  • <auth_methods> 必须至少包含一种身份验证方法。
  • <auth_methods> 中的每个包装元素都必须且只能包含一种身份验证类型 (<ssh_keys> 除外;出于向后兼容考虑,它可以包含多个) 。
  • TOTP (<time_based_one_time_password>) 在用户级别指定 (即位于 <auth_methods> 之外) ,并适用于列表中所有基于密码的身份验证方法。启用 TOTP 时,至少需要一种基于密码的身份验证方法。
示例:包含 TOTP 的 auth_methods
<users>
    <my_user>
        <auth_methods>
            <a1>
                <password>my_password</password>
            </a1>
            <a2>
                <ldap>
                    <server>ldap_server_1</server>
                </ldap>
            </a2>
        </auth_methods>
        <time_based_one_time_password>
            <secret>JBSWY3DPEHPK3PXP</secret>
        </time_based_one_time_password>
    </my_user>
</users>
在此示例中,TOTP 验证应用于基于密码的方法 (<password>) ,而 LDAP 方法则独立对外部服务器进行身份验证。

access_management

此设置用于启用或禁用用户对基于 SQL 的访问控制与账户管理的使用。 可能的值:
  • 0 — 禁用。
  • 1 — 启用。
默认值:0。

授权

此设置允许向所选用户授予任意权限。 列表中的每个元素都应为不指定任何被授权方的 GRANT 查询。 示例:
<user1>
    <grants>
        <query>GRANT SHOW ON *.*</query>
        <query>GRANT CREATE ON *.* WITH GRANT OPTION</query>
        <query>GRANT SELECT ON system.*</query>
    </grants>
</user1>
此设置不能与 dictionariesaccess_managementnamed_collection_controlshow_named_collections_secrets 以及 allow_databases 设置同时指定。

user_name/networks

允许用户连接到 ClickHouse 服务器的网络列表。 列表中的每个元素都可以采用以下形式之一:
  • <ip> — IP 地址或网络掩码。 示例:213.180.204.310.0.0.1/810.0.0.1/255.255.255.02a02:6b8::32a02:6b8::3/642a02:6b8::3/ffff:ffff:ffff:ffff::
  • <host> — 主机名。 示例:example01.host.ru 检查访问权限时,会执行一次 DNS 查询,并将返回的所有 IP 地址与 peer 地址进行比对。
  • <host_regexp> — 主机名的正则表达式。 示例:^example\d\d-\d\d-\d\.host\.ru$ 检查访问权限时,会先针对 peer 地址执行一次 DNS PTR 查询,然后应用指定的正则表达式。接着,会对 PTR 查询结果再次执行 DNS 查询,并将返回的所有地址与 peer 地址进行比对。强烈建议正则表达式以 $ 结尾。
DNS 请求的所有结果都会被缓存,直到服务器重启。 示例 要允许用户从任意网络访问,请指定:
<ip>::/0</ip>
除非已正确配置防火墙,或服务器未直接连接到 Internet,否则允许任何网络访问都是不安全的。
若仅允许从 localhost 访问,请指定:
<ip>::1</ip>
<ip>127.0.0.1</ip>

user_name/profile

你可以为用户指定一个设置 profile。设置 profile 在 users.xml 文件的单独章节中配置。更多信息,请参见 设置 profile

user_name/quota

配额可用于跟踪或限制一段时间内的资源使用量。配额在 users.xml 配置文件的 quotas 部分中进行配置。 您可以为用户分配一组配额。有关配额配置的详细说明,请参阅 Quotas

user_name/databases

在本节中,您可以限制 ClickHouse 向当前用户发出的 SELECT 查询返回哪些行,从而实现基础的行级安全控制。 示例 以下配置会强制用户 user1SELECT 查询结果中只能看到 table1id 字段值为 1000 的行。
<user1>
    <databases>
        <database_name>
            <table1>
                <filter>id = 1000</filter>
            </table1>
        </database_name>
    </databases>
</user1>
filter 可以是任何结果为 UInt8 类型值的表达式。它通常包含比较和逻辑运算符。对于此用户,database_name.table1filter 结果为 0 的行将不会被返回。此过滤器与 PREWHERE 操作不兼容,并会禁用 WHERE→PREWHERE 优化。

角色

你可以通过 user.xml 配置文件中的 roles 部分创建任意预定义角色。 roles 部分的结构:
<roles>
    <test_role>
        <grants>
            <query>GRANT SHOW ON *.*</query>
            <query>REVOKE SHOW ON system.*</query>
            <query>GRANT CREATE ON *.* WITH GRANT OPTION</query>
        </grants>
    </test_role>
</roles>
也可以在 users 部分向用户授予这些角色:
<users>
    <user_name>
        ...
        <grants>
            <query>GRANT test_role</query>
        </grants>
    </user_name>
<users>
最后修改于 2026年6月10日