使用 Terraform 动态管理 AWS 权限集 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Terraform 动态管理 AWS 权限集

Vinicius Elias 和 Marcos Vinicius Pinto Jordao,Amazon Web Services

摘要

AWS IAM Identity Center 通过提供一个用于管理对云应用程序的单点登录访问 AWS 账户 和云应用程序的集中式中心来增强 AWS Identity and Access Management (IAM)。但是,随着组织的发展,手动管理 IAM I dentity Center 权限集可能会变得越来越复杂和容易出错。这种复杂性可能导致潜在的安全漏洞和管理开销。

该解决方案使您能够使用使用本机构建的持续集成和持续交付 (CI/CD) 管道,通过基础设施即代码 (IaC) 管理权限集。 AWS 服务它可以将权限集分配机制与 AWS Control Tower 生命周期事件或 Acco unt Factory for Terraform (AFT) 环境无缝集成。这种方法为新增和现有身份提供了动态身份配置 AWS 账户。

Amazon EventBridge 规则监控 AWS 账户 创建和更新,这有助于您的身份配置与您的组织结构保持同步。在或 AFT 中创建 AWS Control Tower 或更新账户后,将触发管道。它使用权限集定义和分配规则评估一组 JSON 文件。然后,管道会应用并同步所有账户的设置。

这种方法具有以下好处:

  • 一致性 — 消除整个 AWS 组织的手动配置偏差

  • 可审计性-维护所有身份管理变更的完整历史记录

  • 可扩展性 — 随着 AWS 环境的增长自动应用配置

  • 安全-减少权限分配中的人为错误

  • 合规性 — 通过记录在案的变更和分配规则,促进满足监管要求

先决条件和限制

  • 带有 AWS Control Tower 和 AWS Organizations 设置的多账户环境。或者,您可以将 AFT 与 AWS Control Tower。

  • IAM 身份中心委 AWS 账户 托管理员接收解决方案。有关更多信息,请参阅 IAM 身份中心文档中的委托管理

  • 用于处理主代码的版本控制系统 (VCS) 存储库。有关示例,请参阅解决方案的 GitHub 存储库

  • Terraform 后端管理所需的 AWS 资源,例如亚马逊简单存储服务 (Amazon S3) Service 存储桶和亚马逊 DynamoDB 表。

限制

  • 该管道使用 AWS 原生资源和开源 Terraform。该管道不准备调用第三方生态系统。

  • 有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性,请参阅按地区划分的AWS 服务。有关特定终端节点,请参阅服务终端节点和配额,然后选择服务的链接。

架构

下图显示了此模式的组件和工作流程。

使用 Terraform 管理 AWS 权限集的组件和工作流程。

AWS Control Tower 事件流

解决方案从整合来自任一方 AWS Control Tower 或 AFT 的事件开始。在一个或另一个服务之间进行选择是在实现时通过变量定义做出的。无论使用哪种方法,只要创建或更新账户,就会触发管道。该管道协调存储在权限集管理存储库中的策略。

以下是 AWS Control Tower 生命周期事件:

  • CreateManagedAccount— 创建新账户时

  • UpdateManagedAccount— 当现有账户更新时

事件路由

EventBridge 用作中央事件处理服务,用于捕获 AWS Control Tower 账户中生成的事件。事件发生时, EventBridge 智能地将其路由到解决方案帐户中的集中式事件总线。 AWS Control Tower 生命周期事件遵循不同的路由模式。如果将 AFT 定义为事件源,则由 AFT 管理账户而不是 AWS Control Tower 账户处理事件。这种事件驱动的架构无需人工干预即可自动响应组织变更。

AFT 集成流程

当 AWS Control Tower 生命周期事件到达AFT管理账户时,它们会自动触发AFT固有的多个下游流程。AFT 账户自定义工作流程完成后,它会向专门的aft-notifications亚马逊简单通知服务 (Amazon SNS) Simple Notification Service 主题发布一条消息。该主题会触发此解决方案实现的aft-new-account-forward-event AWS Lambda 函数。Lambda 函数将事件发送到解决方案账户事件总线,该总线用于启动管道。

基础设施即代码管道

解决方案管道作为一种全自动部署机制运行。该 AWS CodePipeline 服务持续监控存储库中的更改。检测到新的提交后,它会自动启动部署工作流并启动包括验证和执行阶段在内的顺序流程。系统运行 Terraform plan 操作以识别提议的更改,然后运行 Terraform apply 命令以在环境中实现这些更改。 AWS 值得注意的是,该管道在没有任何手动批准门的情况下运行。这种方法可以快速部署基础架构变更,同时通过管道日志和 Terraform 状态文件保持可审计性。

