

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Account Factory for Terraform 管理多個帳戶的許可集
<a name="govern-permission-sets-aft"></a>

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

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

此模式可協助您將 [AWS Control Tower Account Factory Terraform (AFT)](https://docs.aws.amazon.com/controltower/latest/userguide/aft-overview.html) 與 [AWS IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html) 整合，以 AWS 帳戶 大規模設定多個 的許可。此方法使用自訂 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)。
+ 適用於 Terraform 的 Account Factory，部署在您環境中的專用帳戶中。如需詳細資訊，請參閱[部署適用於 Terraform AWS Control Tower 的帳戶工廠](https://docs.aws.amazon.com/controltower/latest/userguide/aft-getting-started.html)。
+ 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)課程。

## Architecture
<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` – 此儲存庫包含要建立或更新的 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 Center AWS 帳戶 使用者和群組指派的請求。他們會將變更推送至`aft-account-request`儲存庫來執行此操作。建立或更新帳戶的請求會在 [Amazon DynamoDB Streams ](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html)中啟動串流。這會啟動 Lambda 函數，以更新目標的 IAM Identity Center 使用者和群組 AWS 帳戶。

以下是您可以在 Lambda 函數中提供的參數範例，用於將許可集指派至目標使用者和群組：

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

以下是此陳述式中的參數：
+ `InstanceArn` – 組織的 Amazon Resource Name (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_tw/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 會啟動將使用者定義中繼資料記錄到 Amazon DynamoDB `aft-request-audit` 資料表 AWS CodeBuild 的任務。此資料表具有屬性來記錄使用者定義的中繼資料。`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 Identity Center 進行 an 適用於 Python (Boto3) 的 AWS SDK [create\_account\_assignment](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sso-admin/client/create_account_assignment.html) API 呼叫，將許可集指派給目標使用者和群組。它會從 Amazon DynamoDB `aft-request-audit` 資料表擷取許可集和身分指派。

1. 當 Step Functions 工作流程完成時，會將許可集指派給目標身分。

**自動化和擴展**

AFT 使用 CodePipeline AWS CodeBuild、DynamoDB 和高度可擴展的 Lambda AWS 服務 等大規模運作。如需其他自動化，您可以將此解決方案與票證或問題管理系統整合，例如 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/) 是 HashiCorp 的基礎設施即程式碼 (IaC) 工具，可協助您建立和管理雲端和內部部署資源。

**程式碼儲存庫**

AFT 的程式碼儲存庫可在 GitHub [AWS Control Tower Account Factory for Terraform](https://github.com/aws-ia/terraform-aws-control_tower_account_factory) 儲存庫中使用。此模式的程式碼可在 [AWS 帳戶 Govern SSO 指派中使用 Account Factory for Terraform (AFT)](https://github.com/aws-samples/aft-custom-sso-assignment) 儲存庫。

## 最佳實務
<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)。
+ 遵循最低權限原則。如需詳細資訊，請參閱[套用最低權限許可](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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 IAM 角色。 | 在 AWS Control Tower 管理帳戶中，使用 Terraform 建立 IAM 角色。此角色具有跨帳戶存取和信任政策，允許來自身分提供者的聯合存取。它還具有透過 授予其他帳戶存取權的許可 AWS Control Tower。Lambda 函數將擔任此角色。請執行下列操作：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/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_tw/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_tw/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>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 啟動 AFT 管道以部署新帳戶。 | 請遵循[使用 AFT 佈建新帳戶](https://docs.aws.amazon.com/controltower/latest/userguide/aft-provision-account.html)中的指示，以啟動 AWS 帳戶 在您的 AWS Control Tower 環境中建立新 的管道。等待帳戶建立程序完成。 | AWS DevOps，雲端架構師 | 
| 驗證變更。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/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 與 GitHub 整合](https://support.atlassian.com/jira-cloud-administration/docs/integrate-jira-software-with-github/)。如需 ServiceNow 連接器，請參閱[與 GitHub 整合](https://www.servicenow.com/docs/bundle/washingtondc-it-asset-management/page/product/software-asset-management2/concept/integrate-with-github.html)。您甚至可以建置自訂解決方案，要求使用者在提取請求核准過程中提供票證 ID。如果 AWS 帳戶 使用 AFT 建立新 的請求獲得核准，該事件可能會啟動工作流程，將自訂欄位新增至 `aft-account-request` GitHub 儲存庫。您可以設計任何符合您使用案例需求的自訂工作流程。

![使用 GitHub 動作和票證管理工具的工作流程。](http://docs.aws.amazon.com/zh_tw/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 使用 [tfsec](https://aquasecurity.github.io/tfsec/v1.20.0/) 和 [checkov](https://www.checkov.io/) 等工具，以程式碼 (IaC) 安全性掃描的形式執行基礎設施。它會警告運算子任何安全違規。

1. 如果找不到違規，GitHub Actions 會建立自動提取請求，並將程式碼檢閱指派給程式碼擁有者。它也會為提取請求建立標籤。

1. 如果程式碼擁有者核准程式碼檢閱，則會啟動另一個 GitHub 動作工作流程。它會檢查提取請求標準，包括：
   + 如果提取請求標題符合要求。
   + 如果提取請求內文包含核准的案例編號。
   + 如果提取請求已正確標記。

1. 如果提取請求符合標準，GitHub 動作會啟動 AFT 產品工作流程。它使用 啟動`ct-aft-account-request`管道 AWS CodePipeline。此管道會在 Step Functions 中啟動`aft-account-provisioning-framework`自訂狀態機器。此狀態機器的運作方式如先前此模式*的解決方案概觀*一節所述。