

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

# 使用 Account Factory for Terraform 来管理多个账户的权限集
<a name="govern-permission-sets-aft"></a>

*Anand Krishna Varanasi 和 Siamak Heshmati，Amazon Web Services*

## Summary
<a name="govern-permission-sets-aft-summary"></a>

这种模式可以帮助你将 Account F [actory Terraform (AFT) 与[AWS IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)集成，以便大规模配置多个AWS Control TowerAWS 账户 账户](https://docs.aws.amazon.com/controltower/latest/userguide/aft-overview.html)的权限。这种方法使用自定义 AWS Lambda 函数自动向作为一个组织进行管理 AWS 账户 的[权限集](https://docs.aws.amazon.com/singlesignon/latest/userguide/permissionsetsconcept.html)分配。这简化了流程，因为不需要平台工程团队的人工干预。该解决方案可以提高运营效率、安全性和一致性。它促进了安全、标准化的入职流程 AWS Control Tower，因此对于优先考虑云基础架构敏捷性和可靠性的企业来说，这是必不可少的。

## 先决条件和限制
<a name="govern-permission-sets-aft-prereqs"></a>

**先决条件**
+ AWS 账户，通过管理 AWS Control Tower。有关更多信息，请参阅[入门 AWS Control Tower](https://docs.aws.amazon.com/controltower/latest/userguide/getting-started-with-control-tower.html)。
+ Account Factory for Terraform，部署在您环境中的专用账户中。有关更多信息，请参阅为 [Terraform 部署 A AWS Control Tower ccount Fac](https://docs.aws.amazon.com/controltower/latest/userguide/aft-getting-started.html) tory。
+ 在您的环境中设置的 IAM Identity Center 实例。有关更多信息，请参阅[开始使用 IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/getting-started.html)。
+ 活跃的 IAM Identity Center [组](https://docs.aws.amazon.com/singlesignon/latest/userguide/users-groups-provisioning.html#groups-concept)，已配置。 有关更多信息，请参阅[将组添加到 IAM Identity Center 目录](https://docs.aws.amazon.com/singlesignon/latest/userguide/addgroups.html)。
+ Python 3.9 或更高版本，已安装

**限制**
+ 此解决方案只能用于通过 AWS Control Tower管理的账户。此解决方案是使用 Account Factory for Terraform 进行部署的。
+ 此模式不包括有关使用身份源设置身份联合验证的说明。有关如何完成此设置的更多信息，请参阅 IAM Identity Center 文档中的 [IAM Identity Center 身份源教程](https://docs.aws.amazon.com/singlesignon/latest/userguide/tutorials.html)。

## 架构
<a name="govern-permission-sets-aft-architecture"></a>

**AFT 概述**

AFT 设置了一个 Terraform 管道，可帮助您在 AWS Control Tower中预调配和自定义您的账户。AFT 遵循一种自动执行账户配置过程的 GitOps 模型。 AWS Control Tower您创建一个*账户请求 Terraform 文件*，并将其提交到存储库。这将启动账户预调配的 AFT 工作流。账户预调配完成后，AFT 可以自动运行其他自定义步骤。有关更多信息，请参阅 AWS Control Tower 文档中的 [AFT 架构](https://docs.aws.amazon.com/controltower/latest/userguide/aft-architecture.html)。

AFT 提供以下主要存储库：
+ `aft-account-request` – 此存储库包含要创建或更新 AWS 账户的 Terraform 代码。
+ `aft-account-customizations` – 此存储库包含用于按账户创建或自定义资源的 Terraform 代码。
+ `aft-global-customizations` – 此存储库包含用于为所有账户大规模创建或自定义资源的 Terraform 代码。
+ `aft-account-provisioning-customizations` – 此存储库管理仅应用于 AFT 创建和管理的特定账户的自定义设置。例如，您可使用此存储库在 IAM Identity Center 中自定义用户或组分配或自动关闭账户。

**解决方案概述**

此自定义解决方案包括 AWS Step Functions 状态机和向多个账户的用户和组分配权限集的 AWS Lambda 功能。通过此模式部署的状态机与预先存在的 AFT `aft_account_provisioning_customizations` 状态机可协同运作。用户提交请求，要求在创建新账户时或创建账户之后更新 IAM Identity Cen AWS 账户 ter 用户和群组分配。为此，他们将更改推送到 `aft-account-request` 存储库。创建或更新账户的请求会在 [Amazon DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html) 中启动串流。这将启动 Lambda 函数，该函数更新目标的 IAM 身份中心用户和群组。 AWS 账户

以下是您可以在 Lambda 函数中为目标用户和组分配权限集提供的参数示例：

```
custom_fields = {
    "InstanceArn"         = "<Organization ID>",
    "PermissionSetArn"    = "<Permission set ARN>",
    "PrincipalId"         = "<Principal ID>",
  }
```

以下是此语句中的参数：
+ `InstanceArn` – 组织的 Amazon 资源名称（ARN）
+ `PermissionSetArn` – 权限集的 ARN
+ `PrincipalId` – 将对其应用权限集的 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 Identity。

![\[创建或更新账户时更新权限集的工作流。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/14751255-3781-48db-a6b7-1a03e28c1020/images/d1de252d-8ac9-4f7d-a559-4ab3e852f325.png)


该图显示了创建新账户时的以下工作流：

1. 用户将 `custom_fields` 更改推送到 `aft-account-request` 存储库。

1. AWS CodePipeline 启动一项 AWS CodeBuild 任务，将用户定义的元数据记录到 `aft-request-audit` Amazon DynamoDB 表中。此表具有记录用户定义元数据的属性。`ddb_event_name` 属性定义了 AFT 操作的类型：
   + 如果值为`INSERT`，则在创建新 AWS 账户 身份时，解决方案会将设置的权限分配给目标身份。
   + 如果该值为`UPDATE`，则解决方案将在创建后将权限设置分配给目标身份。 AWS 账户 

1. Amazon DynamoDB Streams 启动 `aft_alternate_sso_extract` Lambda 函数。

1. `aft_alternate_sso_extract`Lambda 函数在 AWS Control Tower 管理账户中扮演一个 AWS Identity and Access Management (IAM) 角色。

1. Lambda 函数通过向 IAM 身份中心发出 适用于 Python (Boto3) 的 AWS SDK [create\$1account\$1assignment API 调用，将权限集分配](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sso-admin/client/create_account_assignment.html)给目标用户和群组。它可从 `aft-request-audit` Amazon DynamoDB 表中检索权限集和身份分配。

1. 完成 Step Functions 工作流后，则会将权限集分配给目标身份。

**自动化和扩展**

AFT 使用 AWS 服务 诸如 CodePipeline、、 AWS CodeBuild、DynamoDB 和 Lambda 之类的高度可扩展性来大规模运行。为实现更多自动化操作，您可以将此解决方案与工单或问题管理系统（例如 Jira）集成。有关更多信息，请参阅此模式的[其他信息](#govern-permission-sets-aft-additional)部分。

## 工具
<a name="govern-permission-sets-aft-tools"></a>

**AWS 服务**
+ [Account Factory for Terraform（AFT）](https://docs.aws.amazon.com/controltower/latest/userguide/aft-overview.html)是此解决方案中的主要工具。`aft-account-provisioning-customizations`存储库包含用于为其创建自定义项的 Terraform 代码 AWS 账户，例如自定义 IAM Identity Center 用户或群组分配。
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) 是一项完全托管式 NoSQL 数据库服务，可提供快速、可预测、可扩展的性能。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) 是一项计算服务，可帮助您运行代码，无需预调配或管理服务器。它只在需要时运行您的代码，并自动进行扩展，因此您只需为使用的计算时间付费。
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)是一项无服务器编排服务，可帮助您组合 AWS Lambda 功能和其他功能 AWS 服务 来构建关键业务应用程序。

**其他工具**
+ [Python](https://www.python.org/) 是通用的计算机编程语言。
+ [Terraform](https://www.terraform.io/) 是一款基础设施即代码 (IaC) 工具 HashiCorp ，可帮助您创建和管理云和本地资源。

**代码存储库**

AFT 的代码存储库可在 Account F [actory fo GitHub AWS Control Tower r Terraform](https://github.com/aws-ia/terraform-aws-control_tower_account_factory) 存储库中找到。此模式的代码可在使用 Account Factory for [Terraform (AFT) 的 “管理 SSO 分配” 存储库中找到](https://github.com/aws-samples/aft-custom-sso-assignment)。 AWS 账户 

## 最佳实践
<a name="govern-permission-sets-aft-best-practices"></a>
+ 了解 [AWS 责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)。
+ 请按照的安全建议进行操作 AWS Control Tower。有关更多信息，请参阅[中的安全性 AWS Control Tower](https://docs.aws.amazon.com/controltower/latest/userguide/security.html)。
+ 遵循最低权限原则。有关更多信息，请参阅 [Apply least-privilege permissions](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。
+ 为组和业务单元构建特定且有针对性的权限集和 IAM 角色。

## 操作说明
<a name="govern-permission-sets-aft-epics"></a>

### 部署解决方案
<a name="deploy-the-solution"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 IAM 角色。 | 在 AWS Control Tower 管理账户中，使用 Terraform 创建 IAM 角色。此角色具有跨账户访问权限和信任策略，该策略允许来自身份提供者的联合身份验证访问。它还具有通过向其他账户授予访问权限的权限 AWS Control Tower。Lambda 函数将代入此角色。执行以下操作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/govern-permission-sets-aft.html) | AWS DevOps，云架构师 | 
| 为您的环境自定义解决方案。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/govern-permission-sets-aft.html) | AWS DevOps，云架构师 | 
| 部署解决方案。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/govern-permission-sets-aft.html) | AWS DevOps，云架构师 | 
| 建立一个代码存储库连接。 | 在用于存储配置文件的代码存储库和您的代码存储库之间建立连接 AWS 账户。有关说明，请参阅 AWS CodePipeline 文档中[使用 CodeConnections的 “向管道添加第三方源提供商](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-connections.html)”。 | AWS DevOps，云架构师 | 

### 使用解决方案
<a name="use-the-solution"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 启动 AFT 管道，以部署新账户。 | 按照向 [AFT 配置新账户中的说明进行](https://docs.aws.amazon.com/controltower/latest/userguide/aft-provision-account.html)操作，启动在您的 AWS Control Tower 环境 AWS 账户 中创建新账户的管道。等待账户创建流程完成。 | AWS DevOps，云架构师 | 
| 验证更改。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/govern-permission-sets-aft.html) | AWS DevOps，云架构师 | 

## 问题排查
<a name="govern-permission-sets-aft-troubleshooting"></a>


| 问题 | 解决方案 | 
| --- | --- | 
| 权限集分配并未正常运作。 | 确保组 ARN、组织 ID 和 Lambda 参数正确无误。有关示例，请参阅此模式的*解决方案概述*部分。 | 
| 更新存储库中的代码不会启动管道。 | 此问题与您 AWS 账户 和存储库之间的连接有关。在中 AWS 管理控制台，验证连接是否处于活动状态。有关更多信息，请参阅 AWS CodePipeline 文档中的[GitHub 连接](https://docs.aws.amazon.com/codepipeline/latest/userguide/connections-github.html)。 | 

## 附加信息
<a name="govern-permission-sets-aft-additional"></a>

**与工单管理工具集成**

您可以选择将此解决方案与工单或问题管理工具（例如 Jira 或 ServiceNow）集成。下图显示了此选项的示例工作流。您可以使用工具的连接器将工单管理工具与 AFT 解决方案存储库集成。有关 Jira 连接器的信息，请参阅[将 Jira 与集成](https://support.atlassian.com/jira-cloud-administration/docs/integrate-jira-software-with-github/)。 GitHub有关 ServiceNow 连接器的信息，请参阅[与集成 GitHub](https://www.servicenow.com/docs/bundle/washingtondc-it-asset-management/page/product/software-asset-management2/concept/integrate-with-github.html)。您甚至可以构建自定义解决方案，要求用户提供工单 ID 作为拉取请求审批的一部分。如果使用 AFT 创建新 AWS 账户 字段的请求获得批准，则该事件可能会启动向`aft-account-request` GitHub 存储库添加自定义字段的工作流程。您可以设计任何符合使用案例要求的自定义工作流。

![\[使用 GitHub 操作和工单管理工具的工作流程。\]](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/14751255-3781-48db-a6b7-1a03e28c1020/images/83763f65-32ea-4de0-932f-14a1b2d1d3ad.png)


下图显示了如下工作流：

1. 用户在工单管理工具（例如 Jira）中请求自定义权限集分配。

1. 案例获得批准后，工作流开始更新权限集分配。（可选）您可以使用插件进行此步骤的自定义自动化。

1. 操作人员将包含更新的权限集参数的 Terraform 代码发送到 `aft-account-request` 存储库中的开发或功能分支。

1. GitHub 操作 AWS CodeBuild 通过使用 OpenID Connect (OIDC) 调用启动。 CodeBuild [使用 t [fsec 和 checkov 等工具执行基础设施即代码 (IaC](https://aquasecurity.github.io/tfsec/v1.20.0/)) 安全扫描。](https://www.checkov.io/)它会警告运算符注意任何安全违规行为。

1. 如果未发现任何违规 GitHub 行为，Actions 会创建自动拉取请求并将代码审查分配给代码所有者。它还会为拉取请求创建标签。

1. 如果代码所有者批准了代码审查，则会启动另一个 GitHub 操作工作流程。它检查拉取请求标准，包括：
   + 拉取请求标题是否符合要求。
   + 拉取请求正文是否包含已审批的案例编号。
   + 拉取请求是否已正确标记。

1. 如果拉取请求符合标准，Acti GitHub ons 将启动 AFT 产品工作流程。它使用启动`ct-aft-account-request`管道 AWS CodePipeline。此管道在 Step Functions 中启动 `aft-account-provisioning-framework` 自定义状态机。此状态机的工作原理如之前在此模式的*解决方案概述*部分中所述。