该管道利用 AWS CodeBuild 该管道在具有适当权限的受控环境中运行 Terraform 操作。通过这种 IaC 方法,管道可以执行全面的权限管理操作,包括:

  • 创建新的权限集。

  • 更新现有权限集。

  • 移除不必要的权限集。

  • 管理 AWS 组织内账户和群组中这些权限的分配。

为了保持基础设施一致性并防止更改冲突,该解决方案使用Amazon S3存储桶和专用的Amazon DynamoDB表实现了Terraform后端状态管理系统。这种方法为 Terraform 状态文件和状态锁定机制提供了永久存储位置,以防止对相同资源进行并发修改。

Terraform 的主代码使用官方的 T AWS permission-sets erraform 模块。此模块可以根据权限集模板动态管理 IAM Identity Center 中的权限集。

源代码控制管理

权限集模板(JSON 文件)位于外部版本控制系统(例如)中 GitHub,该系统为身份管理配置提供集中存储库。这种方法为权限集定义建立了单一事实来源,同时通过标准的代码审查实践实现了协作开发。授权用户可以按照组织变更管理流程提交对这些模板的更改。这些提交是自动部署管道的主要触发器,启动基础架构更新流程。

有关如何使用存储库中的 JSON 文件配置权限集的示例,请参阅其他信息

工具

