Skip to content

生产级安全与多租户隔离

场景 多租户数据平台最怕的事故,往往不发生在正常流程里,而发生在边角:解析失败的降级路径悄悄跳过了鉴权、密钥明文躺在进程命令行里、一个空间把整个集群的算力吃满。所以安全这件事,不能只看「有没有权限模型」,要看异常和降级时守不守得住

有哪些防线

防的是什么平台怎么做
越权读数每条查询提交即做逐表权限检查,无权的表当场拒绝;AI 生成的 SQL 也走同一道闸
降级变后门安全默认拒绝:解析失败、组件降级时宁可拒绝也不放行未鉴权的访问
带弱口令上线生产姿态下任一敏感凭据还是弱默认值,平台直接拒绝启动
密钥泄漏数据源/存储密钥加密落库,运行时才解密送进引擎内存,不进命令行、不进配置快照
一个空间吃满集群资源双层闸:提交前按空间配额准入(超容排队),运行中按空间的资源上限硬隔离
各模块口径打架权限、可查询性、删除保护等横切规则各有单一权威组件,所有模块引用同一口径

亮点

  • fail-closed 是默认姿态——功能可以降级,安全不降级;要么保住边界,要么保守拒绝
  • 数据与算力是两条正交防线——数据面每空间独立存储账号,算力面每空间独立资源边界,谁也替代不了谁
  • AI 路径无特权——自然语言查数、智能助手生成的查询,和手写 SQL 走完全相同的鉴权闸
  • 密钥全生命周期不见明文——落库加密、展示脱敏、运行时只进引擎内存

实景一:越权,当场拒

bob 在自己的空间里查询另一个空间的表——提交那一刻就被逐表权限检查拦下,不会等跑到引擎才发现,更不会「解析不了就放过去」。报错同时给出正路:向建表空间申请读权限:

数据查询页,bob 以 demo_ws(#3) 身份执行 SELECT * FROM iceberg_lake.qa_demo.fact_order,结果区红色报错"无法读取表 iceberg_lake.qa_demo.fact_order:该表不存在,或你所在空间无其读权限。请先核对表名是否正确;确认表存在且需访问,可向建表空间申请读权限",页头写明"提交即做语法检查+逐表权限检查"

值得强调的是「表不存在」和「无权限」在报错里故意不区分——不给探测者「这张表存在但你无权」的情报。

实景二:空间是最小授权单元

成员与角色(属主/管理员/开发/访客)、OpenAPI 访问令牌、底层系统账号的凭据托管,都收在空间管理里。令牌对他人默认脱敏;数据库口令、对象存储密钥加密存储、密文展示,仅管理员可揭示。给别的空间授权湖表时,平台会联动把对象存储侧的访问策略一起下发——上层权限和底层存储权限永远一致:

空间管理页:demo_ws 的成员列表(alice 属主/管理员,bob 开发者可调角色可移除);访问令牌区注明"OpenAPI/外部调用用 X-Token,他人令牌默认脱敏,仅本人可查看复制";凭据/密钥托管区列出数据库账号、对象存储账号(MinIO)、通用密钥,密钥均为密文点查看才揭示,说明文字写明"授权湖表时会用本空间对象存储账号联动下发 MinIO 权限"

实景三:算力配额,软准入 + 硬隔离

每个空间的批/流作业资源、查询引擎规格独立申报与配给。提交作业时先按空间配额做准入判定——超容不是失败而是排队,等资源释放再跑;真正运行时,空间的资源上限在集群层面硬性生效,即便有什么绕过了软准入,也吃不到超出配额的算力。查询引擎按空间独立部署,空间之间互不干扰:

资源管理页:批/流作业资源区显示 CPU/内存/并发作业三组"申报/配额"进度条,附说明"进度条=申报/配额,配给=k8s 实际给 pod 的 limit 之和,实测=metrics-server 真实用量";Spark 查询引擎区显示本空间专属引擎的 Executor/Driver 规格与最大并发查询数,注明"数据查询会按此规格在本空间专属引擎上运行,空间间互不干扰";右上角有申请扩容/申请调整按钮

申报、配给、实测三个口径分开呈现,资源是真占着还是虚占着一眼可判——配额治理不靠拍脑袋。

那些看不见的部分

  • 启动自检:生产姿态下,任何一个敏感凭据(数据库口令、对象存储密钥、签名密钥等)还是出厂默认值,平台拒绝启动——「先跑起来再说」在安全上不成立
  • 单一权威源:哪些表可被直查、删除某对象会不会破坏引用、令牌具备哪些能力,每条规则只有一个权威判定组件,前端、网关、各引擎全部引用它,不存在「两处判断打架」的缝隙
  • 作业身份最小化:每个作业运行时拿到的是本空间的受限身份,能力集在签发时就被冻结,运行中的 pod 无法给自己加权
  • 副作用最终一致:授权变更、表结构变更这类跨系统副作用走事务性 outbox 事件——与业务写同事务落库、可靠投递、消费幂等,还有定时对账兜底
回到核心能力总览 →