ClickHouse 访问控制
20.4 版本以前的clickhouse需要修改配置文件并重启来修改用户的账号密码和权限。配置文件在/etc/clickhouse-server/users.xml
20.4 版本以后支持SQL的方式设置访问控制,同时支持配置文件的方式。建议使用SQL的方式管理账号密码和权限。
一、配置profile
profile 类似于角色,先定义好不同权限的角色,后面定义用户权限的时候直接绑定角色。
<yandex>
<profile>
<default>
<max_memory_usage>10000000000</max_memory_usage>
<use_uncompressed_cache>0</use_uncompressed_cache>
<load_balancing>random</load_balancing>
</default>
<readonly>
<readonly>1</readonly>
</readonly>
</profile>
</yandex>
以上是系统默认定义的两个profile,也就是两个role。
一个profile名为default,我们也可以根据需求自定义profile。我们限制了这个profile 单次查询所能使用的最大内存、关闭了使用未压缩的缓存、查询时候使用随机的方式选择一个shard的一个replica 进行查询。
一个profile名为readonly,我们限制它的权限为只读
二、配置用户
<yandex>
<profile>
......
</profile>
<users>
<default>
<password></password>
<networks>
<ip>::/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
</default>
</users>
<migu>
<password_double_sha1_hex>xxxxxx</password_double_sha1_hex>
</yandex>
其中,密码的设置方式建议按照配置文件中介绍使用以下命令生成
PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-'
三、使用SQL-DRIVEN 管理账号密码
开启default账号的access_management
按照配置文件users.xml 介绍,配置profile段的 access_management 参数,表示User can create other users and grant rights to them。也就是可以用这个用户登录,然后使用SQL语句管理其他账号
<users>
<default>
......
<access_management>1</access_management>
</default>
</users>
创建管理员角色和账号
>>> clickhouse-client -h 192.168.1.128
:) create role admin_user_account
:) grant all on *.* to admin_user_account with grant option
:) create user admin@'%' identified with sha256_password BY 'FeCW7T9'
:) grant admin_user_account to admin
:) exit
使用新创建的账号登录测试
>>> clickhouse-client -h 192.168.1.128 -u admin --password FeCW7T9
:) create user amber@'%' identified with sha256_password by 'FeCW7T8'
:) grant all on *.* to amber
关闭default账号的sql-driven
因为默认情况下分布式表查询的时候会使用defaut账号访问各个shard的replica。测试环境换了操作简便,我这里仍然保留default 账号且无密码。仅关闭了default账号的 access_management 。使得default账号登录之后不能执行账号管理相关的操作。
<users>
<default>
......
<access_management>0</access_management>
</default>
</users>
重启 clickhouse-server
>>> sudo systemctl restart clickhouse-server
每个clickhouse-server存储的是同质的数据,因此每个clickhouse-server都需要执行修改账号的操作,创建相同的账号密码