本节摘要:本节讲 ClickHouse 的安全体系:RBAC 权限、TLS 加密、配额限流、审计日志。给集群加护栏,防止误操作和资源滥用。
阅读完本节,你应当能够:
ClickHouse 的权限基于 RBAC(基于角色的访问控制)。核心概念:
-- 建角色并授权 CREATE ROLE analyst_role; GRANT SELECT ON default.* TO analyst_role; GRANT INSERT ON default.events TO analyst_role; -- 建用户并授角色 CREATE USER alice IDENTIFIED WITH sha256_password BY 'xxx'; GRANT analyst_role TO alice; -- 设置默认角色 ALTER USER alice DEFAULT ROLE analyst_role;
权限粒度很细,可以按操作类型(SELECT/INSERT/ALTER/CREATE/DROP)和对象(库/表/列)授权。生产建议按角色分配,用户只授角色,不直接授权限,方便管理。
给权限要克制,遵循最小权限——只给业务必需的,别给 ALL PRIVILEGES:
| 角色 | 需要的权限 | 不该有的权限 |
|---|---|---|
| 分析师 | SELECT | INSERT/ALTER/DROP |
| ETL 账号 | INSERT/SELECT(目标表) | DROP/ALTER 任意表 |
| 管理员 | 全部 | - |
| 看板应用 | SELECT(特定表) | INSERT/DDL |
特别要限制 DROP 和 ALTER——误删误改的根源往往是权限给太宽。生产账号不该有 DDL 权限,DDL 走单独的运维流程。
默认 ClickHouse 客户端到服务端是明文的,生产要开 TLS。配置在 config.xml 里:
开 TLS 后,HTTP 和 TCP 端口都能加密。副本间同步、Distributed 表跨节点通信也建议加密,防内网嗅探。
⚠️ 常见坑:很多人只加密外部访问,内网节点间通信还是明文。内网不是绝对安全——一旦一台被入侵,明文通信可被嗅探。生产建议全链路 TLS。
Quota 限制用户在一段时间内的资源使用,防某个用户把集群资源吃光:
-- 限制用户每小时查询数和扫描行数 CREATE QUOTA analyst_quota FOR INTERVAL 1 HOUR MAX QUERIES 1000 MAX ERRORS 100 MAX ROWS 1000000000 MAX QUERY_DURATION_MS 60000; GRANT analyst_quota TO analyst_role;
Quota 维度:查询数、错误数、扫描行数、查询时长、结果行数。可以按用户或按角色限。配合 max_memory_usage 等单查询限制,构成"单查询 + 用户级"两层资源控制。
| 限制类型 | 作用 | 配置 |
|---|---|---|
| 单查询内存 | 防单查询爆内存 | max_memory_usage |
| 单查询时长 | 防慢查询拖累 | max_execution_time |
| 用户配额 | 防用户滥用 | Quota |
| 并发查询数 | 防并发拖垮 | max_concurrent_queries |
审计日志记录谁在什么时候做了什么操作,是合规和追溯的依据。开启 query_log 并配置记录内容:
<query_log> <database>system</database> <table>query_log</table> <log_queries>1</log_queries> <log_query_threads>1</log_query_threads> </query_log>
system.query_log 会记录每条查询的用户、来源 IP、SQL、耗时、扫描行数。排查误操作、追溯责任都靠它。生产要长期保留(按合规要求,金融场景常需保留 6 个月以上)。
-- 查谁删了表 SELECT event_time, user, query FROM system.query_log WHERE query LIKE '%DROP TABLE events%' ORDER BY event_time DESC;
💡 关键直觉:安全的核心是"最小权限 + 全链路加密 + 可追溯"。权限给克制、通信加密、操作有日志,三件事做到位,绝大多数安全风险就堵住了。别等出事才补,部署时就配好。
第 6 章结束。你已经能部署升级、监控告警、备份恢复、安全控制,把 ClickHouse 管成生产级。最后一章看生态集成和架构最佳实践。
RBAC 的命令不难,难在管理习惯。下面是一套推荐的初始化流程,从建角色到授权一气呵成:
-- 1. 建业务角色 CREATE ROLE analyst_role; CREATE ROLE etl_role; -- 2. 按最小权限授权 GRANT SELECT ON default.* TO analyst_role; GRANT SELECT, INSERT ON default.events TO etl_role; -- 3. 建用户并绑定角色 CREATE USER alice IDENTIFIED WITH sha256_password BY 'StrongPass1'; CREATE USER etl_bot IDENTIFIED WITH sha256_password BY 'AnotherStrongPass'; GRANT analyst_role TO alice; GRANT etl_role TO etl_bot;
管理习惯上三条建议:角色只做权限的载体,用户只绑角色、不直接授权限;权限变更改角色而不是逐个改用户;定期用 SHOW GRANTS 审计权限清单,清理不需要的授权:
-- 查看某用户的全部权限 SHOW GRANTS FOR alice;
配额和权限是两套东西:权限管"能不能做",配额管"能做多少"。给看板账号设一个宽松但存在上限的配额,给批量任务账号设严格的配额,能防止单点滥用拖垮集群:
-- 看板账号:每小时最多 600 次查询、扫描 1 亿行 CREATE QUOTA dashboard_quota FOR INTERVAL 1 HOUR MAX QUERIES 600 MAX ROWS 100000000; GRANT dashboard_quota TO dashboard_user;
审计是最后一道防线。system.query_log 保留所有操作记录,建议在查询日志表上配 TTL 长期保留(比如 6 个月),同时把异常操作(DROP、ALTER)单独做告警。权限、配额、审计三件套配齐,安全框架就立起来了。