

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

# IDs 在 IAM 策略中使用用户进行访问控制和自动化
<a name="use-user-ids-iam-policies-access-control-automation"></a>

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

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

这种模式解释了在 AWS Identity and Access Management (IAM) 中使用基于用户名的策略的潜在缺陷、使用用户的 IDs好处以及如何将这种方法与 AWS CloudFormation 集成以实现自动化。

在中 AWS Cloud，IAM 服务可帮助您精确地管理用户身份和访问控制。然而，由于在创建 IAM 策略时依赖用户名，因此可能导致不可预见的安全风险和访问控制问题。例如，考虑这样一个场景：新员工 John Doe 加入了您的团队，您使用用户名 `j.doe` 创建了一个 IAM 用户账户，此账户通过引用用户名的 IAM 策略向他们授予权限。当 John 离开公司时，删除了此账户。当新员工 Jane Doe 加入您的团队，并因此重新创建了 `j.doe` 用户名时，麻烦开始了。现有的策略现在为 Jane Doe 授予与 John Doe 相同的权限。这样会产生安全隐患和合规隐患。

当手动更新每条策略以便反映新的用户详细信息时，这一过程既耗时又容易出错，尤其是在贵组织的成长过程中。该解决方案将使用一个唯一且不可变的用户 ID。创建 IAM 用户账户时，会为 IAM 用户 AWS 分配一个唯一的用户 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 无法更改，因此它们为在策略中引用用户提供了稳定的标识符。
+ **审计与合规。** AWS 服务 通常 IDs 在日志和审计跟踪中包含用户，这样可以轻松地将操作追溯到特定用户。
+ **自动化和集成。** IDs 在 AWS APIs SDKs、或自动化脚本中使用用户可以确保流程不受用户名更改的影响。
+ **适应未来需求。**从一开始就 IDs 在策略中使用用户可以防止潜在的访问控制问题或大量的策略更新。

**自动化**

当您使用诸如之类的基础设施即代码 (IaC) 工具时 AWS CloudFormation，基于用户名的 IAM 策略的陷阱仍可能导致问题。当您调用 `Ref` 内置函数时，IAM 用户资源将返回用户名。随着贵组织的基础设施不断发展，如果您重复使用用户名，创建并删除资源（包括 IAM 用户账户）这一循环可能会导致意外的访问控制问题。

要解决此问题，我们建议您将用户加入您的 CloudFormation 模板 IDs 中。但是，为此目的 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)页面，然后选择相应服务的链接。

## 架构
<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_cn/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) 是一项网络服务，可帮助您安全地控制对 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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 验证您的 AWS 账户 和 IAM 角色。 | 确认您拥有的 IAM 角色有权在您的中部署 CloudFormation 模板 AWS 账户。<br />如果您计划在本过程的最后一步中使用 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>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建 CloudFormation 模板。 | [See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/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><br />此参数将提示用户输入用户名。 | AWS DevOps，云架构师 | 
| 添加一个自定义资源，以便创建一个 IAM 用户。 | 将以下代码添加到 CloudFormation 模板的`Resources`部分：<pre>Resources:<br />  rNewIamUser:<br />    Type: 'AWS::IAM::User'<br />    Properties:<br />      UserName: !Ref NewIamUserName<br /></pre><br />此代码添加了一个 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_cn/prescriptive-guidance/latest/patterns/use-user-ids-iam-policies-access-control-automation.html)<br />有关如何创建执行角色的说明，请参阅 [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><br />此自定义资源将调用 Lambda 函数，以便获取 IAM `UserID`。 | AWS DevOps，云架构师 | 
| 定义 CloudFormation 输出。 | 将以下代码添加到 CloudFormation 模板的`Outputs`部分：<pre>Outputs:<br />  NewIamUserId:<br />    Value: !GetAtt rCustomGetUniqueUserId.NewIamUserId<br /></pre><br />这将显示新 IAM 用户的 IAM `UserID`。 | AWS DevOps，云架构师 | 
| 保存此模板。 | 保存对 CloudFormation 模板所做的更改。 | AWS DevOps，云架构师 | 

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


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 部署 CloudFormation 模板。 | 要使用 CloudFormation 控制台部署`get_unique_user_id.yaml`模板，请按照[CloudFormation 文档](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html)中的说明进行操作。<br />或者，您可以运行以下 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 文档）