5.2 权限与安全


5.2 权限与安全

本节摘要:Airflow 默认姿态接近“内网城堡”:能打开 UI 就往往能看太多。生产必须显式认证、按 RBAC 拆角色、把连接密码从可读列表里拆出去,并承认 PythonOperator 等于在 Worker 上跑任意代码。安全是分层的:Web、API、元数据、执行、日志各有攻击面。只加固登录页远远不够。令牌台账往往比登录页更急。台账没有的令牌,发现即吊销。吊销当作事故响应,不当作日常打扫。日常是台账本身要每月抽查。

上手前先明确

阅读完本节,你应当能够:

  1. 关闭公开角色,接入 LDAP 或 OAuth 之一,而不是长期 BasicAuth
  2. 为分析师、DAG 作者、管理员拆权限,尤其是读连接密码
  3. 说明任务代码为何必须视为可信发布物
  4. 列出日志与 Variable 中的敏感信息该如何避免

一、攻击面比界面大

原文列出五层。Web:XSS、CSRF、越权。API:未鉴权的触发端点能被自动化误伤。元数据:变量和连接一旦拖库,凭证流失。执行:Worker 若以高权限跑,恶意或误写的 os.system 能毁掉机器。日志:SQL 参数和临时密钥会落盘。只加固登录页是不够的。

早期公开角色让能访问 UI 的人接近全权限。新安装应强迫显式管理员,去掉“谁都能进来”。FAB 把 AUTH_TYPE 做成可插拔:数据库用户、LDAP、OAuth 等。企业用 SSO,避免每人一套本地密码。会话 Cookie 要 HttpOnly 与 Secure。API 用独立令牌,令牌按人吊销,离职流程必须包含这一步。

原文举过 Connection 里留着生产库密码、员工离职只删 UI 账号的例子。读连接权限不等于读密码权限,后者应更窄。DAG 代码里 BaseHook.get_connection 仍可能在运行时取到密码——所以能发布 DAG 的人,实质上接近能用该连接。发布权是最高权限之一。

图 发布权大于只读 UI

图 发布权大于只读 UI

二、RBAC 与密钥

角色按对象:DAG、Connection、Variable、Pool、Admin。DAG 级权限允许团队只看见自己的标签。不要所有人 Admin。分析师只读;值班可触发特定 DAG;作者走 Git 发布而不是在 UI 里贴代码(UI 编辑是另一扇窗)。

密钥:Connection 密码用 Fernet 加密存库,密钥本身要轮转且备份,丢失等于所有连接无法解密。更好是对接外部保险库,运行时取。Variable 加密选项存在,但 Variable 仍常被截图和导出,真正秘密不要放这里。

角色 可以 不可以
Viewer 看允许的 DAG 与日志 触发生产、读连接密码
Operator 值班 触发、清失败、暂停 改角色、导出全部连接
Author 经 CI 发布 DAG 直接改生产连接主机
Admin 连接与用户 用个人账号当共用超级用户

三、执行侧:任意代码

能发布 PythonOperator 的人,能在 Worker 网络位置执行任意语句。沙箱有限。治理手段是:发布必须走评审与 CI;生产 Worker 无写集群 API 的凭据;敏感任务用专用队列与更窄的 IAM。禁止在任务里拉未知远程代码。

审计:谁触发了 Run、谁改了 Connection、谁导出了变量。FAB 与访问日志要留存。合规场景下 DAG 本身也是证据,版本要进 Git,不能只活在调度器磁盘。

⚠️ 常见坑:开发环境 AUTH 大开,镜像原样进生产。安全配置必须按环境分文件,而不是靠“没人知道 URL”。
💡 关键直觉:最小权限不只是菜单变灰。发布 DAG 的管道,才是真正的特权通道。

CSRF、HTTPS 终止、反向代理头,按 Web 应用常规做。API 与 UI 共用认证时,自动化账号不要借用真人会话。REST API v2 一类端点按需开通,不要把整张管理 API 暴露给数据科学笔记本。

多租户若只靠 DAG 前缀而没有队列与 IAM 隔离,只是心理隔离。真正隔离是分集群,或至少分 Worker 身份。

四、最小权限落地顺序

第一周:关闭公开角色,强制管理员账号,HTTPS,禁用 UI 里随意创建无主用户。第二周:角色拆 Viewer / 值班 / 作者 / Admin,DAG 按标签或前缀授权。第三周:连接密码单独权限,Variable 清秘密,Fernet 密钥备份与轮转演练。第四周:发布管道成为唯一生产写入 DAG 的路径,关掉或严格限制 UI 编辑。顺序反了,例如先上 OAuth 但仍人人 Admin,等于换了更方便的全权限登录。

执行侧:Worker 系统用户无 sudo、无云账号的管理员密钥。需要写对象存储就给最小桶策略,按环境拆。PythonOperator 的评审当代码执行评审,不只当 ETL 评审。禁止下载并 exec 远程脚本。发现一处就当事故,不当风格问题。

离职清单:吊销 UI、吊销 API token、检查该人创建的 Connection 是否移交、检查 owner 字段是否还指向个人。原文案例的核心是“删账号不等于删抽屉”。把移交写进清单,比事后在表里搜名字可靠。

审计日志保留期按合规。至少能回答:谁在何时触发了哪一窗、谁改了生产连接。答不出就还不是可审计,只是有界面。DAG Git 历史要能对上当时运行的版本摘要,否则审计只能证明“现在代码如此”,不能证明“那天如此”。

问题:分析师能不能有触发权?

