本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Terraform 動態管理 AWS 許可集
Vinicius Elias 和 Marcos Vinicius Pinto Jordao,Amazon Web Services
Summary
AWS IAM Identity Center enhances AWS Identity and Access Management (IAM) 提供集中式中樞,用於管理 AWS 帳戶 和雲端應用程式的單一登入存取。不過,隨著組織的成長,手動管理 IAM Identity Center 許可集可能會變得越來越複雜且容易出錯。這種複雜性可能會導致潛在的安全漏洞和管理開銷。
此解決方案可讓您使用以原生建置的持續整合和持續交付 (CI/CD) 管道,透過基礎設施將許可集管理為程式碼 (IaC) AWS 服務。它可讓許可集指派機制與 AWS Control Tower 生命週期事件或 Account 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 Identity Center 委派管理員 AWS 帳戶 接收解決方案。如需詳細資訊,請參閱 IAM Identity Center 文件中的委派管理。
處理主要程式碼的版本控制系統 (VCS) 儲存庫。如需範例,請參閱解決方案的 GitHub 儲存庫
。 Terraform 後端管理的必要 AWS 資源,例如 Amazon Simple Storage Service (Amazon S3) 儲存貯體和 Amazon DynamoDB 資料表。
限制
管道使用 AWS 原生資源和開放原始碼 Terraform。管道尚未準備好呼叫第三方生態系統。
有些 AWS 服務 不適用於所有 AWS 區域。如需區域可用性,請參閱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 程式碼使用官方 AWS permission-sets
Terraform 模組。此模組可以根據許可集範本,在 IAM Identity Center 中動態管理許可集。
來源控制管理
許可集範本 (JSON 檔案) 位於外部版本控制系統,例如 GitHub,為身分管理組態提供集中式儲存庫。此方法為許可集定義建立單一事實來源,同時透過標準程式碼檢閱實務實現協作開發。授權使用者可以在組織變更管理程序之後,將變更遞交至這些範本。這些遞交可做為自動化部署管道的主要觸發條件,啟動基礎設施更新程序。
如需如何使用儲存庫中的 JSON 檔案設定許可集的範例,請參閱其他資訊。
工具
AWS 服務
AWS CodeBuild 是一種全受管建置服務,可協助您編譯原始程式碼、執行單元測試,並產生準備好部署的成品。
AWS CodeConnections 可讓 CodePipeline 等 AWS 資源和服務連線至外部程式碼儲存庫,例如 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
是 HashiCorp 的基礎設施即程式碼 (IaC) 工具,可協助您建立和管理雲端和內部部署資源。
程式碼儲存庫
此模式的程式碼可在 sample-terraform-aws-permission-sets-pipeline
最佳實務
史詩
任務 | 描述 | 所需的技能 |
---|---|---|
建立 Terraform 後端資源。 | 如果您尚未建立 Terraform 後端 AWS 資源,請使用下列步驟建立 Amazon S3 儲存貯體 (
| AWS 管理員 |
建立跨帳戶角色。 | 您必須在
此範例使用 AWS 受管 IAM 政策 AdministratorAccess。如果您願意,可以使用更具體的政策。 | AWS 管理員 |
任務 | 描述 | 所需的技能 |
---|---|---|
建立專用儲存庫。 | 此任務假設您正在使用 GitHub。建立專用儲存庫來存放主要 Terraform 程式碼和許可集範本 JSON 檔案。 | DevOps 工程師 |
準備許可集程式碼。 | 如需有關如何建構下列檔案的資訊,請參閱解決方案儲存庫上的範例程式碼 ├ – main.tf:// ├ – outputs.tf:// ├ – provider.jinja └ — 範本 複製內容、保留 | DevOps 工程師 |
遞交您的變更。 | 遞交變更並推送至您先前建立的儲存庫。儲存儲存庫名稱及其 GitHub 組織,例如 | DevOps 工程師 |
任務 | 描述 | 所需的技能 |
---|---|---|
下載內容。 | 從解決方案儲存庫 | DevOps 工程師 |
履行變數。 | 建立
如需其他變數選項的詳細資訊,請參閱此模式的 GitHub 儲存庫中的 variables.tf | DevOps 工程師 |
調整 Terraform 後端組態。 | 在
如果您願意,您可以使用自己的 Terraform 後端組態。 | DevOps 工程師 |
調整 Terraform 提供者組態。 | 在
| DevOps 工程師 |
任務 | 描述 | 所需的技能 |
---|---|---|
選取 AWS 帳戶。 | 建議您在 IAM Identity Center 委派管理員帳戶中部署解決方案。不過,您也可以在 AWS Organizations 管理帳戶中部署它。 若要登入與 IAM Identity Center 執行個體位於相同區域中的所選帳戶,請使用 AWS CLI。請確定您使用的 IAM 角色具有許可,可擔任先前步驟中為 | AWS 管理員 |
手動執行 Terraform。 | 若要初始化、規劃和套用組態,請依所示順序執行下列 Terraform 命令:
| DevOps 工程師 |
檢查部署結果。 | 在 IAM Identity Center 委派管理員帳戶中,檢查 | AWS DevOps |
完成 CodeConnections 組態。 | 若要完成 CodeConnections 組態,請使用下列步驟:
管道現在應該可以存取許可集儲存庫。 如需詳細說明,請參閱開發人員工具主控台文件中的更新待定連線。 | AWS DevOps |
任務 | 描述 | 所需的技能 |
---|---|---|
依 AWS Control Tower 或 AFT 更新執行管道。 | 使用 AWS Control Tower 或 AFT 建立或變更帳戶後 (取決於您選擇的生命週期事件類型),管道就會啟動。 | AWS 管理員 |
變更程式碼以執行管道。 | 在您變更程式碼並將其遞交至 | AWS DevOps |
手動執行管道。 | 若要手動啟動管道,請使用 中的發行變更功能 AWS CodePipeline。 | AWS DevOps |
故障診斷
問題 | 解決方案 |
---|---|
存取遭拒 | 確認您具有部署解決方案所需的許可。 |
CodeConnections 問題 |
|
管道執行問題 |
|
許可集部署問題 |
|
相關資源
AWS 服務 文件
AWS 帳戶 使用許可集管理 (IAM Identity Center 文件)
其他資源
AWS 許可集模組
(Terraform)
其他資訊
具有範例許可集的 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 許可集模組
提示