ClickHouse 用户权限管理小探

背景

与传统的MySQL数据库类似,ClickHouse也有较完备的用户权限管理功能。其支持通过扩展users.xml配置和SQL-Driven两种方式来配置。安全无小事,大家在做数据集成相关的工作的时候,需要从数据库用户层面,做好安全防护。从入口处,明确数据访问的权限和范围。可别依赖于上层应用所做的限制。

通过扩展users.xml进行配置

我们可以新建相关的用户配置文件,不需要修改默认的users.xml文件,把新增的用户配置文件,放到/etc/clickhouse-server/users.d文件夹下,clickhouse会动态加载配置信息。如果users.d文件夹不存在,可自行新建。需要保证clickhouse启动用户有访问权限。

支持的场景包括:

1、操作权限控制

可以定义不同角色,比如:只读角色(readonly)和管理角色(management)。配置示例如下:

xml 复制代码
<!-- Profiles of settings. -->
    <profiles>
        <!-- Profile that allows only read queries. -->
        <readonly>
            <readonly>1</readonly>
            <allow_ddl>0</allow_ddl>
        </readonly>
        <management>
            <readonly>0</readonly>
            <allow_ddl>1</allow_ddl>
        </management>
    </profiles>

2、库访问控制

通过allow_databases限制用户能访问哪些数据库。结合操作权限,实现对哪些数据库有哪些访问权限。配置示例:

xml 复制代码
<profile>management</profile>
<allow_databases>
  <database>db01</database>
</allow_databases>
<allow_databases>
  <database>db02</database>
</allow_databases>

3、表访问控制

扩展users.xml进行配置的方式,目前无法实现具体的访问哪些表的权限控制。只能针对具体表,控制访问具体表中哪些行的权限。其实这个功能比较鸡肋。如果想具体控制到表级别,只能通过别的方式来实现。

xml 复制代码
<databases>
     <db01>
          <xxx_table>
               <filter>id is not null</filter>
          </xxx_table>
     </db01>
</databases>

4、其他的一些控制

包括:并发数、最大使用内存、超时时间等。官方给的示例如下:

xml 复制代码
<!-- Settings profiles -->
<profiles>
    <!-- Default settings -->
    <default>
        <!-- The maximum number of threads when running a single query. -->
        <max_threads>8</max_threads>
    </default>

    <!-- Settings for queries from the user interface -->
    <web>
        <max_rows_to_read>1000000000</max_rows_to_read>
        <max_bytes_to_read>100000000000</max_bytes_to_read>

        <max_rows_to_group_by>1000000</max_rows_to_group_by>
        <group_by_overflow_mode>any</group_by_overflow_mode>

        <max_rows_to_sort>1000000</max_rows_to_sort>
        <max_bytes_to_sort>1000000000</max_bytes_to_sort>

        <max_result_rows>100000</max_result_rows>
        <max_result_bytes>100000000</max_result_bytes>
        <result_overflow_mode>break</result_overflow_mode>

        <max_execution_time>600</max_execution_time>
        <min_execution_speed>1000000</min_execution_speed>
        <timeout_before_checking_execution_speed>15</timeout_before_checking_execution_speed>

        <max_columns_to_read>25</max_columns_to_read>
        <max_temporary_columns>100</max_temporary_columns>
        <max_temporary_non_const_columns>50</max_temporary_non_const_columns>

        <max_subquery_depth>2</max_subquery_depth>
        <max_pipeline_depth>25</max_pipeline_depth>
        <max_ast_depth>50</max_ast_depth>
        <max_ast_elements>100</max_ast_elements>

        <max_sessions_for_user>4</max_sessions_for_user>

        <readonly>1</readonly>
    </web>
</profiles>

SQL-Driven配置

通过SQL-Driven很容易管理用户的访问权限,上面说到的表级别的控制,很容易实现。与MySQL的操作方式非常类似,此处就不加赘述。参考SQL如下:

sql 复制代码
#创建管理设备表的角色
CREATE ROLE xxx_read_write;
GRANT SELECT, INSERT ON db01.x1_table TO xxx_read_write;
GRANT SELECT ON db01.x2_table TO device_read_write;

CREATE USER user_001 IDENTIFIED WITH sha256_password BY '12xxyy' HOST IP '::/0' DEFAULT ROLE xxx_read_write;

通过以上脚本可以实现对于表级别的权限控制。以上只是抛砖引玉,更多的功能请参考官方的文档。更多的,我们还是推荐使用SQL-Driven来配置权限。

相关推荐
Escape12 分钟前
为什么你的 AI 越聊越傻?从 Token 到 Agent,彻底搞懂 AI Agent的秘密㊙️
前端·人工智能·后端
用户40966601317511 小时前
Lombok 你用对了吗?@Data 之外的 6 个隐藏神器
java·后端·代码规范
董员外1 小时前
RAG 系统进化论(二):Naive RAG,检索增强生成的最小闭环
前端·人工智能·后端
掘金一周1 小时前
看看大家每月的成本有多少 | 沸点周刊 7.30
前端·人工智能·后端
aramae1 小时前
C++ IO流完全指南:从C标准库到C++流式编程
服务器·c语言·开发语言·c++·后端
SelectDB2 小时前
Apache Doris 事务保障实战教程:从三阶段提交到 Flink 精确一次写入
后端
SelectDB2 小时前
Apache Doris 向量化执行实战教程:从 CPU 指令到性能验证的完整实践
后端
神奇小汤圆2 小时前
别再乱排查了!Kafka 消息积压、重复、丢失,根源基本都是 Rebalance!
后端
神奇小汤圆3 小时前
字节二面:10亿数据毫秒级查手机尾号后4位,答不出“异构索引”直接挂?
后端
IT_Octopus3 小时前
Spring Boot 线程池关闭:destroyMethod 的作用与最佳实践
java·spring boot·后端