使用 AWS 身份验证管理器管理 Airflow 环境

使用 AWS 身份验证管理器时,所有用户及其权限不再由 Airflow 中默认的 Flask 身份验证管理器管理,而是通过 AWS IAM Identity Center(用户)和 Amazon Verified Permissions(权限)这两项不同的服务,通过基于 AWS 的授权集成进行管理。

通过 AWS IAM Identity Center 管理用户

用户

所有有权访问 Airflow 环境的用户都必须在 AWS IAM Identity Center 中定义。您可以使用 AWS IAM Identity Center 作为身份源,也可以将其作为身份源(例如 Active Directory)与 Airflow 环境之间的代理。 有关如何管理身份源的更多详细信息,请参阅文档

您可以按照以下步骤查看 AWS IAM Identity Center 中定义的用户列表。

  1. 打开 IAM Identity Center 控制台

  2. 选择“用户”。

您可以在 AWS IAM Identity Center 中使用组将用户分组到逻辑实体中(例如,按团队、部门等)。之后,可以在 Amazon Verified Permissions 中使用这些组为用户组分配权限。 请参阅文档以了解如何将用户添加到组

您可以按照以下步骤查看 AWS IAM Identity Center 中定义的组列表。

  1. 打开 IAM Identity Center 控制台

  2. 选择“组”。

将用户和组分配给 Airflow 环境

注意

AWS IAM Identity Center 中定义的所有用户和组都没有自动访问 Airflow 环境的权限。您需要手动分配哪些用户可以访问 Airflow。

要将用户和组分配给 Airflow,请按照以下步骤操作。

  1. 打开 IAM Identity Center 控制台

注意

如果您在 AWS Managed Microsoft AD 中管理用户,请确保在执行下一步之前,IAM Identity Center 控制台使用的是 AWS Managed Microsoft AD 目录所在的 AWS 区域。

  1. 选择“应用程序”。

  2. 选择“客户管理”选项卡。

  3. 在应用程序列表中,选择应用程序名称 Airflow

  4. 在应用程序详细信息页面上的“已分配的用户和组”部分中,选择“分配用户和组”。

  5. 在“分配用户或组”页面上,选择要分配给 Airflow 的不同用户和组。您还可以搜索用户和组。您可以通过在搜索结果中选择适用的帐户来指定多个用户或组。

  6. 选择“分配用户”。

通过 Amazon Verified Permissions 管理用户权限

AWS 身份验证管理器使用 Amazon Verified Permissions 来定义和验证用户权限。它使用 Cedar 语言 为用户定义细粒度的权限。AWS 身份验证管理器使用一个策略存储来存储与 Airflow 环境相关的所有策略。要管理这些策略,请按照以下步骤操作。

  1. 打开 Amazon Verified Permissions 控制台

  2. 选择 Airflow 使用的策略存储(默认情况下,其描述为 Airflow)。

  3. 在左侧导航窗格中,选择“策略”。

  4. 在“策略”页面上,您可以看到策略列表。要创建新策略,请按照以下步骤操作。

  1. 选择“创建策略”。

  2. 在“创建策略”下,选择“创建静态策略”。

策略格式

策略是使用 Amazon Verified Permissions 中的 Cedar 语言定义的。有关完整文档,请参阅 Cedar 语言网站。在 Cedar 语言中,策略由三个元素组成

  • **主体**。谁在发出请求?

  • **操作**。主体想要执行什么操作?

  • **资源**。主体想要对什么执行操作?

在 Airflow 环境的上下文中,这三个元素中的每一个都只允许一组特定的值。您可以按照以下步骤查看策略存储架构中的主体、操作和资源列表。

  1. 打开 Amazon Verified Permissions 控制台

  2. 选择 Airflow 使用的策略存储(默认情况下,其描述为 Airflow)。

  3. 在左侧导航窗格中,选择“架构”。

策略示例

以下是一些您可以在 Amazon Verified Permissions 中定义的策略示例。您可以修改和/或组合它们以创建您自己的定制策略。

授予特定用户所有权限

permit(
  principal == Airflow::User::"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
  action,
  resource
);

注意

您必须使用用户 ID 而不是用户名或任何其他属性来引用用户。您可以在 AWS IAM Identity Center 中找到用户 ID。

