

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

# 透過部署角色販賣機解決方案來佈建最低權限的 IAM 角色
<a name="provision-least-privilege-iam-roles-by-deploying-a-role-vending-machine-solution"></a>

*Benjamin Morris、Nima Fotouhi、Aman Kaur Gandhi 和 Chad Moon，Amazon Web Services*

## 總結
<a name="provision-least-privilege-iam-roles-by-deploying-a-role-vending-machine-solution-summary"></a>

管道的超出範圍 AWS Identity and Access Management (IAM) 角色許可可能會對組織帶來不必要的風險。開發人員有時會在開發期間授予廣泛的許可，但在對程式碼進行故障診斷後忽略縮小許可範圍。這會導致一個問題，其中強大的角色在沒有業務需求的情況下存在，並且可能從未經過安全工程師的審核。

此模式提供此問題的解決方案：角色販賣機 (RVM)。使用安全且集中的部署模型，RVM 示範如何為個別 GitHub 儲存庫的管道佈建最低權限的 IAM 角色，而開發人員只需最少的努力。由於 RVM 是集中式解決方案，因此您可以將安全團隊設定為必要的檢閱者，以核准變更。此方法可讓安全性拒絕過度許可的管道角色請求。

RVM 接受 Terraform 程式碼做為輸入，並產生管道就緒的 IAM 角色做為輸出。所需的輸入是 AWS 帳戶 ID、GitHub 儲存庫名稱和許可政策。RVM 使用這些輸入來建立角色的信任政策和許可政策。產生的信任政策允許指定的 GitHub 儲存庫擔任角色，並將其用於管道操作。

RVM 使用 IAM 角色 （在引導期間設定）。此角色具有在組織中每個帳戶中擔任role-provisioning-role的許可。角色是透過 AWS Control Tower Account Factory for Terraform (AFT) 或 AWS CloudFormation StackSets 設定。role-provisioning-roles是實際為開發人員建立管道角色的角色。

## 先決條件和限制
<a name="provision-least-privilege-iam-roles-by-deploying-a-role-vending-machine-solution-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶。
+ GitHub 組織，用於透過 GitHub 動作將基礎設施部署為程式碼 (IaC)。(*不需要*** **GitHub Enterprise/Premium/Ultimate。)
+ 多帳戶 AWS 環境。此環境不需要是 的一部分 AWS Organizations。
+ 在 all 中部署 IAM 角色的機制 AWS 帳戶 （例如，AFT 或 CloudFormation StackSets)。
+ [已安裝並設定](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli) Terraform 1.3 版或更新版本。
+ [已安裝](https://github.com/hashicorp/terraform-provider-aws/releases)並[設定](https://developer.hashicorp.com/terraform/language/providers/configuration) Terraform AWS Provider 第 4 版或更新版本。

**限制**
+ 此模式的程式碼專屬於 GitHub Actions 和 Terraform。不過，模式的一般概念可以在其他持續整合和交付 (CI/CD) 架構中重複使用。
+ 有些 AWS 服務 完全無法使用 AWS 區域。如需區域可用性，請參閱[AWS 依區域的服務](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/)。如需特定端點，請參閱[服務端點和配額](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html)，然後選擇服務的連結。

## Architecture
<a name="provision-least-privilege-iam-roles-by-deploying-a-role-vending-machine-solution-architecture"></a>

下圖說明此模式的工作流程。

![\[使用 GitHub 動作自動化 IAM 角色建立和部署的工作流程。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/215c590e-0c84-411d-be6e-b1739f1e19d2/images/82fcdc9f-9576-4e7c-b7fe-b45046ba79d2.png)


角色自動販賣機的典型使用工作流程包含下列步驟：

1. 開發人員將包含新請求 IAM 角色 Terraform 程式碼的程式碼推送至 RVM GitHub 儲存庫。此動作會觸發 RVM GitHub 動作管道。

1. 管道使用 OpenID Connect (OIDC) 信任政策來擔任 RVM 角色擔任角色。

1. 當 RVM 管道執行時，它會在佈建開發人員新 IAM 角色的帳戶中擔任 RVM 工作流程角色。（使用 AFT 或 CloudFormation StackSets.)

1. RVM 會建立具有適當許可和信任的開發人員 IAM 角色，讓其他應用程式管道可以擔任該角色。

1. 應用程式開發人員可以設定其應用程式管道，以擔任此 RVM 佈建的角色。

建立的角色包含開發人員請求的許可和`ReadOnlyAccess`政策。該角色只能由針對開發人員指定儲存庫`main`分支執行的管道擔任。此方法有助於確保可能需要分支保護和檢閱才能使用角色。

**自動化和擴展**

最低權限許可需要注意佈建的每個角色的詳細資訊。此模型可降低建立這些角色所需的複雜性，讓開發人員無需額外的學習或精力即可建立所需的角色。

## 工具
<a name="provision-least-privilege-iam-roles-by-deploying-a-role-vending-machine-solution-tools"></a>

**AWS 服務**
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) 透過控制已驗證並獲授權使用的人員，協助您安全地管理對 AWS 資源的存取。
+ [AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html) 是一種帳戶管理服務，可協助您將多個 合併 AWS 帳戶 到您建立並集中管理的組織。

