You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何禁止ClickHouse默认用户查看指定数据库?

解决ClickHouse默认用户无法通过REVOKE修改权限的问题

你遇到的这个错误核心原因很明确:default用户是定义在静态配置文件users.xml中的,而ClickHouse的SQL权限命令(GRANT/REVOKE)仅对动态创建的用户生效,静态配置文件属于只读存储范畴,所以无法用SQL命令直接修改。下面给你两种可行的解决方案:

方案1:直接修改users.xml配置文件(快速解决)

这是针对静态配置用户的直接修改方式,步骤清晰明了:

  1. 找到ClickHouse的配置目录(通常是/etc/clickhouse-server/),打开users.xml文件
  2. 定位到<default>用户的配置块,添加access_rights节点来明确拒绝该用户对test_db所有表的SELECT权限:
    <users>
        <default>
            <!-- 保留原有的其他配置(比如password、profile等) -->
            <access_rights>
                <deny>
                    <database>test_db</database>
                    <table>*</table>
                    <permission>SELECT</permission>
                </deny>
            </access_rights>
        </default>
    </users>
    
    注意:ClickHouse的权限优先级是DENY高于ALLOW,所以即使default用户原本有全局SELECT权限,这个配置也会覆盖它,禁止访问test_db的表。
  3. 修改完成后,重启ClickHouse服务让配置生效:
    sudo systemctl restart clickhouse-server
    
  4. 验证:用default用户登录后尝试查询test_db的表,应该会收到权限不足的错误提示。

方案2:改用动态用户管理(推荐长期维护)

这种方式可以避免每次修改权限都要改配置文件和重启服务,更适合长期维护:

  1. 先创建一个拥有最高权限的管理员用户(用现有有权限的用户执行,比如初始的default用户):
    CREATE USER admin IDENTIFIED BY 'your_secure_password';
    GRANT ALL ON *.* TO admin WITH GRANT OPTION;
    
  2. (可选)如果你想弱化default用户的权限,可以修改users.xml,去掉default用户的全局SELECT权限,只保留必要的权限(比如只能访问某个默认数据库),然后重启服务。
  3. 之后用admin用户登录,就可以用REVOKE/GRANT命令管理所有动态用户的权限了,比如如果以后需要限制某个用户访问test_db,直接执行:
    REVOKE SELECT ON test_db.* FROM some_user;
    
    这种方式的权限是存储在ClickHouse的系统数据库中的,属于可写存储,不会出现之前的只读错误。

补充说明

为什么你的REVOKE命令会报错?因为ClickHouse的用户分为两类:

  • 静态用户:定义在users.xmlusers.d/目录下的配置文件中,这类用户的权限是静态的,只能通过修改配置文件并重启服务来更新,无法用SQL命令修改。
  • 动态用户:通过CREATE USER命令创建的用户,这类用户的权限存储在系统表中,可以用GRANT/REVOKE命令实时修改,无需重启服务。

你当前的default用户属于静态用户,所以用REVOKE命令会触发只读存储的错误。

内容的提问来源于stack exchange,提问作者photographyraptor

火山引擎 最新活动