访问控制

Airflow Webserver UI 的访问控制由 Flask AppBuilder (FAB) 处理。请阅读其相关的 安全文档,了解其安全模型。

默认角色

Airflow 默认提供一组角色:管理员、用户、操作员、查看者和公共。默认情况下,只有 管理员 用户可以配置/更改角色的权限。但是,建议保持这些默认角色不变,而 管理员 用户如果需要更改,则创建具有所需权限的新角色。

公共

公共 用户(匿名)没有任何权限。

查看者

查看者 用户具有有限的读取权限

airflow/providers/fab/auth_manager/security_manager/override.py[源代码]

    VIEWER_PERMISSIONS = [
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_DEPENDENCIES),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_CODE),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_RUN),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_DATASET),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_CLUSTER_ACTIVITY),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_POOL),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_IMPORT_ERROR),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_DAG_WARNING),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_JOB),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_MY_PASSWORD),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_MY_PASSWORD),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_MY_PROFILE),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_MY_PROFILE),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_SLA_MISS),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_TASK_INSTANCE),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_TASK_LOG),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_XCOM),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_WEBSITE),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_BROWSE_MENU),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_DAG),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_DAG_DEPENDENCIES),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_DAG_RUN),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_DATASET),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_CLUSTER_ACTIVITY),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_DOCS),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_DOCS_MENU),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_JOB),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_SLA_MISS),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_TASK_INSTANCE),
    ]

用户

用户 用户具有 查看者 权限以及其他权限

airflow/providers/fab/auth_manager/security_manager/override.py[源代码]

    USER_PERMISSIONS = [
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_DAG),
        (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_DAG),
        (permissions.ACTION_CAN_CREATE, permissions.RESOURCE_TASK_INSTANCE),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_TASK_INSTANCE),
        (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_TASK_INSTANCE),
        (permissions.ACTION_CAN_CREATE, permissions.RESOURCE_DAG_RUN),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_DAG_RUN),
        (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_DAG_RUN),
        (permissions.ACTION_CAN_CREATE, permissions.RESOURCE_DATASET),
    ]

操作员

操作员 用户具有 用户 权限以及其他权限

airflow/providers/fab/auth_manager/security_manager/override.py[源代码]

    OP_PERMISSIONS = [
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_CONFIG),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_ADMIN_MENU),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_CONFIG),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_CONNECTION),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_POOL),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_PLUGIN),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_VARIABLE),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_PROVIDER),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_XCOM),
        (permissions.ACTION_CAN_CREATE, permissions.RESOURCE_CONNECTION),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_CONNECTION),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_CONNECTION),
        (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_CONNECTION),
        (permissions.ACTION_CAN_CREATE, permissions.RESOURCE_POOL),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_POOL),
        (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_POOL),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_PLUGIN),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_PROVIDER),
        (permissions.ACTION_CAN_CREATE, permissions.RESOURCE_VARIABLE),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_VARIABLE),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_VARIABLE),
        (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_VARIABLE),
        (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_XCOM),
        (permissions.ACTION_CAN_DELETE, permissions.RESOURCE_DATASET),
        (permissions.ACTION_CAN_CREATE, permissions.RESOURCE_DATASET),
    ]

管理员

管理员 用户具有所有可能的权限,包括授予或撤销其他用户的权限。 管理员 用户具有 操作员 权限以及其他权限

airflow/providers/fab/auth_manager/security_manager/override.py[源代码]

    ADMIN_PERMISSIONS = [
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_AUDIT_LOG),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_AUDIT_LOG),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_TASK_RESCHEDULE),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_TASK_RESCHEDULE),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_TRIGGER),
        (permissions.ACTION_CAN_ACCESS_MENU, permissions.RESOURCE_TRIGGER),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_PASSWORD),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_PASSWORD),
        (permissions.ACTION_CAN_READ, permissions.RESOURCE_ROLE),
        (permissions.ACTION_CAN_EDIT, permissions.RESOURCE_ROLE),
    ]

自定义角色

DAG 级别角色

Admin 可以创建一组角色,这些角色仅被允许查看一组特定的 DAG。这称为 DAG 级别访问。DAG 模型表中定义的每个 DAG 都被视为具有两个关联权限(can_readcan_edit)的 Viewcan_dag_readcan_dag_edit 自 2.0.0 起已弃用)。有一个称为 DAGs 的特殊视图(在 1.10.* 版本中称为 all_dags),它允许角色访问所有 DAG。默认的 AdminViewerUserOp 角色都可以访问 DAGs 视图。