**其他工具**
+ [Git](https://git-scm.com/docs) 是一種開放原始碼的分散式版本控制系統。它包含建立[組織帳戶](https://docs.github.com/en/get-started/learning-about-github/types-of-github-accounts#organization-accounts)的能力。
+ [GitHub Actions](https://docs.github.com/en/actions/writing-workflows/quickstart) 是與 GitHub 儲存庫緊密整合的持續整合和持續交付 (CI/CD) 平台。您可以使用 GitHub 動作來自動化建置、測試和部署管道。
+ [Terraform](https://www.terraform.io/) 是 HashiCorp 的基礎設施即程式碼 (IaC) 工具，可協助您建立和管理雲端和內部部署資源。

**程式碼儲存庫**

此模式的程式碼可在 GitHub [role-vending-machine](https://github.com/aws-samples/role-vending-machine) 儲存庫中使用。

## 最佳實務
<a name="provision-least-privilege-iam-roles-by-deploying-a-role-vending-machine-solution-best-practices"></a>
+ **以正確的方式簡單又困難 –** 輕鬆執行正確的動作。如果開發人員在 RVM 佈建程序中遇到困難，他們可能會嘗試透過其他方式建立角色，這會破壞 RVM 的中心性質。確保您的安全團隊提供有關如何安全有效地使用 RVM 的明確指導。

  您也應該讓開發人員難以做錯事。使用服務控制政策 SCPs) 或許可界限來限制哪些角色可以建立其他角色。這種方法有助於將角色建立限制為僅 RVM 和其他信任的來源。
+ **提供良好的範例** – 不可避免地，某些開發人員會將 RVM 儲存庫中的現有角色調整為非正式範本，以授予其新角色的許可。如果您有可從中複製的最低許可範例，這可以降低開發人員請求廣泛、萬用字元密集許可的風險。如果您從具有大量萬用字元的高度許可角色開始，該問題可能會隨著時間的推移而增加。
+ **使用命名慣例和條件** – 即使開發人員不知道其應用程式將建立的所有資源名稱，他們仍應該使用命名慣例來限制角色許可。例如，如果他們正在建立 Amazon S3 儲存貯體，其資源金鑰的值可能看起來像這樣，`arn:aws:s3:::myorg-myapp-dev-*`因此其角色在儲存貯體之外沒有符合該名稱的許可。透過 IAM 政策強制執行命名慣例可提高符合命名慣例的額外好處。由於不允許建立不相符的資源，因此會發生此改善。
+ **需要提取請求 (PR) 檢閱** – RVM 解決方案的值是建立一個中央位置，其中可以檢閱新的管道角色。不過，此設計只有在有護欄有助於確保將安全、高品質的程式碼遞交至 RVM 時才有用。保護用於部署程式碼的分支 （例如 `main`) 免於直接推送，並需要核准以它們為目標的任何合併請求。
+ **設定唯讀角色** – 根據預設，RVM 會為每個請求的角色佈建一個`readonly`版本。此角色可用於不會寫入資料的 CI/CD 管道，例如`terraform plan`管道工作流程。如果唯讀工作流程行為錯誤，此方法有助於防止不必要的變更。

  根據預設， AWS 受管`ReadOnlyAccess`政策會同時連接至唯讀角色和讀寫角色。此政策可減少在決定所需許可時需要反覆運算的需求，但對某些組織而言可能過於寬鬆。如果需要，您可以從 Terraform 程式碼中移除政策。
+ **授予最低許可** – 遵循最低權限原則，並授予執行任務所需的最低許可。如需詳細資訊，請參閱 IAM 文件中的[授予最低權限](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#grant-least-priv)和[安全最佳實務](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)。

## 史詩
<a name="provision-least-privilege-iam-roles-by-deploying-a-role-vending-machine-solution-epics"></a>

### 準備環境
<a name="prepare-environment"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將範例儲存庫複製到您的 GitHub 組織。 | 將此模式的儲存庫[複製](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository)或[將此儲存庫分支](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/fork-a-repo)到您的 GitHub 組織，以便您可以根據需求進行調整。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/provision-least-privilege-iam-roles-by-deploying-a-role-vending-machine-solution.html) | DevOps 工程師 | 
| 判斷 RVM AWS 帳戶 的 。 | 決定 AWS 帳戶 要用於 RVM 的基礎設施部署。請勿使用 管理或根帳戶。 | 雲端架構師 | 
| （選用） 允許組織的管道建立 PRs。 | 只有在您想要允許`generate_providers_and_account_vars`工作流程建立 PRs時，才需要此步驟。若要允許組織的管道建立 PRs，請使用下列步驟：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/provision-least-privilege-iam-roles-by-deploying-a-role-vending-machine-solution.html)如需詳細資訊，請參閱 [ GitHub 文件中的管理儲存庫的 GitHub 動作設定](https://docs.github.com/en/enterprise-server@3.10/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#preventing-github-actions-from-creating-or-approving-pull-requests)。 GitHub  | DevOps 工程師 | 
| 將唯讀許可授予 RVM 帳戶。 | 在管理帳戶中建立授予 RVM 帳戶唯讀許可的委派政策。這可讓您的 RVM GitHub 工作流程在`generate_providers_and_account_vars.py`指令碼執行時動態提取 AWS 組織的帳戶清單。使用下列程式碼，並以您在步驟 2 中選取`<YOUR RVM Account ID>`的 AWS 帳戶 ID 取代 ：<pre>{<br />  "Version": "2012-10-17",		 	 	 <br />  "Statement": [<br />    {<br />      "Sid": "Statement",<br />      "Effect": "Allow",<br />      "Principal": {<br />        "AWS": "arn:aws:iam::<YOUR RVM Account ID>:root"<br />      },<br />      "Action": [<br />        "organizations:ListAccounts",<br />        "organizations:DescribeOrganization",<br />        "organizations:DescribeOrganizationalUnit",<br />        "organizations:ListRoots",<br />        "organizations:ListAWSServiceAccessForOrganization",<br />        "organizations:ListDelegatedAdministrators"<br />      ],<br />      "Resource": "*"<br />    }<br />  ]<br />}</pre> | 雲端管理員 | 
| 從範例儲存庫更新預設值。 | 若要將 RVM 設定為在特定環境中操作 AWS 區域，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/provision-least-privilege-iam-roles-by-deploying-a-role-vending-machine-solution.html) | DevOps 工程師 | 

### 初始化基礎設施
<a name="initialize-infrastructure"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 引導 RVM 儲存庫。 | 此步驟是建立 RVM 管道本身使用的 OIDC 信任和 IAM 角色的必要步驟，因此可以開始操作和販賣其他角色。在您的 RVM 帳戶內容中，從 `scripts/bootstrap`目錄手動執行`terraform apply`命令。根據變數文件提供任何必要的值。 | DevOps 工程師 | 

### 設定操作
<a name="configure-operations"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將 `github-workflow-rvm`和 `github-workflow-rvm-readonly`角色部署到所有 帳戶。 | 選擇符合您組織實務的部署方法，例如 AFT 或 StackSets。使用該方法將`scripts/assumed_role/main.tf`檔案中的兩個 IAM 角色 （預設名稱`github-workflow-rvm`和 `github-workflow-rvm-readonly`) 部署到您希望 RVM 能夠建立管道角色的每個帳戶。這些 IAM 角色具有信任政策，允許 RVM 帳戶的角色擔任角色 （或其`readonly`同等角色） 擔任該角色。這些角色也有 IAM 許可政策，允許他們讀取和寫入 （除非使用`readonly`角色） 符合 的角色`github-workflow-role-*`。 | AWS 管理員 | 
| 執行`generate_providers_and_account_vars`工作流程。 | 若要設定 RVM 以準備好建立管道角色，請執行下列動作：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/provision-least-privilege-iam-roles-by-deploying-a-role-vending-machine-solution.html)工作流程完成後，RVM 已準備好：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/provision-least-privilege-iam-roles-by-deploying-a-role-vending-machine-solution.html) | DevOps 工程師 | 

