如何禁止ClickHouse默认用户查看指定数据库?
解决ClickHouse默认用户无法通过REVOKE修改权限的问题
你遇到的这个错误核心原因很明确:default用户是定义在静态配置文件users.xml中的,而ClickHouse的SQL权限命令(GRANT/REVOKE)仅对动态创建的用户生效,静态配置文件属于只读存储范畴,所以无法用SQL命令直接修改。下面给你两种可行的解决方案:
方案1:直接修改users.xml配置文件(快速解决)
这是针对静态配置用户的直接修改方式,步骤清晰明了:
- 找到ClickHouse的配置目录(通常是
/etc/clickhouse-server/),打开users.xml文件 - 定位到
<default>用户的配置块,添加access_rights节点来明确拒绝该用户对test_db所有表的SELECT权限:
注意:ClickHouse的权限优先级是<users> <default> <!-- 保留原有的其他配置(比如password、profile等) --> <access_rights> <deny> <database>test_db</database> <table>*</table> <permission>SELECT</permission> </deny> </access_rights> </default> </users>DENY高于ALLOW,所以即使default用户原本有全局SELECT权限,这个配置也会覆盖它,禁止访问test_db的表。 - 修改完成后,重启ClickHouse服务让配置生效:
sudo systemctl restart clickhouse-server - 验证:用default用户登录后尝试查询
test_db的表,应该会收到权限不足的错误提示。
方案2:改用动态用户管理(推荐长期维护)
这种方式可以避免每次修改权限都要改配置文件和重启服务,更适合长期维护:
- 先创建一个拥有最高权限的管理员用户(用现有有权限的用户执行,比如初始的default用户):
CREATE USER admin IDENTIFIED BY 'your_secure_password'; GRANT ALL ON *.* TO admin WITH GRANT OPTION; - (可选)如果你想弱化default用户的权限,可以修改
users.xml,去掉default用户的全局SELECT权限,只保留必要的权限(比如只能访问某个默认数据库),然后重启服务。 - 之后用admin用户登录,就可以用
REVOKE/GRANT命令管理所有动态用户的权限了,比如如果以后需要限制某个用户访问test_db,直接执行:
这种方式的权限是存储在ClickHouse的系统数据库中的,属于可写存储,不会出现之前的只读错误。REVOKE SELECT ON test_db.* FROM some_user;
补充说明
为什么你的REVOKE命令会报错?因为ClickHouse的用户分为两类:
- 静态用户:定义在
users.xml或users.d/目录下的配置文件中,这类用户的权限是静态的,只能通过修改配置文件并重启服务来更新,无法用SQL命令修改。 - 动态用户:通过
CREATE USER命令创建的用户,这类用户的权限存储在系统表中,可以用GRANT/REVOKE命令实时修改,无需重启服务。
你当前的default用户属于静态用户,所以用REVOKE命令会触发只读存储的错误。
内容的提问来源于stack exchange,提问作者photographyraptor




