

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

# 在 IAM 政策中使用使用者 IDs 進行存取控制和自動化
<a name="use-user-ids-iam-policies-access-control-automation"></a>

*Srinivas Ananda Babu 和 Ram Kandaswamy，Amazon Web Services*

## 總結
<a name="use-user-ids-iam-policies-access-control-automation-summary"></a>

此模式說明在 AWS Identity and Access Management (IAM) 中使用使用者名稱型政策的潛在陷阱、使用使用者 IDs的好處，以及如何將此方法與 整合 AWS CloudFormation 以進行自動化。

在 中 AWS 雲端，IAM 服務可協助您精確管理使用者身分和存取控制。不過，依賴 IAM 政策建立中的使用者名稱可能會導致無法預見的安全風險和存取控制問題。例如，請考慮此案例：新員工 John Doe 加入您的團隊，而您建立使用者名稱為 的 IAM 使用者帳戶`j.doe`，透過參考使用者名稱的 IAM 政策授予他們許可。當 John 離開公司時，帳戶會被刪除。當新員工 Jane Doe 加入您的團隊並重新建立`j.doe`使用者名稱時，問題就會開始。現有政策現在授予 Jane Doe 與 John Doe 相同的許可。這會產生潛在的安全和合規噩遊。

手動更新每個政策以反映新的使用者詳細資訊是一個耗時、容易出錯的程序，尤其是隨著組織的成長。解決方案是使用唯一且不變的使用者 ID。當您建立 IAM 使用者帳戶時， 會 AWS 為 IAM 使用者指派唯一的使用者 ID （或主體 ID)。您可以在 IAM 政策中使用這些使用者 IDs，以確保不受使用者名稱變更或重複使用影響的一致且可靠的存取控制。

例如，使用使用者 ID 的 IAM 政策可能如下所示：

```
{ 
    "Version": "2012-10-17",		 	 	  
    "Statement": [ 
        { 
            "Effect": "Allow", 
            "Action": "s3:ListBucket", 
            "Resource": "arn:aws:s3:::example-bucket", 
            "Principal": { "AWS": "arn:aws:iam::123456789012:user/abcdef01234567890" } 
        } 
      ] 
}
```

在 IAM 政策中使用使用者 IDs 的優點包括：
+ **唯一性。**使用者 IDs 在所有 中都是唯一的 AWS 帳戶，因此它們提供正確且一致的許可應用程式。
+ **抗擾性。**使用者 IDs 無法變更，因此它們提供在政策中參考使用者的穩定識別符。
+ **稽核和 compliance.** AWS 服務 通常在日誌和稽核追蹤中包含使用者 IDs，這可讓您輕鬆地將動作追蹤回特定使用者。
+ **自動化和整合。**使用 AWS APIs、 SDKs 或自動化指令碼中的使用者 IDs，可確保程序不受使用者名稱變更的影響。
+ **面向未來。**從一開始在政策中使用使用者 IDs 可以防止潛在的存取控制問題或廣泛的政策更新。

**自動化**

當您使用基礎設施做為程式碼 (IaC) 工具 AWS CloudFormation，例如，使用者名稱型 IAM 政策的陷阱仍可能導致問題。當您呼叫`Ref`內部 函數時，IAM 使用者資源會傳回使用者名稱。隨著組織的基礎設施演進，如果您重複使用使用者名稱，建立和刪除資源的週期，包括 IAM 使用者帳戶，可能會導致意外的存取控制問題。

若要解決此問題，建議您將使用者 IDs納入 CloudFormation 範本。不過，為此目的取得使用者 IDs 可能具有挑戰性。這就是自訂資源可以提供幫助的地方。您可以使用 CloudFormation 自訂資源，透過整合 AWS APIs或外部服務來擴展服務的功能。透過建立擷取指定 IAM 使用者之使用者 ID 的自訂資源，您可以在 CloudFormation 範本中提供使用者 ID。此方法可簡化參考使用者 IDs的程序，並確保您的自動化工作流程保持強大且符合未來需求。