../_images/add-role.png ../_images/new-role.png

该图片显示了只能写入 example_python_operator 的角色的创建。你还可以使用 airflow roles create 命令通过 CLI 创建角色,例如:

airflow roles create Role1 Role2

我们可以使用 airflow users add-role CLI 命令将给定角色分配给新用户。

权限

警告

Airflow 允许您定义具有细粒度 RBAC 权限的自定义角色,供用户使用。但是,并非所有权限组合都完全一致,并且没有机制来确保分配的权限集完全一致。在某些情况下,特定资源的权限会重叠。一个很好的例子是菜单访问权限 - 缺少菜单访问权限不会自动禁用对菜单指向的功能的访问。另一个示例是访问角色视图,即使用户没有“用户视图”访问权限,也可以访问用户信息。当您无法访问用户时,添加对角色的访问权限是不一致的。

当您决定使用一组自定义基于资源的权限时,部署管理器应仔细检查授予角色的最终权限集是否符合预期。

基于资源的权限

从 2.0 版本开始,权限基于各个资源和针对这些资源的一小部分操作。资源与标准 Airflow 概念相匹配,例如 DagDagRunTaskConnection。操作包括 can_createcan_readcan_editcan_delete

然后将权限(每个权限由资源 + 操作对组成)添加到角色中。

要访问端点,用户需要该端点分配的所有权限

有五个默认角色:公共、查看者、用户、操作员和管理员。每个角色都具有前一个角色的权限以及其他权限。

DAG 级权限

对于仅限 DAG 级别的权限,可以在所有 DAG 或单个 DAG 对象的级别控制访问。这包括 DAGs.can_readDAGs.can_editDAGs.can_delete。列出这些权限时,将向拥有所列权限或对正在操作的特定 DAG 拥有相同权限的用户授予访问权限。对于单个 DAG,资源名称为 DAG: + DAG ID。

例如,如果用户尝试查看 example_dag_id 的 DAG 信息,并且端点需要 DAGs.can_read 访问权限,如果用户拥有 DAGs.can_readDAG:example_dag_id.can_read 访问权限,则将授予访问权限。

稳定 API 权限

端点

方法

权限

最低角色

/config

GET

Configurations.can_read

操作员

/connections

GET

Connections.can_read

操作员

/connections

POST

Connections.can_create

操作员

/connections/{connection_id}

DELETE

Connections.can_delete

操作员

/connections/{connection_id}

PATCH

Connections.can_edit

操作员

/connections/{connection_id}

GET

Connections.can_read

操作员

/dagSources/{file_token}

GET

DAG Code.can_read

查看者

/dags

GET

DAGs.can_read

查看者

/dags/{dag_id}

GET

DAGs.can_read

查看者

/dags/{dag_id}

PATCH

DAGs.can_edit

用户

/dags/{dag_id}/clearTaskInstances

POST

DAGs.can_edit, DAG Runs.can_read, Task Instances.can_edit

用户

/dags/{dag_id}/details

GET

DAGs.can_read

查看者

/dags/{dag_id}/tasks

GET

DAGs.can_read, Task Instances.can_read

查看者

/dags/{dag_id}/tasks/{task_id}

GET

DAGs.can_read, Task Instances.can_read

查看者

/dags/{dag_id}/dagRuns

GET

DAGs.can_read, DAG Runs.can_read

查看者

/dags/{dag_id}/dagRuns

POST

DAGs.can_edit, DAG Runs.can_create

用户

/dags/{dag_id}/dagRuns/{dag_run_id}

DELETE

DAGs.can_edit, DAG Runs.can_delete

用户

/dags/{dag_id}/dagRuns/{dag_run_id}

GET

DAGs.can_read, DAG Runs.can_read

查看者

/dags/~/dagRuns/list

POST

DAGs.can_edit, DAG Runs.can_read

用户

/datasets

GET

Datasets.can_read

查看者

/datasets/{uri}

GET

Datasets.can_read

查看者

/datasets/events

GET

Datasets.can_read

查看者

/eventLogs

GET

Audit Logs.can_read

查看者

/eventLogs/{event_log_id}

GET

Audit Logs.can_read

查看者

/importErrors

GET

ImportError.can_read

查看者

/importErrors/{import_error_id}

GET

ImportError.can_read

查看者

/health

GET

公开

/version

GET

公开

/pools

GET

Pools.can_read

操作员

/pools

POST

Pools.can_create

操作员

/pools/{pool_name}

DELETE

Pools.can_delete

操作员

