使用 Terraform 动态管理 AWS 权限集 - AWS 规范指引

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

使用 Terraform 动态管理 AWS 权限集

Vinicius Elias 和 Marcos Vinicius Pinto Jordao,Amazon Web Services

Summary

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

这个解决方案可助你使用基于原生 AWS 服务的持续集成和持续交付(CI/CD)管道,通过基础设施即代码(IaC)管理权限集。它可以将权限集分配机制与 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 Identity Center 文档中的委派管理

  • 一个用于处理主代码的版本控制系统(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 Simple Notification Service(Amazon SNS)主题。该主题会触发此解决方案实现的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. 检查命令输出并复制角色 Amazon 资源名称(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

└── templates

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

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 Provider 配置。

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 Identity Center 委派设置正确。否则,读取 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 蓝图