干大数据这一行这么多年,我最怕听到的一句话是“先跑起来,安全后面再说”。HDFS 权限裸奔到 777、Hive 表谁都能 drop、数仓账号一个密码传三代——这些问题在真实生产环境里太常见了。Doris 这两年作为实时数仓里的热门选手,被越来越多公司拿来当核心分析引擎,但团队在选型时最常问我的其实是:Doris 能不能过安全审计?敏感数据放进去会不会出问题?这篇文章不聊虚的,就把我在生产环境里给 Doris 做安全加固的整套打法拆开讲——从账号权限、网络隔离到审计备份,每一步都给你能直接抄的配置和命令。
1. 项目概述:为什么大数据环境的数据安全这么难搞
1.1 真实环境里的安全痛点
先聊个现实问题。大数据平台一般不是单个组件,是 Hadoop、Spark、Kafka、Flume、Doris 等一堆东西凑在一起。组件多,权限就分散,HDFS 管一套,Yarn 管一套,Hive 可能还用着旧的授权方式,Doris 又单独一套账号密码。安全审计的时候很难把所有访问记录串成一条完整的链路。
而且数仓本身是数据资产最集中的地方,业务方的报表、用户的明细、系统的日志,全在里面。别小看一台看起来“只是查个数据”的 Doris 集群,一旦账号口令泄露或者权限配错,影响往往是整个业务面的数据泄露。我见过不少团队,Doris 的 root 密码直接写在运维文档里,甚至贴在工位上,这不是开玩笑。
再叠加监管要求。现在很多行业都有自己的数据安全标准,比如电力物联网有 q/GDW 12111-2021 这样的分级保护要求,金融、政务也有类似的合规底线。数据要分级分类,高密级数据要有访问控制、要有审计、要有加密保护。这些要求最终都要落到引擎层面去执行,Doris 的安全能力行不行,决定你能不能过得了检查。
1.2 Doris 在安全上的整体定位
Doris 的定位是实时数仓,对外提供 SQL 查询能力,对内对接各种上游数据源。它处在“数据进来”和“数据被使用”的中间层,安全设计上要解决的不只是“能不能登录”这种单点问题,而是从身份认证、权限授权、数据传输、存储加密、操作审计、容灾恢复六个维度一起用力。
我在生产环境做安全加固时,习惯按一个顺序来:先锁账号,再配权限,然后隔离网络、加密传输,接着做静态加密和脱敏,最后补齐审计和备份。这个顺序不能乱,因为前一层是后一层的基础。比如你不先把网络隔离做好,光靠账号密码挡不住恶意的端口扫描和越权访问。
下面我按这个顺序把每一层展开讲,涉及的具体配置和命令都是我在真实环境里验证过的。
2. 认证与权限管控:把数仓的第一道门锁好
2.1 账号体系建设:最小权限原则不是口号
Doris 默认装好后会有一个 root 账号,但这个 root 千万不能给普通业务直接用。我在项目里一般先做三件事:
第一,改掉默认 root 密码,并且把 root 限定为只能从跳板机或管理员网段登录。Doris 的用户可以通过绑定 host 来限制来源 IP,在创建用户时就指定。
第二,按角色拆账号。数据分析师只给只读权限,数据开发给读写权限但限制在指定库表,运维和管理员才用高权限账号。别怕建账号麻烦,账号多了权限才能细,安全审计的时候也能精确到人。
第三,密码策略要跟上。Doris 本身提供了一些密码策略相关的支持,但更通用的是集成 LDAP,让密码统一收口到企业的身份认证系统里。LDAP 配置在大数据场景里几乎是标配,用户离职、改密都在一个地方管理,不用每套系统单独维护一份密码。
实际配置 LDAP 时,需要在 FE 的配置文件中设置 ldap 相关参数,包括 ldap server 地址、ldap 管理员 DN、搜索 base DN 等。这里最容易踩的坑是 base DN 写得太宽,导致登录时搜索用户超时;写得太窄又找不到用户。建议先用 ldapsearch 命令把用户所在的组织单元确认清楚,再填配置。
2.2 基于 Ranger 的集中授权:把 Hive 和 Doris 的权限管到一张表里
很多团队现有的 Hadoop 生态已经部署了 Apache Ranger,Hive、HDFS 都统一走 Ranger 授权。如果 Doris 再单独搞一套授权方式,日常管理和审计会很痛苦。
好在 Doris 可以和 Ranger 集成。集成之后,可以在 Ranger 的 Web 界面上给 Doris 配置库、表、列级别的权限策略,代替在 Doris 内部一条条执行 GRANT。对于“列级权限”这类要求很高的场景,Ranger 相较于手写 SQL 授权,最大的优势就是可视化和集中管理,权限策略变更后还能统一审计。
我见过一个典型做法:把 Doris 集群的数据分析师角色、ETL 角色全部在 Ranger 里定义好,策略按库表前缀匹配,比如 ods_* 库只读、dwd_* 库只读、ads_* 库读写。这样新增表时只要表名符合规范,权限策略自动覆盖,不用一个个手动授权。
需要注意,Ranger 集成 Doris 的插件版本要和 Doris 版本匹配,版本不一致会出现授权不生效或看不到表的问题。遇到这类问题先对比插件版本,而不是急着重启集群。
2.3 权限模型设计:一套可以直接抄的矩阵
权限模型设计这件事,很多团队是边用边补,结果权限越补越乱。我比较推荐从一开始就定死角色和权限边界,下面这个矩阵是我在项目中常用的初始版本:
| 角色 | 权限范围 | 说明 |
|---|---|---|
| 数据管理员 | 所有库表的读写 + 用户权限管理 | 负责元数据和权限维护 |
| ETL 开发 | 指定业务库的读写 | 限定在 ods/dwd/ads 分区表 |
| 数据分析师 | 指定宽表的只读 | 不允许 DDL 和导出 |
| 报表服务账号 | 指定视图/结果集的只读 | 供 BI 系统使用 |
| 只读访客 | 限定库的 SELECT | 严格限制表数量 |
这个矩阵看起来简单,落地时最容易出问题的是“导出权限”。很多团队给了分析师 SELECT 权限,但没限制查询结果导出,敏感数据照样能通过 select outfile 方式拖走。在 Doris 的权限体系里,需要把导出相关权限单独控制,不要想当然地认为有了 SELECT 就有了一切,也要反过来检查高权限账号是否被授予了不必要的能力。权限配置完后,我习惯定期跑一遍 SHOW GRANTS,把每个账号的权限导出来人工抽检。
注意:权限最小化不只是针对普通用户,也包括管理员账号。管理员账号数量要控制在个位数,并且启用操作审计,避免“管理员”成为数据安全的黑洞。
3. 网络与传输安全:切断数据流出的路径
3.1 网络隔离:Doris 集群不要裸奔在办公网
Doris 的架构分 FE 和 BE 两类节点。FE 负责元数据和查询解析,BE 负责数据存储和查询计算。对外的访问入口主要是 FE,所以网络隔离的重点是把 FE 保护起来。
我的习惯是三层网络规划:
第一层,Doris 集群整体放在独立 VPC 或独立网段内,和其他业务按需互通。办公网不能直接访问集群端口,必须通过跳板机或网关。
第二层,FE 的所有端口只对应用服务器网段和运维网段开放,BE 的端口只允许 FE 和同集群 BE 访问。这些端口对应关系可以在官方文档里查到,用安全组或防火墙设置白名单时,按端口用途逐条配置,不要图省事直接放行整个网段。
第三层,如果业务要跨公网访问 Doris,建议在前面加一层反向代理或者网关,由代理层做 TLS 终结和认证转发,不直接把 FE 的端口暴露到公网。
网络隔离听着基础,但出问题的概率很高。我遇过不止一次,集群上线时为了方便测试,安全组里加了一条放行所有 IP 的规则,测试完忘记删,结果就挂在公网上裸奔了很久。所以每次上线前我都会专门检查一遍安全组规则,确定没有 /0 这种全开放规则。
3.2 传输加密:TLS 配置不能跳过
Doris 客户端连 FE,走的是 MySQL 协议,默认是明文传输。只要有人能抓到网络包,SQL 语句和返回的数据就可能被看光。生产环境尤其是跨机房、跨网络访问时,一定要开启 TLS。
开启 TLS 需要准备证书,一般由公司内部 CA 签发或者用自签名证书。FE 端配置好证书后,客户端连接串需要加上 SSL 相关参数;不同的客户端驱动参数名不一样,比如有些 Java 驱动是在 JDBC URL 里加 useSSL=true 和信任证书路径,Python 客户端则要指定 ssl 相关选项。配置完先用简单查询验证,再用抓包工具确认链路已经是加密的。
内网节点之间的流量很多人觉得不用加密,但如果是多云环境、混合云架构,FE 和 BE 之间的数据交互同样建议在条件允许时做加密,具体看网络的信任边界在哪里。安全不是做给别人看的,是给万一出问题时的自己留后路。
3.3 选型观察:Doris 和 StarRocks 的安全能力差在哪
经常有朋友问我,Doris 和 StarRocks 到底选哪个。这个问题如果放在安全角度看,两个项目同源,基础权限模型和安全功能设计很接近,认证、授权、审计这套东西都有。真正的差别往往在生态整合上:Doris 作为 Apache 项目,和 Hadoop 生态里的 Ranger、LDAP、Kerberos 等组件配合的文档和经验比较多;StarRocks 在商业版里有一些加强功能,社区版则要看具体版本的支持情况。
所以我一般建议:如果团队已经有成熟的 Ranger 体系,选 Doris 会更顺;如果更看重商业支持和性能优化方面的持续投入,那可以再评估 StarRocks。但不管选哪个,安全体系的落地能力都比组件本身更重要,账号混乱、权限失控,换什么引擎都一样会出事。
4. 存储加密与数据脱敏:敏感数据不能裸奔
4.1 静态加密:底层存储的兜底方案
数据落到磁盘后,如果磁盘被偷走或者备份文件被拷贝,那就不走 Doris 的权限体系了。所以静态加密是兜底方案。
Doris 本身目前没有内置的全库透明加密功能,常用的做法是在底层做加密,比如数据目录放在加密盘上,或者使用云厂商的加密存储服务。对自建机房来说,可以考虑文件系统加密或者磁盘加密,代价是会有一些性能损耗,但换来的是一旦物理介质泄露,数据还是密文。
除了磁盘,备份文件也要加密。Doris 备份到远端仓库时,重点是做好仓库的访问控制,对象存储的 AccessKey 要放到密钥管理系统里,不要直接写在配置文件里。备份文件本身如果存储端支持服务端加密,建议打开。
4.2 列级加密与脱敏:让不该看的人什么都看不到
很多业务对列级敏感字段有硬性要求,比如身份证号、手机号、银行卡号。Doris 层面没有内建的比较完整的列级脱敏 UI,所以生产上最常用的有三种做法:
第一种,在 ETL 阶段做脱敏。数据进入 Doris 之前,先把敏感字段按规则做变换,比如手机号中间四位用星号替换。缺点是原始数据不再存在,后续如果要做精确分析会比较麻烦。
第二种,建安全视图。原始表保留完整数据,只给普通用户开视图,视图里对敏感列做脱敏函数处理。这样数据不重复存储,权限也清晰。
第三种,在访问网关层做统一脱敏。所有查询统一经过一个 SQL 网关,网关根据用户的密级自动改写查询,把敏感列替换成脱敏表达式。这个方案对上层业务最友好,但需要额外的开发维护成本。
选哪种方案,取决于团队的合规要求和数据使用场景。如果只是报表展示用,ETL 阶段脱敏就够了;如果既要脱敏又要偶尔精确分析,那视图或者网关会更合适。这里我要特别提醒:脱敏一定要在权限层面同步限制,否则用户直接查原始表,脱敏就是摆设。我也见过把脱敏视图建好了,却忘了收回原始表的 SELECT 权限,等于白做。
在做数据分级分类时,可以借鉴行业里的分级保护思路,比如电力物联网数据安全分级保护要求里提到的数据分类分级理念,把数据资产按敏感程度标记,然后在表命名上做约定。比如基础信息表、隐私明细表、对外发布表分别用不同前缀,权限策略跟着前缀走,管理起来就轻松很多。
5. 审计与监控:让每一次访问都有迹可循
5.1 审计日志的开启与采集
Doris 的 FE 节点会记录审计日志,包括登录用户、客户端 IP、执行的 SQL、执行时间、返回行数等关键信息。默认情况下审计日志会写到 FE 节点的本地日志目录下,生产环境里一定要把这些日志收集起来做集中管理和检索。
我习惯用 Filebeat 或 Fluentd 把 FE 审计日志同步到 Elasticsearch,再配一个 Kibana 面板做检索。这样查“某个用户在某天执行了哪些 SQL”就是几秒钟的事。日志采集配置上要注意,审计日志文件会轮转,采集端要能识别轮转后的文件,避免日志中断或者重复采集。
另外,审计日志的保留周期要按合规要求来定。有些行业要求日志保留至少半年,日志量大时要注意磁盘容量规划。日志如果太占空间,可以只采集关键字段,或者做冷热分层,把超过一个月的日志归档到对象存储。
5.2 异常行为识别:不能只记录不告警
审计日志如果只是存着,出了事情才翻,价值就少了一半。真正有效的是基于审计日志做异常行为识别。
我在生产环境常用这几条告警规则:
- 短时间内连续登录失败次数超过阈值,可能是暴力破解。
- 非工作时间有批量导出或者全表扫描行为,可能是数据外泄。
- 高权限账号突然执行了 DDL 或者权限变更操作,需要重点确认。
- 从未见过的客户端 IP 第一次访问敏感库表。
这几条规则不复杂,用日志采集工具加简单的过滤就能实现。一开始规则不要太多,先把最常见的命准,后面再逐步加。
如果用了 Doris Manager 这类运维管理平台,也别忘了关注平台本身的安全。Doris Manager 能操作集群的启停、参数变更、数据迁移,权限给得太宽,比一个普通查询用户危险得多。平台的账号要单独管起来,和业务账号分隔开。
5.3 审计也能反哺权限整改
审计还有个额外收益,就是能发现权限给错的地方。比如审计日志里看到某个只读账号执行了 CREATE TABLE,那说明权限被配成了读写;看到某个用户一直在访问一个他根本用不上的库,就要考虑是不是权限范围太宽。
我一般每季度做一次权限巡查,把审计日志里各账号的实际访问行为导出,和权限配置做对比,把多余的授权回收掉。这套机制跑半年之后,权限会越来越干净,后面再有人申请权限,审批的时候也会更认真。
6. 备份与容灾:给数据安全上最后一道保险
6.1 备份仓库的规划与创建
数据安全不只是防止泄露,还包括防止丢失。Doris 提供了 BACKUP/RESTORE 能力,可以把数据定期备份到远端存储,比如 S3、HDFS、OSS 这些。
第一步是创建备份仓库,在 Doris 里执行类似下面的语句:
CREATE REPOSITORY `repo_s3_backup` WITH S3 ON LOCATION "s3://bucket-name/doris_backup" PROPERTIES ( "type" = "S3", "aws.global.endpoint" = "s3.amazonaws.com", "aws.s3.endpoint" = "s3.amazonaws.com", "aws.s3.access_key" = "your_access_key", "aws.s3.secret_key" = "your_secret_key", "aws.s3.region" = "us-east-1" );创建仓库时最容易错的就是 endpoint 和 region 不匹配,尤其使用国内对象存储时,endpoint 有内网地址和外网地址之分,集群能访问哪个就填哪个,填错了会一直报连通性错误。
仓库建好后,备份一张表或一个分区可以这样执行:
BACKUP SNAPSHOT snapshot_20250112 TO `repo_s3_backup` ON (dwd.dwd_user_detail PARTITION (p20250101, p20250102)) PROPERTIES ("type" = "full");备份是异步任务,这里我建议在备份完成后查询 SHOW BACKUP 的结果确认状态,而不是提交完就认为成功了。实际经验里,备份任务失败很多时候是网络波动或者对象存储的临时限流,重试一次往往就好了,但要在监控里看到失败告警,不能默默忽略。
6.2 恢复演练不能只是写在文档里
备份了不等于恢复得了,这是无数团队用事故换来的教训。我每季度会做一次恢复演练,挑一个测试用的库表,把备份恢复到另外一套测试集群里。
恢复的 SQL 大致长这样:
RESTORE SNAPSHOT snapshot_20250112 FROM `repo_s3_backup` ON (dwd.dwd_user_detail) PROPERTIES ( "backup_timestamp" = "2025-01-12-12-00-00", "replication_num" = "3" );注意 backup_timestamp 这个参数要在 SHOW SNAPSHOT ON 仓库里确认,开始时间写错会直接匹配不上。恢复通常会按创建备份记录时的时间戳来区分,所以时间戳是恢复成败的关键点。
恢复演练不只验证数据能不能回来,还验证恢复后的数据完整性。比如对比恢复前后某个关键表的行数和汇总值,步骤一定要写进操作手册,不用完整跑通一次,否则真出事时手忙脚乱。
6.3 跨集群复制:让安全问题有兜底
除了定期备份,Doris 也支持跨集群复制(CCR)。这个功能可以把主集群的数据实时同步到备集群,备集群可以承担只读查询,也能在主集群出问题时快速切换。
CCR 对数据安全的意义在于两点:一是主集群被误操作(比如 DDL 删表)之后,备集群还能保留一份相对安全的数据;二是可以把高密级查询全部切到备集群,减少主集群的暴露面。不过 CCR 不等于备份,如果主集群的误操作同步到了备集群,该丢的还是会丢。所以 CCR 和定期快照要同时用,互为补充。
跨集群复制配置的时候,要注意两边集群的版本尽量一致,版本相差太大会出现同步失败。另外,因为涉及跨网络的数据传输,通信链路同样要做好 TLS 或者走内网专线。
7. 常见问题与排查技巧实录
7.1 权限配置了却不生效
这是最常被问的问题之一。现象是管理员已经给某个用户授权了,但用户执行查询还是提示没有权限。
排查思路按顺序走:先确认当前会话用的确实是目标用户,很多连接池里缓存了旧连接,导致每次查询都走的是老账号;再在 Doris 里执行 SHOW GRANTS,确认授权记录真的存在;最后看问题是不是出在 Ranger 策略上,如果用了 Ranger,Doris 内部的授权和 Ranger 策略之间是叠加关系,Ranger 策略没同步成功或者插件缓存没刷新,看起来就是权限不生效。
注意:不要在排查权限问题时一上来就重启 FE。先查会话和缓存,重启是最后的办法,否则会打断线上查询,还可能把故障扩大范围。
7.2 审计日志占用磁盘太多
生产环境查询量大时,fe.audit.log 增长非常快。我遇到过审计日志把 FE 所在磁盘打满的情况,后果是整个集群不可用,教训很深刻。
解决办法有三板斧:第一,严格控制审计日志保留时间,及时清理过期文件;第二,把日志输出目录挂到独立的大容量磁盘上,避免和数据目录抢空间;第三,日志采集端加快消费,不要让文件在本地堆积太久。
如果日志还是要保留很久,建议采集到 Elasticsearch 或对象存储后再做生命周期管理,临时磁盘上只保留短期文件。
7.3 备份恢复失败排查清单
备份和恢复是容灾的最后一道防线,失败原因要快速定位。我把常见原因整理成一张速查表,方便大家直接对照:
| 现象 | 可能原因 | 处理方式 |
|---|---|---|
| CREATE REPOSITORY 报连通错误 | endpoint 或 region 配错 | 用对象存储的 SDK 测试同网络环境连通性 |
| BACKUP 任务一直 PENDING | 同时有别的快照任务在跑 | 查看 SHOW BACKUP 中已有任务,排队或取消旧任务 |
| RESTORE 匹配不到快照 | backup_timestamp 填错 | 用 SHOW SNAPSHOT ON 仓库查询准确时间戳 |
| 恢复后数据行数不一致 | 备份期间有写入未刷盘 | 备份前暂停大数据写入,或在业务低峰期备份 |
这套清单基本上覆盖了我遇到的绝大多数问题,剩下的基本都是集群资源不足导致的,扩容或者错峰执行就能解决。
7.4 其他容易被忽视的小问题
还有人会问,Doris 的 Duplicate 表模型为什么不支持条件删除。这个问题严格说不是安全范畴,而是表模型特性决定的。一个表模型选错了,后期要做数据订正时就会很痛苦。所以建表前要认真评估业务的数据更新方式,选择适合的模型,能省掉很多后续麻烦。
另外,集群部署策略也会影响安全。我见过很多团队图省事,多套环境共用一个集群,开发、测试、生产的数据混在一起。这种情况下权限再严格,也架不住环境本身没有隔离。有条件的就把账号体系和网络访问彻底分开,实在共用集群的,至少要按库前缀隔离,并限制跨库访问。
最后再补一句个人感受。做了这么多年数据平台,我的体会是:Doris 的数据安全保障,核心不是某一个功能,而是一套“账号最小化 + 权限集中化 + 网络白名单 + 审计全记录 + 备份常演练”的组合拳。这五件事听起来都不复杂,难的是坚持执行。你可以在小集群上先把这套体系跑起来,哪怕业务量不大,也养成习惯,等到数据规模真的上来时,你会感谢当初那个把安全基础打扎实的自己。
如果哪天面试官问你 Doris 数据安全怎么做,你就按认证授权、网络隔离、加密脱敏、审计追溯、容灾备份这五个维度讲,再举一个你实际处理过的权限问题或者备份演练的例子,基本就稳了。