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

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

通过 AWS IAM 身份中心管理用户

用户

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

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

  1. 打开 IAM 身份中心控制台

  2. 选择 用户

您可以使用 AWS IAM 身份中心中的组将用户分组为逻辑实体(例如,按团队、按部门等)。 之后,这些组可以在 Amazon Verified Permissions 中用于将权限分配给一组用户。 有关将用户添加到组的文档,请参阅文档

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

  1. 打开 IAM 身份中心控制台

  2. 选择

将用户和组分配到 Airflow 环境

注意

AWS IAM 身份中心中定义的所有用户和组不具备自动访问 Airflow 环境的权限。 您需要手动分配哪些用户可以访问 Airflow。

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

  1. 打开 IAM 身份中心控制台

注意

如果您在 AWS Managed Microsoft AD 中管理用户,请确保在执行下一步之前,IAM 身份中心控制台正在使用 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 身份中心中找到用户 ID。

为一组用户授予所有权限

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

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

注意

您必须通过其组 ID 而不是其名称来引用组。 您可以在 AWS IAM 身份中心中找到组 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::"Asset.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::"Asset.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::"Asset.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::"Asset.POST",
    Airflow::Action::"Asset.PUT",
    Airflow::Action::"Asset.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"]
);

此条目是否有帮助?