预发可以,生产关键 DAG 不行,除非走值班角色且有变更窗口。触发权能补错窗、能打满 max_active_runs。只读看日志通常够分析师定位“数没到”。他们需要重跑,开工单让值班按窗口执行。把触发权当便利,会把权限模型冲垮。

问题:Fernet 密钥丢了怎么办?

连接密码无法解密,等于所有抽屉作废。所以密钥要有受控备份,轮转要双写过渡,不要只在一台机器的磁盘上。丢失后只能重新登记连接。把 Fernet 密钥当比数据库还重要的秘密来管,因为它解开的是所有其他秘密。

五、一次越权演练

用 Viewer 账号尝试触发生产 DAG、读取连接密码、导出变量,预期全部拒绝。用值班账号触发预发、不能改角色。用作者账号不能在 UI 保存生产 DAG(若你已关闭该入口)。演练失败就还不是 RBAC,只是菜单变灰的错觉。API token 用同一套用例再走一遍,UI 挡住而 API 放行是常见洞。演练记录进合规材料。Worker 侧另做一次:低权限系统用户是否无法写集群控制面。两边都过,分层防御才闭合。原文城堡模式的反面,就是这种定期撞门。不撞门的安全文档,只是愿望清单。愿望清不掉公开角色残留。

六、生产 DAG 的发布权清单

谁能合并到生产 DAG 目录或镜像;谁能取消暂停;谁能登记生产连接;谁能颁发 API token;谁能读连接密码。五列对人名,空着不准上线。空着的列会在事故里变成“大家都以为是别人”。发布权与取消暂停权应分开:合并不等于放行,对应 6.3 的暂停闸门。读密码的人应极少,且有审计。颁发 token 的人应能吊销。清单比 LDAP 组名重要,组名会腐化,清单要季度核对。核对发现离职未吊销,按事故处理,不是按行政疏漏处理。因为 token 还在,城堡门就还开着。开着的门不会因为你已经上了 OAuth 就自动关上。OAuth 管的是人登录,不管昨天发出去的机器令牌。机器令牌是 5.2 最容易被认证改造遗忘的角落。遗忘的角落里住着永久管理员。

七、机器令牌台账

每一枚 API token:谁申请、用途、过期、能否触发哪些 DAG、上次使用。离职与项目结束必须核对台账。台账没有的 token,发现即吊销。吊销是事故响应,不是日常。日常是台账。台账比 OAuth 改造更急,因为改造常忘机器。机器比人活得长。长过员工合同。合同结束,人走,令牌留。留下就是永久管理员。永久管理员是城堡后门。后门不在登录页。登录页已经 OAuth。后门在昨天的脚本。脚本在某人手写配置里。配置不进 Git。不进 Git 的令牌最危险。危险要用台账对抗。台账进 Git 或进保险库的元数据,不要进聊天记录。聊天记录会过期。过期后无人知。无人知的令牌会在审计年被翻出。翻出时已经用过未知次数。未知次数无法追责。无法追责则 RBAC 是演戏。演戏给登录看。登录很严。令牌很松。松的那一侧决定真实权限。真实权限要用台账管。管到能回答五列清单里“谁能颁发、谁能吊销”。回答不出,5.2 没毕业。毕业标准含越权演练加台账抽查。抽查每月。每月比季度核对更紧。更紧是因为令牌发行比人员变动勤。勤的东西要更勤的账。账勤,后门少。后门少,Dataset 再亮也不怕被未授权触发。怕的是无台账。无台账时所有高级调度都是给未知脚本准备的武器。武器要登记。登记在台账。台账在本节。本节把机器与人分开管。人走 SSO。机器走台账。两条都要。缺一条等于城堡只修了前门。前门很漂亮。后门仍开。开着就谈不上分层。分层是原文的防御纵深。纵深从台账补起。补起才能谈保险库。保险库管密码。台账管令牌。令牌触发 DAG。DAG 跑任意代码。任意代码是最高权。最高权必须有账。有账才结束 5.2。结束不是安全完成。完成不存在。存在的是可审计。可审计靠台账。台账要做。做了再睡。睡前吊销未知。未知即吊销。吊销是默认。默认比申请更安全。安全结束于默认拒绝。拒绝加台账。台账结束。

八、台账抽查与越权演练同月

每月同一周做两件事:抽三枚 token 核对台账,用 Viewer 撞一次生产触发。两件都过,5.2 当月存活。一件不过,当月安全状态为红,暂停新增 token。暂停是牙齿。牙齿防止在台账腐烂时继续发后门。后门比新功能急。急结束 OAuth 改造遗忘机器的窗口。窗口用同月两件事缩小。缩小结束永久管理员。永久管理员结束于吊销未知。未知即吊销。吊销结束默认。默认拒绝结束城堡后门。后门结束前门独美。独美结束演戏。演戏结束于登录很严令牌很松。松结束于台账。台账结束于同月两件事。两件事结束 5.2 的月度循环。循环结束一次性整改。整改结束运动。运动结束。分层活着。活着结束本节。

九、Viewer 撞门失败才算当月绿

演练若因环境忙取消,当月安全状态不得标绿。绿必须来自撞门记录。记录结束口头“应该拦得住”。应该结束。拦得住要撞。撞结束演戏。演戏结束当月。当月结束。

核心回顾

  • 关掉公开角色,认证接到企业身份
  • 读连接与读密码拆开,发布权当特权
  • Worker 跑的是评审过的代码,默认不可信输入
  • 秘密进保险库,Variable 只放开关
  • 日志按敏感字段约束
  • 审计覆盖触发、连接变更、发布

下一节把扩展面收束到 Provider 与插件,避免私自 copy 算子造成另一条供应链。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U