/pools/{pool_name}

GET

Pools.can_read

操作员

/pools/{pool_name}

PATCH

Pools.can_edit

操作员

/providers

GET

Providers.can_read

操作员

/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances

GET

DAGs.can_read, DAG Runs.can_read, Task Instances.can_read

查看者

/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}

GET

DAGs.can_read, DAG Runs.can_read, Task Instances.can_read

查看者

/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/links

GET

DAGs.can_read, DAG Runs.can_read, Task Instances.can_read

查看者

/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/logs/{task_try_number}

GET

DAGs.can_read, DAG Runs.can_read, Task Instances.can_read

查看者

/dags/~/dagRuns/~/taskInstances/list

POST

DAGs.can_edit, DAG Runs.can_read, Task Instances.can_read

用户

/variables

GET

Variables.can_read

操作员

/variables

POST

Variables.can_create

操作员

/variables/{variable_key}

DELETE

变量.可删除

操作员

/variables/{variable_key}

GET

Variables.can_read

操作员

/variables/{variable_key}

PATCH

变量.可编辑

操作员

/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries

GET

DAG.可读,DAG 运行.可读,任务实例.可读,XCom.可读

查看者

/dags/{dag_id}/dagRuns/{dag_run_id}/taskInstances/{task_id}/xcomEntries/{xcom_key}

GET

DAG.可读,DAG 运行.可读,任务实例.可读,XCom.可读

查看者

/users

GET

用户.可读

管理员

/users

POST

用户.可创建

管理员

/users/{username}

GET

用户.可读

管理员

/users/{username}

PATCH

用户.可编辑

管理员

/users/{username}

DELETE

用户.可删除

管理员

/roles

GET

角色.可读

管理员

/roles

POST

角色.可创建

管理员

/roles/{role_name}

GET

角色.可读

管理员

/roles/{role_name}

PATCH

角色.可编辑

管理员

/roles/{role_name}

DELETE

角色.可删除

管理员

/permissions

GET

权限视图.可读

管理员

网站权限

操作

权限

最低角色

访问主页

网站.可读

查看者

显示浏览菜单

浏览.菜单访问

查看者

显示 DAG 菜单

DAG.菜单访问

查看者

获取 DAG 统计信息

DAGs.can_read, DAG Runs.can_read

查看者

显示任务实例菜单

任务实例.菜单访问

查看者

获取任务统计信息

DAGs.can_read, DAG Runs.can_read, Task Instances.can_read

查看者

获取上次 DAG 运行

DAGs.can_read, DAG Runs.can_read

查看者

获取 DAG 代码

DAG.可读,DAG 代码.可读

查看者

获取 DAG 详情

DAGs.can_read, DAG Runs.can_read

查看者

显示 DAG 依赖项菜单

DAG 依赖项.菜单访问

查看者

获取 DAG 依赖项

DAG 依赖项.可读

查看者

获取呈现的 DAG

DAGs.can_read, Task Instances.can_read

查看者

获取带元数据的日志

DAG.可读,任务实例.可读,任务日志.可读

查看者

获取日志

DAG.可读,任务实例.可读,任务日志.可读

查看者

重定向到外部日志

DAG.可读,任务实例.可读,任务日志.可读

查看者

获取任务

DAGs.can_read, Task Instances.can_read

查看者

显示 XCom 菜单

XCom.菜单访问

操作员

获取 XCom

DAG.可读,任务实例.可读,XCom.可读

查看者

创建 XCom

XCom.可创建

操作员

删除 XCom

XCom.可删除

操作员

触发任务实例

DAG.可编辑,任务实例.可创建

用户

删除 DAG

DAG.可删除

用户

显示 DAG 运行菜单

DAG 运行.菜单访问

查看者

触发 DAG 运行

DAGs.can_edit, DAG Runs.can_create

用户

清除 DAG

DAG.可编辑,任务实例.可删除

用户

清除 DAG 运行

DAG.可编辑,任务实例.可删除

用户

将 DAG 标记为已阻止

DAG.可编辑,DAG 运行.可读

用户

将 DAG 运行标记为失败

DAG.可编辑,DAG 运行.可编辑

用户

将 DAG 运行标记为成功

DAG.可编辑,DAG 运行.可编辑

用户

将任务标记为失败

DAG.可编辑,任务实例.可编辑

用户

将任务标记为成功

DAG.可编辑,任务实例.可编辑

用户

获取 DAG 作为树

DAG.可读,任务实例.可读,任务日志.可读

查看者