## 疑難排解
<a name="provision-least-privilege-iam-roles-by-deploying-a-role-vending-machine-solution-troubleshooting"></a>


| 問題 | 解決方案 | 
| --- | --- | 
| 我使用 RVM 建立角色，但 GitHub 無法擔任該角色。 | 確認 GitHub 儲存庫的名稱符合提供給`github_workflow_roles`模組的名稱。角色的範圍是讓只有一個儲存庫可以擔任這些角色。同樣地，請確認 GitHub 管道中使用的分支符合提供給`github_workflow_roles`模組的分支名稱。一般而言，具有寫入許可的 RVM 建立角色只能由範圍為`main`分支的工作流程使用 （也就是從 取得的部署`main`)。 | 
| 我的唯讀角色無法執行其管道，因為它缺少讀取特定資源的許可。 | 雖然`ReadOnlyAccess`政策提供廣泛的唯讀許可，但政策沒有某些讀取動作 （例如，某些 AWS Security Hub CSPM 動作）。您可以使用 `github-workflow-roles`模組的 `inline_policy_readonly` 參數來新增特定動作許可。 | 

## 相關資源
<a name="provision-least-privilege-iam-roles-by-deploying-a-role-vending-machine-solution-resources"></a>
+ [使用 AWS CloudFormation StackSets 的最佳實務](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-bestpractices.html)
+ [使用多個帳戶組織您的 AWS 環境](https://docs.aws.amazon.com/whitepapers/latest/organizing-your-aws-environment/organizing-your-aws-environment.html)
+ [適用於 Terraform (AFT) AWS Control Tower 的帳戶工廠概觀](https://docs.aws.amazon.com/controltower/latest/userguide/aft-overview.html)
+ [政策最佳實務](https://docs.aws.amazon.com/codepipeline/latest/userguide/security_iam_service-with-iam-policy-best-practices.html) 

## 其他資訊
<a name="provision-least-privilege-iam-roles-by-deploying-a-role-vending-machine-solution-additional"></a>

**使用 GitHub 環境**

GitHub 環境是分支型角色存取限制的替代方法。如果您偏好使用 GitHub 環境，下列是 IAM 信任政策中其他條件的語法範例。此語法指定只有在 GitHub 動作在`Production`環境中執行時，才能使用角色。

```
"StringLike": {
    "token.actions.githubusercontent.com:sub": "repo:octo-org/octo-repo:environment:Production"
}
```

範例語法使用下列預留位置值：
+ `octo-org` 是 GitHub 組織名稱。
+ `octo-repo` 是儲存庫名稱。
+ `Production` 是特定的 GitHub 環境名稱。