使用 Airflow 界面访问权限控制

Cloud Composer 1 | Cloud Composer 2

本页面介绍了 Airflow 界面和 DAG 界面的各种访问权限控制机制。除了 IAM 提供的访问权限控制外,您还可以使用这些机制在您的环境的 Airflow 界面和 DAG 界面中分离用户。

Cloud Composer 中的 Airflow 界面访问权限控制概览

在 Cloud Composer 中,对 Airflow 界面DAG 界面的访问权限以及对这些界面中数据和操作的可见性在 Cloud Composer 中的两个级别进行控制:

  1. 对 Cloud Composer 中的 Airflow 界面和 DAG 界面的访问权限由 IAM 控制

    如果帐号没有可在项目中查看 Cloud Composer 环境的角色,则 Airflow 界面和 DAG 界面不可用。

    IAM 不会在 Airflow 界面或 DAG 界面中提供任何其他精细的权限控制。

  2. 借助 Apache Airflow 访问权限控制模型,您可以根据用户角色降低 Airflow 界面和 DAG 界面中的可见性。

    Apache Airflow 访问权限控制是 Airflow 的一项功能,它具有自己的用户、角色和权限模型,这与 IAM 不同。

Apache Airflow 访问权限控制使用基于资源的权限。拥有特定 Airflow 角色的所有 Airflow 用户都会获得此角色的权限。例如,具有 can delete on Connections 权限角色的 Airflow 用户可以在 Airflow 界面的“连接”页面上删除连接。

您还可以为各个 DAG 分配 DAG 级权限。例如,只有具有特定 Airflow 角色的用户才能在 Airflow 界面中查看特定 DAG。在 Cloud Composer 中,您可以根据 DAG 文件在环境存储桶中的子文件夹自动分配 DAG 级权限

准备工作

  • 包含访问权限控制的 Airflow 界面适用于 Cloud Composer 版本 1.13.4 或更高版本以及 Airflow 1.10.10 及更高版本。该环境还必须运行 Python 3。

  • 按文件夹注册角色适用于 Airflow 2 中的 Cloud Composer 1.18.12 及更高版本以及 Airflow 1 中的 Cloud Composer 1.13.4 及更高版本。

使用访问权限控制功能启用 Airflow 界面

Airflow 2

Airflow 2 中的带有访问权限控制的 Airflow 界面始终处于启用状态。

Airflow 1

如需启用带有访问权限控制的 Airflow 界面,请替换以下 Airflow 配置选项:

webserver rbac True

您可以为现有环境或在创建新环境时执行此操作。

使用此配置时,您的环境会运行带有访问权限控制的 Airflow 界面,而不是传统 Airflow 界面。

管理 Airflow 角色和访问权限控制设置

拥有 Admin 角色(或同等角色)的用户可以在 Airflow 界面中查看和修改访问权限控制设置。

在 Airflow 界面中,您可以通过安全性菜单配置访问权限控制设置。如需详细了解 Airflow 访问权限控制模型、可用权限和默认角色,请参阅 Airflow 界面访问权限控制文档

Airflow 1 将用户角色视为所有自定义角色的模板。Airflow 会继续将用户角色的权限复制到所有自定义角色(all_dags 的权限除外)。

Airflow 维护着自己的用户列表。拥有“管理员”角色(或同等角色)的用户可以查看已打开环境的 Airflow 界面并已在 Airflow 中注册的用户列表。此列表还包括由管理员手动预注册的用户,如以下部分所述。

在 Airflow 界面中注册用户

新用户在首次打开 Cloud Composer 环境的 Airflow 界面时会自动注册。

注册时,系统会为用户授予 [webserver]rbac_user_registration_role Airflow 配置选项中指定的角色。您可以使用其他值替换此 Airflow 配置选项来控制新注册用户的角色。

如果未指定,在具有 Airflow 2 的环境中,默认注册角色为 Op

在提供 Airflow 1.10.* 的环境中,默认注册角色为 Admin

如需为 Airflow 界面创建基本角色配置,建议执行以下步骤:

Airflow 2

  1. 环境管理员会打开新创建的环境的 Airflow 界面。

  2. 为管理员账号授予 Admin 角色。在具有 Airflow 2 的环境中,新账号的默认角色为 Op。如需分配 Admin 角色,请使用 gcloud 运行以下 Airflow CLI 命令

      gcloud composer environments run ENVIRONMENT_NAME \
        --location LOCATION \
        users add-role -- -e USER_EMAIL -r Admin
    

    您需要在其中:

    • ENVIRONMENT_NAME 替换为环境的名称。
    • LOCATION 替换为环境所在的区域。
    • USER_EMAIL 替换为用户账号的电子邮件地址。
  3. 管理员现在可以为新用户配置访问权限控制,包括向其他用户授予 Admin 角色。