获取 DAG 作为图形

DAG.可读,任务实例.可读,任务日志.可读

查看者

获取 DAG 作为持续时间图形

DAGs.can_read, Task Instances.can_read

查看者

显示所有尝试

DAGs.can_read, Task Instances.can_read

查看者

显示着陆时间

DAGs.can_read, Task Instances.can_read

查看者

切换 DAG 暂停状态

DAGs.can_edit

用户

显示甘特图

DAGs.can_read, Task Instances.can_read

查看者

获取外部链接

DAGs.can_read, Task Instances.can_read

查看者

显示任务实例

DAGs.can_read, Task Instances.can_read

查看者

显示配置菜单

配置.菜单访问

操作员

显示配置

Configurations.can_read

查看者

删除多条记录

DAGs.can_edit

用户

将任务实例设置为正在运行

DAGs.can_edit

用户

将任务实例设置为失败

DAGs.can_edit

用户

将任务实例设置为成功

DAGs.can_edit

用户

将任务实例设置为 up_for_retry

DAGs.can_edit

用户

自动完成

DAGs.can_read

查看者

显示数据集菜单

数据集.菜单访问

查看者

显示数据集

Datasets.can_read

查看者

显示文档菜单

Docs.menu_access

查看者

显示文档菜单

Documentation.menu_access

查看者

显示作业菜单

Jobs.menu_access

查看者

显示审计日志

Audit Logs.menu_access

查看者

重置密码

My Password.can_read, My Password.can_edit

查看者

显示权限菜单

Permission Views.menu_access

管理员

列出权限

权限视图.可读

管理员

获取我的个人资料

My Profile.can_read

查看者

更新我的个人资料

My Profile.can_edit

查看者

列出日志

Audit Logs.can_read

查看者

列出作业

Jobs.can_read

查看者

显示 SLA 缺失菜单

SLA Misses.menu_access

查看者

列出 SLA 缺失

SLA Misses.can_read

查看者

列出插件

Plugins.can_read

查看者

显示插件菜单

Plugins.menu_access

查看者

显示提供程序菜单

Providers.menu_access

操作员

列出提供程序

Providers.can_read

操作员

列出任务重新调度

Task Reschedules.can_read

管理员

显示触发器菜单

Triggers.menu_access

管理员

列出触发器

Triggers.can_read

管理员

显示管理员菜单

Admin.menu_access

查看者

显示连接菜单

Connections.menu_access

操作员

显示池菜单

Pools.menu_access

查看者

显示变量菜单

Variables.menu_access

操作员

显示角色菜单

Roles.menu_access

管理员

列出角色

角色.可读

管理员

创建角色

角色.可创建

管理员

更新角色

角色.可编辑

管理员

删除角色

角色.可删除

管理员

显示用户菜单

Users.menu_access

管理员

创建用户

用户.可创建

管理员

更新用户

用户.可编辑

管理员

删除用户

用户.可删除

管理员

重置用户密码

Passwords.can_edit, Passwords.can_read

管理员

这些 DAG 级控件可以通过 UI/CLI 直接设置,或通过 access_control 参数编码到 DAG 本身中。

DAG 级权限的优先顺序

由于 DAG 级访问控制可以在多个地方配置,因此冲突不可避免,并且需要明确的解决策略。因此,Airflow 认为 DAG 本身提供的 access_control 参数(如果存在)具有完全权威性,这会产生一些影响

在 DAG 上设置 access_control 将覆盖任何先前存在的 DAG 级别的权限,如果其值为 None 以外的任何值

DAG(
    dag_id="example_fine_grained_access",
    start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
    access_control={
        "Viewer": {"can_edit", "can_read", "can_delete"},
    },
)

这也意味着设置 access_control={} 将从 DB 中清除给定 DAG 的任何现有的 DAG 级别的权限

DAG(
    dag_id="example_no_fine_grained_access",
    start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
    access_control={},
)

相反,从 DAG 中完全删除 access_control 块(或将其设置为 None)不会进行任何更改,并且可能会留下悬空的权限。

DAG(
    dag_id="example_indifferent_to_fine_grained_access",
    start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
)

在 DAG 本身没有定义 access_control 的情况下,Airflow 将推迟到 DB 中定义的现有权限,这些权限可能已通过 UI、CLI 或先前在有问题的 DAG 上的 access_control 参数设置。

在所有情况下,系统范围的角色(例如 Can edit on DAG)优先于 DAG 级别的访问控制,因此它们可以被视为 Can edit on DAG: *

此条目是否有帮助?