本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用适用于 Terraform 的 Account Factory 来管理多个账户的权限集
Amazon Web Services 的 Anand Krishna Varanasi 和 Siamak Heshmati
摘要
这种模式可以帮助你将 Account F actory Terraform (AFT) 与AWS IAM Identity Center集成,以便大规模配置多个AWS Control TowerAWS 账户 账户的权限。这种方法使用自定义 AWS Lambda 函数自动向作为一个组织进行管理 AWS 账户 的权限集分配。这简化了流程,因为它不需要平台工程团队的人工干预。该解决方案可以提高运营效率、安全性和一致性。它促进了安全、标准化的入职流程 AWS Control Tower,因此对于优先考虑云基础架构敏捷性和可靠性的企业来说,这是必不可少的。
先决条件和限制
先决条件
AWS 账户,通过管理 AWS Control Tower。有关更多信息,请参阅入门 AWS Control Tower。
适用于 Terraform 的 Account Factory,部署在你环境中的专用账户中。有关更多信息,请参阅为 Terraform 部署 A AWS Control Tower ccount Fac tory。
在您的环境中设置的 IAM 身份中心实例。有关更多信息,请参阅开始使用 IAM Identity Center。
已配置一个活跃的 IAM 身份中心组。 有关更多信息,请参阅向您的群组添加群组 IAM Identity Center 目录。
Python 版本 3.9 或更高版本,已安装
限制
此解决方案只能用于通过管理的账户 AWS Control Tower。此解决方案是使用适用于 Terraform 的 Account Factory 来部署的。
此模式不包括使用身份源设置联合身份的说明。有关如何完成此设置的更多信息,请参阅 IAM Identity Center 文档中的 IAM Identity Center 身份源教程。
架构
AFT 概述
AFT 建立了一个 Terraform 管道,可以帮助你在中配置和自定义账户。 AWS Control Tower AFT 遵循一种自动执行账户配置过程的 GitOps 模型。 AWS Control Tower您创建一个账户请求 Terraform 文件并将其提交到存储库。这将启动账户配置的 AFT 工作流程。账户配置完成后,AFT 可以自动运行其他自定义步骤。有关更多信息,请参阅 AWS Control Tower 文档中的 AFT 架构。
AFT 提供以下主要存储库:
aft-account-request— 此存储库包含要创建或更新的 Terraform 代码。 AWS 账户aft-account-customizations— 此存储库包含 Terraform 代码,用于按账户创建或自定义资源。aft-global-customizations— 此存储库包含 Terraform 代码,用于为所有账户大规模创建或自定义资源。aft-account-provisioning-customizations— 此存储库管理的自定义项仅应用于由 AFT 创建并通过 AFT 管理的特定帐户。例如,您可以使用此存储库在 IAM Identity Center 中自定义用户或群组分配或自动关闭账户。
解决方案概述
此自定义解决方案包括 AWS Step Functions 状态机和向多个账户的用户和组分配权限集的 AWS Lambda 功能。通过此模式部署的状态机与预先存在的 AFT aft_account_provisioning_customizations 状态机配合运行。用户提交请求,要求在创建新账户时或创建账户之后更新 IAM Identity Cen AWS 账户 ter 用户和群组分配。他们通过将更改推送到aft-account-request存储库来做到这一点。创建或更新账户的请求会在 Amazon DynamoDB 直播中启动直播。这将启动 Lambda 函数,该函数更新目标的 IAM 身份中心用户和群组。 AWS 账户
以下是您可以在 Lambda 函数中为目标用户和群组分配权限集提供的参数示例:
custom_fields = { "InstanceArn" = "<Organization ID>", "PermissionSetArn" = "<Permission set ARN>", "PrincipalId" = "<Principal ID>", }
以下是此语句中的参数:
InstanceArn— 该组织的亚马逊资源名称 (ARN)PermissionSetArn— 权限集的 ARNPrincipalId— 将对其应用权限集的 IAM Identity Center 中的用户或群组的标识符
注意
在运行此解决方案之前,必须创建目标权限集、用户和组。
虽然该InstanceArn值必须保持一致,但您可以修改 Lambda 函数以将多个权限集分配给多个目标身份。权限集的参数必须以结尾PermissionSetArn,用户和组的参数必须以结尾PrincipalId。必须同时定义这两个属性。以下是如何定义多个权限集并以用户和组为目标的示例:
custom_fields = { "InstanceArn" = "<Organization ID>", "AdminAccessPermissionSetArn" = "<Admin privileges permission set ARN>", "AdminAccessPrincipalId" = "<Admin principal ID>", "ReadOnlyAccessPermissionSetArn" = "<Read-only privileges permission set ARN>", "ReadOnlyAccessPrincipalId" = "<Read-only principal ID>", }
下图显示了解决方案如何大规模更新目标 AWS 账户 用户和群组权限集 step-by-step的工作流程。当用户发起账户创建请求时,AFT 会启动 aft-account-provisioning-framework Step Functions 状态机。此状态机启动 extract-alternate-sso Lambda 函数。Lambda 函数将权限集分配给目标中的用户和群组。 AWS 账户这些用户或群组可以来自 IAM Identity Center 中任何已配置的身份来源。身份来源的示例包括 Okta、Active Directory 或 Ping 身份。