Airflow 1

  1. 环境管理员会打开新创建的环境的 Airflow 界面,系统将自动为其注册 Admin 角色。

  2. 将以下 Airflow 配置选项替换为新用户所需的角色。例如,替换为 User

    部分
    webserver rbac_user_registration_role User 或其他非管理员角色
  3. 管理员现在可以为新用户配置 Airflow 界面访问权限控制,包括向其他用户授予 Admin 角色。

预注册用户

系统会自动使用 Google 用户帐号的数字 ID(而不是电子邮件地址)注册用户作为用户名。您也可以手动预注册用户并为其分配角色,方法是添加用户记录,并将用户名字段设置为用户的主电子邮件地址。当电子邮件地址与预注册用户记录匹配的用户首次登录 Airflow 界面时,他们的用户名会被替换为当前(首次登录时)由其电子邮件地址标识的用户 ID。Google 身份(电子邮件地址)与用户帐号(用户 ID)之间的关系不固定。Google 网上论坛无法预注册。

如需预注册用户,您可以使用 Airflow 界面或通过 Google Cloud CLI 运行 Airflow CLI 命令。

如需通过 Google Cloud CLI 为用户预注册自定义角色,请运行以下 Airflow CLI 命令

gcloud composer environments run ENVIRONMENT_NAME \
  --location LOCATION \
  users create -- \
  -r ROLE \
  -e USER_EMAIL \
  -u USER_EMAIL \
  -f FIRST_NAME \
  -l LAST_NAME \
  --use-random-password # The password value is required, but is not used

替换以下内容:

  • ENVIRONMENT_NAME:环境的名称
  • LOCATION:环境所在的区域
  • ROLE:用户的 Airflow 角色,例如 Op
  • USER_EMAIL:用户的电子邮件地址
  • FIRST_NAMELAST_NAME:用户的名字和姓氏

示例:

gcloud composer environments run example-environment \
  --location us-central1 \
  users create -- \
  -r Op \
  -e "example-user@example.com" \
  -u "example-user@example.com" \
  -f "Name" \
  -l "Surname" \
  --use-random-password

移除用户

从 Airflow 中删除用户不会撤消该用户的访问权限,因为当用户下次访问 Airflow 界面时,系统会自动重新注册。如需撤消对整个 Airflow 界面的访问权限,请从项目的允许政策中移除 composer.environments.get 权限。

您还可以将用户的角色更改为“公开”,这样可以保留用户的注册状态,但会移除 Airflow 界面的所有权限。

自动配置 DAG 级权限

“按文件夹注册角色”功能会自动直接为 /dags 文件夹中的每个子文件夹创建一个自定义 Airflow 角色,并向其授予对相应子文件夹中存储了源文件的所有 DAG 授予此角色 DAG 级访问权限。这样可以简化自定义 Airflow 角色及其对 DAG 的访问权限的管理。

按文件夹注册角色的工作原理

按文件夹注册角色是一种自动配置角色及其 DAG 级权限的方式。因此,这可能会导致与授予 DAG 级别权限的其他 Airflow 机制发生冲突:

为防止出现此类冲突,启用文件夹级角色注册也会更改这些机制的行为。

在 Airflow 1 中,如果启用了“按文件夹注册角色”,则无法使用这些机制。所有 DAG 级权限管理都只能通过注册每个文件夹的角色进行。

在 Airflow 2 中:

  • 您可以通过 DAG 源代码中定义的 access_control 属性为角色授予 DAG 访问权限。
  • 手动授予 DAG 权限(通过 Airflow 界面或 gcloud CLI)可能会导致冲突。例如,如果您手动向文件夹级角色授予 DAG 级别权限,则在 DAG 处理器同步 DAG 时,这些权限可能会被移除或覆盖。建议您不要手动授予 DAG 权限。
  • 角色拥有通过文件夹角色注册并在 DAG 的 access_control 属性中定义的 DAG 访问权限的集合。

直接位于顶层 /dags 文件夹中的 DAG 不会自动分配给任何文件夹角色。不能通过任何文件夹级角色访问它们。Admin、Op、User 等其他角色或已获权限的任何自定义角色均可通过 Airflow 界面和 DAG 界面访问这些角色。

如果您将 DAG 上传到名称与 Cloud Composer 的内置 Airflow 角色和角色相符的子文件夹,则这些子文件夹中的 DAG 权限仍会分配给这些角色。例如,如果将 DAG 上传到 /dags/Admin 文件夹,则会为此 DAG 授予 Admin 角色权限。内置 Airflow 角色包括 Admin、Op、User、Viewer 和 Public。启用“按文件夹注册角色”功能后,Cloud Composer 会创建 NoDag 和 UserNoDags。

