访问控制¶
Airflow Webserver UI 的访问控制由 Flask AppBuilder (FAB) 处理。请阅读其相关的 安全文档,了解其安全模型。
默认角色¶
Airflow 默认提供一组角色:管理员、用户、操作员、查看者和公共。默认情况下,只有 管理员
用户可以配置/更改角色的权限。但是,建议保持这些默认角色不变,而 管理员
用户如果需要更改,则创建具有所需权限的新角色。
公共¶
公共
用户(匿名)没有任何权限。
查看者¶
查看者
用户具有有限的读取权限
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),
]
用户¶
用户
用户具有 查看者
权限以及其他权限
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),
]
操作员¶
操作员
用户具有 用户
权限以及其他权限
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),
]
管理员¶
管理员
用户具有所有可能的权限,包括授予或撤销其他用户的权限。 管理员
用户具有 操作员
权限以及其他权限
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_read
和 can_edit
)的 View
。 can_dag_read
和 can_dag_edit
自 2.0.0 起已弃用)。有一个称为 DAGs
的特殊视图(在 1.10.* 版本中称为 all_dags
),它允许角色访问所有 DAG。默认的 Admin
、Viewer
、User
、Op
角色都可以访问 DAGs
视图。
该图片显示了只能写入 example_python_operator
的角色的创建。你还可以使用 airflow roles create
命令通过 CLI 创建角色,例如:
airflow roles create Role1 Role2
我们可以使用 airflow users add-role
CLI 命令将给定角色分配给新用户。
权限¶
警告
Airflow 允许您定义具有细粒度 RBAC 权限的自定义角色,供用户使用。但是,并非所有权限组合都完全一致,并且没有机制来确保分配的权限集完全一致。在某些情况下,特定资源的权限会重叠。一个很好的例子是菜单访问权限 - 缺少菜单访问权限不会自动禁用对菜单指向的功能的访问。另一个示例是访问角色视图,即使用户没有“用户视图”访问权限,也可以访问用户信息。当您无法访问用户时,添加对角色的访问权限是不一致的。
当您决定使用一组自定义基于资源的权限时,部署管理器应仔细检查授予角色的最终权限集是否符合预期。
基于资源的权限¶
从 2.0 版本开始,权限基于各个资源和针对这些资源的一小部分操作。资源与标准 Airflow 概念相匹配,例如 Dag
、DagRun
、Task
和 Connection
。操作包括 can_create
、can_read
、can_edit
和 can_delete
。
然后将权限(每个权限由资源 + 操作对组成)添加到角色中。
要访问端点,用户需要该端点分配的所有权限
有五个默认角色:公共、查看者、用户、操作员和管理员。每个角色都具有前一个角色的权限以及其他权限。
DAG 级权限¶
对于仅限 DAG 级别的权限,可以在所有 DAG 或单个 DAG 对象的级别控制访问。这包括 DAGs.can_read
、DAGs.can_edit
和 DAGs.can_delete
。列出这些权限时,将向拥有所列权限或对正在操作的特定 DAG 拥有相同权限的用户授予访问权限。对于单个 DAG,资源名称为 DAG:
+ DAG ID。
例如,如果用户尝试查看 example_dag_id
的 DAG 信息,并且端点需要 DAGs.can_read
访问权限,如果用户拥有 DAGs.can_read
或 DAG: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: *