授予用户组所有权限

这相当于 Flask AppBuilder 中的管理员角色

permit(
  principal in Airflow::Group::"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
  action,
  resource
);

注意

您必须使用组 ID 而不是名称来引用组。您可以在 AWS IAM Identity Center 中找到组 ID。

授予用户组只读权限

这相当于 Flask AppBuilder 中的查看者角色

permit(
  principal in Airflow::Group::"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
  action in [
    Airflow::Action::"Configuration.GET",
    Airflow::Action::"Connection.GET",
    Airflow::Action::"Custom.GET",
    Airflow::Action::"Dag.GET",
    Airflow::Action::"Menu.MENU",
    Airflow::Action::"Pool.GET",
    Airflow::Action::"Variable.GET",
    Airflow::Action::"Dataset.GET",
    Airflow::Action::"View.GET"
  ],
  resource
);

授予用户组标准 Airflow 用户权限

这相当于 Flask AppBuilder 中的用户角色

permit(
  principal in Airflow::Group::"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
  action in [
    Airflow::Action::"Configuration.GET",
    Airflow::Action::"Connection.GET",
    Airflow::Action::"Custom.GET",
    Airflow::Action::"Dag.GET",
    Airflow::Action::"Menu.MENU",
    Airflow::Action::"Pool.GET",
    Airflow::Action::"Variable.GET",
    Airflow::Action::"Dataset.GET",
    Airflow::Action::"View.GET",
    Airflow::Action::"Dag.POST",
    Airflow::Action::"Dag.PUT",
    Airflow::Action::"Dag.DELETE",
  ],
  resource
);

授予用户组操作权限

这相当于 Flask AppBuilder 中的操作员角色

permit(
  principal in Airflow::Group::"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
  action in [
    Airflow::Action::"Configuration.GET",
    Airflow::Action::"Connection.GET",
    Airflow::Action::"Custom.GET",
    Airflow::Action::"Dag.GET",
    Airflow::Action::"Menu.MENU",
    Airflow::Action::"Pool.GET",
    Airflow::Action::"Variable.GET",
    Airflow::Action::"Dataset.GET",
    Airflow::Action::"View.GET",
    Airflow::Action::"Dag.POST",
    Airflow::Action::"Dag.PUT",
    Airflow::Action::"Dag.DELETE",
    Airflow::Action::"Connection.POST",
    Airflow::Action::"Connection.PUT",
    Airflow::Action::"Connection.DELETE",
    Airflow::Action::"Pool.POST",
    Airflow::Action::"Pool.PUT",
    Airflow::Action::"Pool.DELETE",
    Airflow::Action::"Variable.POST",
    Airflow::Action::"Variable.PUT",
    Airflow::Action::"Variable.DELETE",
    Airflow::Action::"Dataset.POST",
    Airflow::Action::"Dataset.PUT",
    Airflow::Action::"Dataset.DELETE",

  ],
  resource
);

授予用户组特定 DAG 的权限

以下策略将 DAG test 的所有 DAG 相关权限授予用户组。

permit(
  principal in Airflow::Group::"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
  action,
  resource == Airflow::Dag::"test"
);

以下策略将 DAG financial-1financial-2 的所有 DAG 相关权限授予用户组。

permit(
  principal in Airflow::Group::"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
  action,
  resource in [Airflow::Dag::"financial-1", Airflow::Dag::"financial-2"]
);

以下策略授予用户组访问 DAG test 的日志的权限。

permit(
  principal in Airflow::Group::"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
  action,
  resource == Airflow::Dag::"test"
) when {
  context has dag_entity && context.dag_entity == "TASK_LOGS"
};

禁止特定用户执行特定操作

在执行授权检查时,会考虑 Amazon Verified Permissions 中定义的所有策略。例如,如果一个“允许”策略和一个“禁止”策略都与请求匹配,则将拒绝该用户访问。例如,如果您想限制属于已授予所有权限的组的特定用户的访问权限,这将非常有用。

以下策略从特定用户中删除 DAG secret-dag-1secret-dag-2 的访问权限。

forbid(
  principal == Airflow::User::"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
  action,
  resource in [Airflow::Dag::"secret-dag-1", Airflow::Dag::"secret-dag-2"]
);

此条目有帮助吗?