在 Airflow 调度器中处理 DAG 时,Airflow 会按文件夹进行角色注册。如果您的环境中的 DAG 超过一百个,您可能会看到 DAG 解析时间增加。如果是这种情况,对于 Airflow 1 环境,我们建议提高 [scheduler]max_threads 参数;对于 Airflow 2,建议提高 [scheduler]parsing_processes

自动将 DAG 分配给每个文件夹的角色

如需自动将 DAG 分配给每个文件夹的角色,请执行以下操作:

  1. 替换以下 Airflow 配置选项:

    部分
    webserver rbac_autoregister_per_folder_roles True
  2. 将新用户注册角色更改为无权访问任何 DAG 的角色。 这样,在管理员为其帐号分配具有特定 DAG 权限的角色之前,新用户将无法访问任何 DAG。

    仅当启用了“按文件夹注册角色”功能时,UserNoDags 和 NoDags 是由 Cloud Composer 创建的角色。此角色相当于 User 角色,但无权访问任何 DAG。UserNoDags 角色在 Airflow 2 中创建,而 NoDags 角色在 Airflow 1 中创建。

    在 Airflow 2 中,请替换以下 Airflow 配置选项:

    webserver rbac_user_registration_role UserNoDags

    在 Airflow 1 中,请替换以下 Airflow 配置选项:

    webserver rbac_user_registration_role NoDags
  3. 确保用户已在 Airflow 中注册

  4. 使用以下方法之一为用户分配角色:

    • 让 Airflow 根据 DAG 子文件夹自动创建角色,然后为用户分配这些角色。
    • 为 DAG 子文件夹预先创建空角色(角色名称与子文件夹的名称一致),然后将用户分配给这些角色。例如,对于 /dags/CustomFolder 文件夹,创建一个名为 CustomFolder 的角色。
  5. 将 DAG 上传到名称与分配给用户的角色一致的子文件夹。这些子文件夹必须位于环境存储桶的 /dags 文件夹中。Airflow 会为此类子文件夹中的 DAG 添加权限,以便只有具有相应角色的用户才能通过 Airflow 界面和 DAG 界面访问这些 DAG。

手动配置 DAG 级权限

您可以为自定义角色配置 DAG 级权限,以指定哪些 DAG 对特定用户组可见。

如需在 Airflow 界面中配置 DAG 级权限,请执行以下操作:

  1. Admin 会创建空角色来对 DAG 进行分组。
  2. 管理员为用户分配适当的角色。
  3. 管理员或用户负责为角色分配 DAG。
  4. 在 Airflow 界面中,用户只能查看分配给其群组的 DAG。

您可以通过 DAG 属性或从 Airflow 界面将 DAG 分配给角色。

在 Airflow 界面中为角色分配 DAG

管理员可以将所需的 DAG 级权限分配给 Airflow 界面中的相应角色。

DAG 界面不支持此操作。

将 DAG 分配给 DAG 属性中的角色

您可以在 DAG 上设置 access_control DAG 参数,并指定 DAG 所属的 DAG 分组角色。

在版本低于 2.1.0 的 Airflow 2 中,管理员、DAG 开发者或自动化流程必须运行 sync-perm Airflow 命令才能应用新的访问权限控制设置。

在 Airflow 2.1.0 及更高版本中,不再需要运行此命令,因为调度器在解析 DAG 时会应用 DAG 级权限。

Airflow 2

dag = DAG(
  access_control={
    'DagGroup': {'can_edit', 'can_read'},
  },
  ...
  )

Airflow 1

dag = DAG(
  access_control={
    'DagGroup': {'can_dag_edit', 'can_dag_read'},
  },
  ...
  )

将 Airflow 界面中的审核日志映射到用户

Airflow 界面中的审核日志会映射到 Google 用户帐号的数字 ID。例如,如果用户暂停了某个 DAG,系统会在日志中添加一个条目。

Airflow 2

在 Airflow 2 中,您可以在 Airflow 界面的浏览 > 审核日志页面上查看审核日志。

Airflow 2 中“审核日志”页面上的条目
图 1:Airflow 2 中“审核日志”页面上的条目

Airflow 1

在 Airflow 1 中,您可以在浏览 > 日志页面上查看审核日志。

Airflow 1 中“日志”页面上的条目
图 1:Airflow 1 中“日志”页面上的条目

典型条目会在所有者字段中列出数字 ID:accounts.google.com:NUMERIC_ID。您可以在安全性 > 列出用户页面上将数字 ID 映射到用户电子邮件地址。具有 Admin 角色的用户可以查看此页面。

请注意,Google 身份(电子邮件地址)和用户帐号(用户 ID)之间的关系是不固定的。

后续步骤