AWS 服务

  • AWS CodeBuild是一项完全托管的生成服务,可帮助您编译源代码、运行单元测试和生成可随时部署的工件。

  • AWS CodeConnections使 AWS 资源和服务(例如 CodePipeline)能够连接到外部代码存储库,例如 GitHub。

  • AWS CodePipeline帮助您快速建模和配置软件发布的不同阶段,并自动执行持续发布软件更改所需的步骤。

  • AWS Command Line Interface (AWS CLI) 是一个开源工具,可帮助您 AWS 服务 通过命令行 shell 中的命令进行交互。

  • AWS Control Tower按照规范性最佳实践,帮助您设置和管理 AWS 多账户环境。

  • Amazon DynamoDB 是一项完全托管的 NoSQL 数据库服务,可提供快速、可预测和可扩展的性能。

  • Amazon EventBridge 是一项无服务器事件总线服务,可帮助您将应用程序与来自各种来源的实时数据连接起来。例如, AWS Lambda 函数、使用 API 目的地的 HTTP 调用端点或其他 AWS 账户目的地的事件总线。

  • AWS Identity and Access Management (IAM) 通过控制谁经过身份验证并有权使用 AWS 资源,从而帮助您安全地管理对资源的访问权限。

  • AWS IAM Identity Center帮助您集中管理对所有应用程序 AWS 账户 和云应用程序的单点登录 (SSO) 访问权限。

  • AWS Lambda 是一项计算服务,可帮助您运行代码,无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。

  • AWS Organizations是一项账户管理服务,可帮助您将多个账户整合 AWS 账户 到一个由您创建和集中管理的组织中。

  • Amazon Simple Notification Service (Amazon SNS) 可帮助您协调和管理发布者与客户端(包括 Web 服务器和电子邮件地址)之间的消息交换。它支持账户管理事件的推送通知,确保相关方了解系统内的重要变化或操作。

  • Amazon Simple Storage Service (Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。

其他工具

  • Terraform 是一款基础设施即代码 (IaC) 工具 HashiCorp ,可帮助您创建和管理云和本地资源。

代码存储库

此模式的代码可在 AWS 示例组织中的 sample-terraform-aws-permission-sets- pipeline 存储库 GitHub 中找到。

最佳实践

  • 务必固定用于在生产环境中运行代码的 Terraform 模块和提供程序的版本。

  • 使用静态代码分析工具(例如 Checkov)扫描您的代码,然后解决安全问题。

  • 遵循最低权限原则,授予执行任务所需的最低权限。有关更多信息,请参阅 IAM 文档中的授予最低权限安全最佳实践

操作说明

Task描述所需技能

创建 Terraform 后端资源。

如果您尚未创建 Terraform 后端 AWS 资源,请使用以下步骤创建 Amazon S3 存储桶 (s3-tf-backend-{ACCOUNT_ID}) 和 DynamoDB 表 ()。ddb-tf-backend

  1. 登录您要部署解决方案 AWS 账户 的位置,然后在 AWS Control Tower 主页AWS CloudShell中打开 AWS 区域。

  2. 运行以下命令,将占位符{ACCOUNT_ID}替换为您的 AWS 账户 ID:

aws s3api create-bucket --bucket s3-tf-backend-{ACCOUNT_ID} aws s3api put-bucket-versioning --bucket s3-tf-backend-{ACCOUNT_ID} --versioning-configuration Status=Enabled aws dynamodb create-table --table-name ddb-tf-backend --attribute-definitions AttributeName=LockID,AttributeType=S --key-schema AttributeName=LockID,KeyType=HASH --provisioned-throughput ReadCapacityUnits=1,WriteCapacityUnits=1
AWS 管理员

创建跨账户角色。

您必须在 event-source-account Terraform AWS 提供商配置中提供跨账户 IAM 角色。如果您尚未创建此角色,请按以下步骤进行创建:

  1. 登录您的事件来源(AWS Control Tower 管理账户或 AFT 账户),然后打开 AWS CloudShell。 AWS 账户

  2. 运行以下命令,将占位符{ACCOUNT_ID}替换为您用于此解决方案的 AWS 账户 ID,而不是当前的 AWS 账户 ID:

aws iam create-role \ --role-name CrossAccountRole \ --assume-role-policy-document '{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::{ACCOUNT_ID}:root" }, "Action": "sts:AssumeRole" } ] }'
  1. 检查命令输出并复制角色亚马逊资源名称 (ARN)(例如)。arn:aws:iam::111122223333:role/CrossAccountRole

  2. 要将 IAM 策略附加到该角色,请运行以下命令:

aws iam attach-role-policy \ --role-name CrossAccountRole \ --policy-arn arn:aws:iam::aws:policy/AdministratorAccess

此示例使用 AWS 托管 IAM 策略AdministratorAccess。如果你愿意,你可以使用更具体的策略。

AWS 管理员
Task描述所需技能

创建专用存储库。

此任务假设你正在使用 GitHub。创建一个专用存储库来存储 Terraform 主代码和权限集模板 JSON 文件。

DevOps 工程师

准备权限集代码。

有关如何构造以下文件的信息,请参阅解决方案存储库中的示例代码

├ ── main.tf

├ ── outputs.tf

├ ── providers.jinja

▸ ── 模板

复制内容,保留providers.jinja值,然后对其他文件进行必要的调整。例如,将权限集模板文件添加到文件中templates或将aws-ia/permission-sets/aws模块版本固定在main.tf文件中。

DevOps 工程师

提交您的更改。

提交更改并将其推送到您之前创建的存储库。例如,保存存储库名称及其 GitHub 组织myorg/aws-ps-pipeline

DevOps 工程师
Task描述所需技能

下载内容。

从解决方案存储库中下载(克隆)内容。

DevOps 工程师

满足变量。

创建terraform.tfvars文件并添加以下必要变量:

  • repository_name— 您之前创建的权限集存储库的名称

  • branch_name— 权限集存储库分支的名称

  • vcs_provider— 您的 VCS 提供商

  • account_lifecycle_events_source— 触发管道(AWS Control Tower 或 AFT)的事件来源

repository_name = "myorg/aws-ps-pipeline" branch_name = "main" vcs_provider = "github" account_lifecycle_events_source = "CT"

有关其他变量选项的信息,请参阅此模式存储库中的 v ariables.tf 文件。 GitHub

DevOps 工程师

调整 Terraform 后端配置。

backend.tf文件中,用您自己的值替换占位符。使用 AWS Control Tower 主页 AWS 区域,并提供之前创建的 Amazon S3 存储桶和 DynamoDB 表的名称。

terraform { required_version = ">=1.6" backend "s3" { region = "{region}" bucket = "{bucket_name}" key = "terraform.tfstate" dynamodb_table = "{table_name}" encrypt = "true" } }

如果你愿意,你可以使用自己的 Terraform 后端配置。

DevOps 工程师

调整 Terraform 提供程序的配置。

providers.tf文件中,用您自己的信息替换占位符。使用 AWS Control Tower 主区域,为提供商提供先前创建的跨账户 IAM 角色的 ARN。event-source-account

provider "aws" { region = "{region}" } provider "aws" { alias = "event-source-account" region = "{region}" assume_role { role_arn = "{role_arn}" } }
DevOps 工程师
Task描述所需技能

选择 AWS 账户。

我们建议您在 IAM Identity Center 委托管理员账户中部署解决方案。但是,您也可以将其部署到 AWS Organizations 管理账户中。

要登录与 IAM Identity Center 实例位于同一区域的选定账户,请使用 AWS CLI。确保您使用的 IAM 角色有权代入在前面的步骤中为event-source-account提供商指定的角色。此外,此角色必须有权访问 Terraform 后端配置中使用的 AWS 资源。

AWS 管理员

手动运行 Terraform。

要初始化、规划和应用配置,请按所示顺序运行以下 Terraform 命令:

  1. terraform init

  2. terraform plan

  3. terraform apply

DevOps 工程师

检查部署结果。

在 IAM Identity Center 委托管理员账户中,检查aws-ps-pipeline管道是否已创建。还要检查是否存在处于 “处理” 状态的 AWS CodeConnections 连接。

AWS DevOps

完成 CodeConnections 配置。

要完成 CodeConnections 配置,请使用以下步骤:

  1. 转至 CodeConnections,选择已创建的连接,然后选择更新待处理的连接

  2. 提供您的 GitHub 凭据,安装新 GitHub 应用程序或选择有权访问权限集存储库的现有应用程序,然后选择 Connect

现在,管道应该可以访问权限集存储库。

有关详细说明,请参阅开发者工具控制台文档中的更新待处理连接

AWS DevOps
Task描述所需技能

通过 AWS Control Tower 或 AFT 更新运行管道。

使用 AWS Control Tower 或 AFT(取决于您选择的生命周期事件类型)创建或更改账户后,管道就会启动。

AWS 管理员

通过更改代码来运行管道。

更改代码并将其提交到main分支后,管道将启动。

AWS DevOps

手动运行管道。

要手动启动管道,请使用中的版本更改功能 AWS CodePipeline。

AWS DevOps

故障排除

事务解决方案

拒绝访问

确认您拥有部署解决方案所需的权限。

CodeConnections 问题

  • 检查连接状态是否为 “可用” 而不是 “待处理”。

  • 使用 GitHub 凭据验证 CodeConnections 配置是否正确完成。有关更多信息,请参阅开发者工具控制台文档中的更新待处理连接

  • 确保该 GitHub 应用程序对权限集存储库具有适当的访问权限。

管道执行问题

  • 查看 Amazon CloudWatch 日志中是否存在管道执行错误。

  • 确保正确设置了 IAM 身份中心委托。否则,读取 AWS 账户 元数据时可能会导致管道故障。

权限集部署问题

  • 验证权限集模板文件中的 JSON 语法是否正确。

  • 验证模板中引用的 IAM 托管策略是否存在。

  • 检查 IAM Identity Center 中是否存在分配中的指定群组和用户。

相关资源

AWS 服务 文档

其他资源

其他信息

带有示例权限集的 JSON 文件

以下示例说明如何使用存储库中的 JSON 文件配置权限集:

{ "Name": "ps-billing", // Permission set identifier "Comment": "Sample permission set for billing access", // Comment to document the purpose of the permission set "Description": "Billing access in AWS", // Detailed description "SessionDuration": "PT4H", // Session duration = 4 hours (ISO 8601 format) "ManagedPolicies": [ // List of AWS IAM managed policies "arn:aws:iam::aws:policy/job-function/Billing", "arn:aws:iam::aws:policy/job-function/SupportUser", "arn:aws:iam::aws:policy/AWSSupportAccess", "arn:aws:iam::aws:policy/job-function/ViewOnlyAccess" ], "CustomerPolicies": [], // References to IAM policies previously created "CustomPolicy": {}, // Inline IAM policy defined directly in the permission set "PermissionBoundary": { // AWS or customer managed IAM policy to be used as boundary "ManagedPolicy": "", "CustomerPolicy": "" }, "Assignments": [ // Define the assignment rules { "all_accounts": true, // Apply to ALL active AWS accounts in organization "principal": "G_BILLING_USERS", // Group/user name in Identity Center "type": "GROUP", // Can be "GROUP" or "USER" "account_id": [], // List of AWS account ID (empty since all_accounts=true) "account_ou": [], // List of AWS Organizational Unit IDs with target AWS accounts "account_tag": [] // List of tags (key:value) to match AWS Organization accounts tags } ] }

有关更多信息,请参阅 Terraform 网站AWS 权限集模块文档中的 JSON 架构。

小贴士

  • 您可以使用 Terraform 导入块将现有权限集导入解决方案。

  • 您可以使用 AFT 在委托账户中实现 AWS 权限集管道。有关更多信息,请参阅 AFT 蓝图