## 先決條件和限制
<a name="use-user-ids-iam-policies-access-control-automation-prereqs"></a>

**先決條件**
+ 作用中 AWS 帳戶
+ 雲端管理員執行 CloudFormation 範本的 IAM 角色

**限制**
+ 有些 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="use-user-ids-iam-policies-access-control-automation-architecture"></a>

**目標架構**

下圖顯示 如何使用 支援的 CloudFormation 自訂資源 AWS Lambda 來擷取 IAM 使用者 ID。

![\[使用 CloudFormation 自訂資源取得 IAM 使用者 ID。\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/images/pattern-img/71698647-274e-4911-92f0-549e444b53f6/images/7e507df4-f597-499e-bd5b-6d7a55e64146.png)


**自動化和擴展**

您可以針對不同的 AWS 區域 和 帳戶多次使用 CloudFormation 範本。您只需要在每個區域或帳戶中執行一次。

## 工具
<a name="use-user-ids-iam-policies-access-control-automation-tools"></a>

**AWS 服務**
+ [IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) – AWS Identity and Access Management (IAM) 是一種 Web 服務，可協助您安全地控制對 AWS 資源的存取。您可以使用 IAM 來控制能通過身分驗證 (登入) 和授權使用資源的 (具有許可) 的人員。
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) – AWS CloudFormation 可協助您建立和設定 AWS 資源的模型，以減少管理這些資源的時間，並有更多時間專注於執行的應用程式 AWS。您可以建立描述所需 AWS 資源的範本，CloudFormation 會為您佈建和設定這些資源。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) – AWS Lambda 是一種運算服務，支援執行程式碼，無需佈建或管理伺服器。Lambda 只有在需要時才會執行程式碼，可自動從每天數項請求擴展成每秒數千項請求。 

## 最佳實務
<a name="use-user-ids-iam-policies-access-control-automation-best-practices"></a>

如果您是從頭開始或規劃綠地部署，強烈建議您使用 [AWS IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html)進行集中式使用者管理。IAM Identity Center 會與您現有的身分提供者 （例如 Active Directory 或 Okta) 整合，以聯合使用者身分 AWS，因此不需要直接建立和管理 IAM 使用者。這種方法不僅可確保一致的存取控制，還簡化了使用者生命週期管理，並有助於增強整個 AWS 環境的安全性和合規性。

## 史詩
<a name="use-user-ids-iam-policies-access-control-automation-epics"></a>

