You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制对airflow.models的访问 实现多租户DagRun元数据权限隔离

Airflow多租户DagRun元数据权限隔离实现方案

核心思路是从身份校验、查询入口拦截、行级数据过滤三个层面做全链路权限控制,避免租户越权访问非自有DAG的运行元数据

具体实现步骤如下:

  • 第一步:统一DAG租户标识规则
    要求所有租户上传的DAG必须在配置中添加唯一的tenant_id标签,平台侧可以在DAG入库扫描阶段校验该标签的合法性,防止租户冒充其他身份。
  • 第二步:开启Airflow行级权限控制
    Airflow 2.x及以上版本自带基于FAB的行级安全(Row Level Security)能力,你可以直接给DagRun、DAG等核心表配置过滤规则,绑定租户角色后,用户无论通过UI、API还是代码调用查询DagRun数据,都会自动过滤掉非所属租户的记录,越权查询时会返回空结果或权限报错。
    如果你使用的是1.x版本无行级权限能力,可以自行封装统一的元数据查询工具类,所有DagRun相关查询必须走该工具类,工具类内部强制添加tenant_id过滤条件,禁止租户直接调用原生的DagRun查询接口。
  • 第三步:改造自定义宏函数,拦截非法查询
    你原本的宏函数允许租户传入任意DAG对象,存在越权风险,改造后直接从执行上下文取当前运行的DAG,并增加租户身份校验,改造后的示例代码如下:
    from airflow.exceptions import AirflowSecurityException
    
    def get_current_dag_last_run_end_date(**context):
        # 从执行上下文获取当前运行的DAG,禁止用户传入任意DAG对象
        current_dag = context["dag"]
        # 获取当前执行用户所属租户、当前DAG绑定的租户
        current_user_tenant = context["user"].extra.get("tenant_id")
        dag_tenant = current_dag.tags.get("tenant_id")
        # 租户身份校验不通过直接抛权限异常
        if not current_user_tenant or not dag_tenant or current_user_tenant != dag_tenant:
            raise AirflowSecurityException("无权限访问该DAG的运行元数据")
        last_dag_run = current_dag.get_last_dagrun()
        return last_dag_run.end_date if last_dag_run else None
    
  • 第四步:物理隔离DAG目录
    给每个租户分配独立的DAG上传目录,限制租户的文件访问权限,仅能修改自有目录下的DAG文件,避免租户篡改DAG的tenant_id标签伪造身份。
  • 第五步:禁止直接访问元数据库
    关闭租户自定义代码访问Airflow元数据库的权限,所有元数据查询必须走平台封装的安全接口或宏,避免租户直接执行SQL拉取全量DagRun数据。

内容的提问来源于stack exchange,提问作者Sturdier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 17:09:05