该图显示了创建新账户时的以下工作流程:
用户将
custom_fields更改推送到aft-account-request存储库。AWS CodePipeline 启动一项 AWS CodeBuild 任务,将用户定义的元数据记录到
aft-request-auditAmazon DynamoDB 表中。此表具有用于记录用户定义元数据的属性。该ddb_event_name属性定义了 AFT 操作的类型:如果值为
INSERT,则在创建新 AWS 账户 身份时,解决方案会将设置的权限分配给目标身份。如果该值为
UPDATE,则解决方案将在创建后将权限设置分配给目标身份。 AWS 账户
亚马逊 DynamoDB Streams 启动 Lambda 函数。
aft_alternate_sso_extractaft_alternate_sso_extractLambda 函数在 AWS Control Tower 管理账户中扮演一个 AWS Identity and Access Management (IAM) 角色。Lambda 函数通过向 IAM 身份中心发出 适用于 Python (Boto3) 的 AWS SDK create_account_assignment API 调用,将权限集分配
给目标用户和群组。它从 aft-request-auditAmazon DynamoDB 表中检索权限集和身份分配。Step Functions 工作流程完成后,权限集将分配给目标身份。
自动化和扩缩
AFT 使用 AWS 服务 诸如 CodePipeline、 AWS CodeBuild、DynamoDB 和 Lambda 之类的高度可扩展性来大规模运行。为了进一步实现自动化,您可以将此解决方案与工单或问题管理系统(例如 Jira)集成。有关更多信息,请参阅此模式的其他信息部分。
工具
AWS 服务
A@@ ccount Factory for Terraform (AFT) 是该解决方案中的主要工具。
aft-account-provisioning-customizations存储库包含用于为其创建自定义项的 Terraform 代码 AWS 账户,例如自定义 IAM Identity Center 用户或群组分配。Amazon DynamoDB 是一项完全托管的 NoSQL 数据库服务,可提供快速、可预测和可扩展的性能。
AWS Lambda 是一项计算服务,可帮助您运行代码,无需预置或管理服务器。它仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。
AWS Step Functions是一项无服务器编排服务,可帮助您组合 AWS Lambda 功能和其他功能 AWS 服务 来构建关键业务应用程序。
其他工具
代码存储库
AFT 的代码存储库可在 Account F actory fo GitHub AWS Control Tower r Terraform
最佳实践
了解责任AWS 共担模式
。 请按照的安全建议进行操作 AWS Control Tower。有关更多信息,请参阅中的安全性 AWS Control Tower。
遵循最低权限原则。有关更多信息,请参阅 Apply least-privilege permissions。
为群组和业务部门构建特定且有针对性的权限集和 IAM 角色。
操作说明
| Task | 描述 | 所需技能 |
|---|---|---|
创建一个 IAM 角色。 | 在 AWS Control Tower 管理账户中,使用 Terraform 创建 IAM 角色。此角色具有跨账户访问权限和允许身份提供商进行联合访问的信任策略。它还具有通过向其他账户授予访问权限的权限 AWS Control Tower。Lambda 函数将担任此角色。执行以下操作:
| AWS DevOps,云架构师 |
为您的环境定制解决方案。 |
| AWS DevOps,云架构师 |
部署解决方案。 |
| AWS DevOps,云架构师 |
设置代码存储库连接。 | 在用于存储配置文件的代码存储库和您的代码存储库之间建立连接 AWS 账户。有关说明,请参阅 AWS CodePipeline 文档中使用 CodeConnections的 “向管道添加第三方源提供商”。 | AWS DevOps,云架构师 |
| Task | 描述 | 所需技能 |
|---|---|---|
启动 AFT 管道以部署新账户。 | 按照向 AFT 配置新账户中的说明进行操作,启动在您的 AWS Control Tower 环境 AWS 账户 中创建新账户的管道。等待账户创建过程完成。 | AWS DevOps,云架构师 |
验证更改。 |
| AWS DevOps,云架构师 |
故障排除
| 事务 | 解决方案 |
|---|---|
权限集分配不起作用。 | 确保群组 ARN、组织 ID 和 Lambda 参数正确无误。有关示例,请参阅此模式的解决方案概述部分。 |
更新存储库中的代码不会启动管道。 | 此问题与您 AWS 账户 和存储库之间的连接有关。在中 AWS 管理控制台,验证连接是否处于活动状态。有关更多信息,请参阅 AWS CodePipeline 文档中的GitHub 连接。 |
其他信息
与工单管理工具集成
您可以选择将此解决方案与工单或问题管理工具(例如 Jira 或 ServiceNow)集成。下图显示了此选项的示例工作流程。您可以使用工具的连接器将票证管理工具与 AFT 解决方案存储库集成。有关 Jira 连接器的信息,请参阅将 Jira 与集成aft-account-request GitHub 存储库添加自定义字段的工作流程。您可以设计任何符合用例要求的自定义工作流程。

图表显示了以下工作流:
用户在票证管理工具(例如 Jira)中请求自定义权限集分配。
案例获得批准后,工作流开始更新权限集分配。(可选)您可以使用插件实现此步骤的自定义自动化。
操作员将包含更新的权限集参数的 Terraform 代码发送到
aft-account-request存储库中的开发分支或功能分支。GitHub 操作 AWS CodeBuild 通过使用 OpenID Connect (OIDC) 调用启动。 CodeBuild 使用 t fsec 和 checkov 等工具执行基础设施即代码 (IaC
) 安全扫描。 它会警告操作员注意任何安全违规行为。 如果未发现任何违规 GitHub 行为,Actions 会创建自动拉取请求并将代码审查分配给代码所有者。它还会为拉取请求创建标签。
如果代码所有者批准了代码审查,则会启动另一个 GitHub 操作工作流程。它检查拉取请求标准,包括:
拉取请求标题是否符合要求。
如果拉取请求正文包含已批准的案例编号。
拉取请求是否已正确标记。
如果拉取请求符合标准,Acti GitHub ons 将启动 AFT 产品工作流程。它使用启动
ct-aft-account-request管道 AWS CodePipeline。此管道在 Step Functions 中启动aft-account-provisioning-framework自定义状态机。此状态机的工作原理如之前在此模式的 “解决方案概述” 部分中所述。