### 驗證許可
<a name="validate-permissions"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 驗證您的 AWS 帳戶 和 IAM 角色。 | 確認您的 IAM 角色具有在 中部署 CloudFormation 範本的許可 AWS 帳戶。如果您打算在此程序的最後一個步驟中使用 AWS CLI 而非 CloudFormation 主控台來部署範本，您也應該設定暫時登入資料來執行 AWS CLI 命令。如需說明，請參閱 [IAM 文件](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html#using-temp-creds-sdk-cli)。 | 雲端架構師 | 

### 建置 CloudFormation 範本
<a name="build-a-cfnshort-template"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立 CloudFormation 範本。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/use-user-ids-iam-policies-access-control-automation.html) | AWS DevOps，雲端架構師 | 
| 新增使用者名稱的輸入參數。 | 將下列程式碼新增至 CloudFormation 範本的 `Parameters`區段：<pre>Parameters:<br />  NewIamUserName:<br />    Type: String<br />    Description: Unique username for the new IAM user<br /></pre>此參數會提示使用者輸入使用者名稱。 | AWS DevOps，雲端架構師 | 
| 新增自訂資源以建立 IAM 使用者。 | 將下列程式碼新增至 CloudFormation 範本的 `Resources`區段：<pre>Resources:<br />  rNewIamUser:<br />    Type: 'AWS::IAM::User'<br />    Properties:<br />      UserName: !Ref NewIamUserName<br /></pre>此程式碼會新增 CloudFormation 資源，以 `NewIamUserName` 參數提供的名稱建立 IAM 使用者。 | AWS DevOps，雲端架構師 | 
| 新增 Lambda 函數的執行角色。 | 在此步驟中，您會建立 IAM 角色，授予 AWS Lambda 函數取得 IAM 的許可`UserId`。指定下列 Lambda 執行所需的最低許可：[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/use-user-ids-iam-policies-access-control-automation.html)如需建立執行角色的說明，請參閱 [Lambda 文件](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)。當您建立 Lambda 函數時，您將在下一個步驟中參考此角色。 | AWS 管理員、雲端架構師 | 
| 新增 Lambda 函數以取得唯一的 IAM `UserId`。 | 在此步驟中，您會定義具有 Python 執行時間的 Lambda 函數，以取得唯一的 IAM `UserId`。若要這樣做，請將下列程式碼新增至 CloudFormation 範本的 `Resources`區段。`<<ROLENAME>>` 將 取代為您在最後一個步驟中建立的執行角色名稱。<pre>  GetUserLambdaFunction:<br />    Type: 'AWS::Lambda::Function'<br />    Properties:<br />      Handler: index.handler<br />      Role: <<ROLENAME>><br />      Timeout: 30<br />      Runtime: python3.11<br />      Code:<br />        ZipFile: |<br />          import cfnresponse, boto3<br />          def handler(event, context):<br />            try:<br />              print(event)<br />              user = boto3.client('iam').get_user(UserName=event['ResourceProperties']['NewIamUserName'])['User']<br />              cfnresponse.send(event, context, cfnresponse.SUCCESS, {'NewIamUserId': user['UserId'], 'NewIamUserPath': user['Path'], 'NewIamUserArn': user['Arn']})<br />            except Exception as e:<br />              cfnresponse.send(event, context, cfnresponse.FAILED, {'NewIamUser': str(e)})<br /></pre> | AWS DevOps，雲端架構師 | 
| 新增自訂資源。 | 將下列程式碼新增至 CloudFormation 範本的 `Resources`區段：<pre>  rCustomGetUniqueUserId:<br />    Type: 'Custom::rCustomGetUniqueUserIdWithLambda'<br />    Properties:<br />      ServiceToken: !GetAtt GetUserLambdaFunction.Arn<br />      NewIamUserName: !Ref NewIamUserName<br /></pre>此自訂資源會呼叫 Lambda 函數以取得 IAM `UserID`。 | AWS DevOps，雲端架構師 | 
| 定義 CloudFormation 輸出。 | 將下列程式碼新增至 CloudFormation 範本的 `Outputs`區段：<pre>Outputs:<br />  NewIamUserId:<br />    Value: !GetAtt rCustomGetUniqueUserId.NewIamUserId<br /></pre>這會顯示`UserID`新 IAM 使用者的 IAM。 | AWS DevOps，雲端架構師 | 
| 儲存範本。 | 將變更儲存至 CloudFormation 範本。 | AWS DevOps，雲端架構師 | 

### 部署 CloudFormation 範本
<a name="deploy-the-cfnshort-template"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 部署 CloudFormation 範本。 | 若要使用 CloudFormation 主控台部署`get_unique_user_id.yaml`範本，請遵循 [CloudFormation 文件](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)中的指示。或者，您可以執行下列 AWS CLI 命令來部署範本：<pre>aws cloudformation create-stack \<br />--stack-name DemoNewUser \<br />--template-body file://get_unique_user_id.yaml \<br />--parameters ParameterKey=NewIamUserName,ParameterValue=demouser \<br />--capabilities CAPABILITY_NAMED_IAM</pre> | AWS DevOps，雲端架構師 | 

## 相關資源
<a name="use-user-ids-iam-policies-access-control-automation-resources"></a>
+ [從 CloudFormation 主控台建立堆疊](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html) (CloudFormation 文件）
+ [Lambda 支援的自訂資源](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources-lambda.html) (CloudFormation 文件）
+ [唯一識別符 ](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-unique-ids)(IAM 文件）
+ [搭配 AWS 資源使用臨時登入](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html)資料 (IAM 文件）