

# 使用上次访问信息的示例应用场景
<a name="access_policies_last-accessed-example-scenarios"></a>

您可以使用上次访问的信息确定您为 IAM 实体或 AWS Organizations 实体授予的权限。有关更多信息，请参阅 [使用上次访问的信息优化 AWS 中的权限](access_policies_last-accessed.md)。

**注意**  
在 IAM 或 AWS Organizations 中查看实体或策略的访问信息之前，请确保您了解信息的报告周期、报告的实体和评估的策略类型。有关更多详细信息，请参阅[关于上次访问的信息的知识](access_policies_last-accessed.md#access_policies_last-accessed-know)。

作为管理员，您可以平衡适合您的公司的可访问性和最小权限。

## 使用信息减少 IAM 组的权限
<a name="last-accessed-sample-reduce-permissions-group"></a>

您可以使用上次访问的信息减少 IAM 组权限，以仅包含用户所需的服务。此方法是在服务级别[授予最小权限](best-practices.md#grant-least-privilege)的重要步骤。

例如，Paulo Santos 是负责为 Example Corp 定义 AWS 用户权限的管理员。这家公司刚刚开始使用 AWS，而软件开发团队尚未定义他们将使用何种 AWS 服务。Paulo 希望仅向团队授予访问他们所需的服务的权限，但由于尚未定义，因此他暂时向团队授予高级用户权限。然后，他使用上次访问的信息来减少组的权限。

Paulo 使用以下 JSON 文本创建名为 `ExampleDevelopment` 的托管策略。然后，他将该策略附加到名为 `Development` 的组，并将所有开发人员添加到该组。

**注意**  
Paulo 的高级用户可能需要 `iam:CreateServiceLinkedRole` 权限才能使用某些服务和功能。他知道添加此权限将允许用户创建任何服务相关角色。他为高级用户接受这种风险。

------
#### [ JSON ]

****  

```
{

    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "FullAccessToAllServicesExceptPeopleManagement",
            "Effect": "Allow",
            "NotAction": [
                "iam:*",
                "organizations:*"
            ],
            "Resource": "*"
        },
        {
            "Sid": "RequiredIamAndOrgsActions",
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceLinkedRole",
                "iam:ListRoles",
                "organizations:DescribeOrganization"
            ],
            "Resource": "*"
        }
    ]
}
```

------

Paulo 决定等待 90 天，之后再使用 AWS 管理控制台[查看上次访问的信息](access_policies_last-accessed-view-data.md#access_policies_last-accessed-viewing)（适用于 `Development` 组）。他查看组成员访问过的服务的列表。他了解到，用户上周访问了 5 项服务：AWS CloudTrail、Amazon CloudWatch Logs、Amazon EC2、AWS KMS 和 Amazon S3.. 他们在首次评估 AWS 时访问过其他几项服务，但之后便未访问。

Paulo 决定减少策略权限以仅包含上述 5 项服务以及所需的 IAM 和 AWS Organizations 操作。他使用以下 JSON 文本编辑 `ExampleDevelopment` 策略。

**注意**  
Paulo 的高级用户可能需要 `iam:CreateServiceLinkedRole` 权限才能使用某些服务和功能。他知道添加此权限将允许用户创建任何服务相关角色。他为高级用户接受这种风险。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "FullAccessToListedServices",
            "Effect": "Allow",
            "Action": [
                "s3:*",
                "kms:*",
                "cloudtrail:*",
                "logs:*",
                "ec2:*"
            ],
            "Resource": "*"
        },
        {
            "Sid": "RequiredIamAndOrgsActions",
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceLinkedRole",
                "iam:ListRoles",
                "organizations:DescribeOrganization"
            ],
            "Resource": "*"
        }
    ]
}
```

------

为了进一步减少权限，Paulo 可在 AWS CloudTrail **Event history (事件历史记录)** 中查看账户的事件。在那里，他可以查看可用于减少策略权限的详细事件信息，以仅包括开发人员所需的操作和资源。有关更多信息，请参阅 *AWS CloudTrail 用户指南*中的[在 CloudTrail 控制台中查看 CloudTrail 事件](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events-console.html)。

## 使用信息减少 IAM 用户的权限
<a name="access_policies_last-accessed-reduce-permissions-users"></a>

您可以使用上次访问的信息来减少单个 IAM 用户的权限。

例如，Martha Rivera 是 IT 管理员，她负责确保公司的人员没有多余的 AWS 权限。在定期安检中，她检查所有 IAM 用户的权限。这些用户中，有一个是名叫 Nikhil Jayashankar 的应用程序开发人员，以前担任过安全工程师。由于工作要求发生变化，Nikhil 成为了 `app-dev` 组和 `security-team` 组的成员。适用于他的新工作的 `app-dev` 组授予了对多项服务（包括 Amazon EC2、Amazon EBS、Auto Scaling、Amazon S3、Route 53 和 Elastic Transcoder）的权限。他的旧工作的 `security-team` 组授予了对 IAM 和 CloudTrail 的权限。

Martha 以管理员身份登录 IAM 控制台，并依次选择**用户**、姓名 `nikhilj` 和**上次访问时间**选项卡。

Martha 查看 **Last Accessed**（上次访问时间）列，发现 Nikhil 最近未访问过 IAM、CloudTrail、Route 53、Amazon Elastic Transcoder 以及很多其他 AWS 服务。Nikhil 已访问 Amazon S3。Martha 从服务列表中选择 **S3**，并了解到 Nikhil 在过去两周内执行了部分 Amazon S3 `List` 操作。在其公司内部，Martha 确认 Nikhil 不再有访问 IAM 和 CloudTrail 的业务需要，因为他不再是内部安全团队的成员。

Martha 管理员现在准备好处理上次访问的服务和操作信息。但是，与上一个示例中的组不同，像 `nikhilj` 这样的 IAM 用户可能受多个策略的约束并且是多个组的成员。Martha 必须谨慎行事，以避免无意中破坏 `nikhilj` 或其他组成员的访问权限。除了了解 Nikhil 应拥有的访问权限之外，她还必须确定他*如何*接收这些权限。

Martha 选择 **Permissions (权限)** 选项卡，可在其中查看直接附加到 `nikhilj` 的策略以及从组附加的策略。她扩展每个策略并查看策略摘要，以了解哪个策略允许访问 Nikhil 未使用的服务：
+ IAM – `IAMFullAccess` AWS 托管策略直接附加到 `nikhilj` 并附加到 `security-team` 组。
+ CloudTrail - `AWSCloudTrailReadOnlyAccess` AWS 托管策略附加到 `security-team` 组。
+ Route 53 – `App-Dev-Route53` 客户托管策略附加到 `app-dev` 组。
+ Elastic Transcoder - `App-Dev-ElasticTranscoder` 客户托管策略附加到 `app-dev` 组。

Martha 决定删除直接附加到 `nikhilj` 的 `IAMFullAccess` AWS 托管策略。她还删除 Nikhil 的 `security-team` 组成员资格。这两项操作删除了对 IAM 和 CloudTrail 的不必要的访问权限。

Nikhil 对 Route 53 和 Elastic Transcoder 的访问权限由 `app-dev` 组授予。虽然 Nikhil 未使用这些服务，但组的其他成员可能使用了这些服务。Martha 查看 `app-dev` 组的上次访问信息，并了解到有几个成员最近访问了 Route 53 和 Amazon S3。但在过去一年中，没有任何组成员访问过 Elastic Transcoder。她从组中删除 `App-Dev-ElasticTranscoder` 客户托管策略。

然后，Martha 查看 `App-Dev-ElasticTranscoder` 客户托管策略的上次访问的信息。她了解到该策略未附加到任何其他 IAM 身份。她在公司内部进行调查，以确保将来不再需要该策略，然后将其删除。

## 在删除 IAM 资源之前使用信息
<a name="last-accessed-sample-delete-resources"></a>

在删除 IAM 资源之前，您可以使用上次访问的信息，以确保自上次使用该资源以来已经过了一定的时间。这适用于用户、组、角色和策略。要了解这些操作的更多信息，请参阅以下主题：
+ **IAM 用户** – [移除或停用 IAM 用户](id_users_remove.md)
+ **群组** – [删除 IAM 群组](id_groups_manage_delete.md)
+ **角色** – [删除角色或实例配置文件](id_roles_manage_delete.md)
+ **策略** - [删除 IAM 策略（这还会将策略与身份分离）](access_policies_manage-delete.md)

## 在编辑 IAM policy 之前使用信息
<a name="last-accessed-sample-edit-policies"></a>

您可以先查看 IAM 身份（用户、组或角色）或 IAM policy 的上次访问信息，然后再编辑影响该资源的策略。这很重要，因为您不想删除正在使用它的人员的访问权限。

例如，Arnav Desai 是 Example Corp 的开发人员和 AWS 管理员。当他的团队开始使用 AWS，他们为所有开发人员提供了高级用户访问权限，允许他们完全访问除 IAM 和 AWS Organizations 之外的所有服务。作为[授予最小权限](best-practices.md#grant-least-privilege)操作的第一步，Arnav 希望使用 AWS CLI 来查看其账户中的托管策略。

为此，Arnav 首先使用以下命令在其账户中列出附加到身份的客户托管权限策略：

```
aws iam list-policies --scope Local --only-attached --policy-usage-filter PermissionsPolicy
```

从响应中，他捕获了每个策略的 ARN。然后，Arnav 使用以下命令为每个策略生成上次访问的信息报告。

```
aws iam generate-service-last-accessed-details --arn arn:aws:iam::123456789012:policy/ExamplePolicy1
```

在该响应中，他从 `JobId` 字段中捕获了生成的报告的 ID。然后，Arnav 轮询以下命令，直到 `JobStatus` 字段返回 `COMPLETED` 或 `FAILED` 值。如果作业失败，他将捕获错误。

```
aws iam get-service-last-accessed-details --job-id 98a765b4-3cde-2101-2345-example678f9
```

当作业的状态为 `COMPLETED` 时，Arnav 将解析 JSON 格式的 `ServicesLastAccessed` 数组的内容。

```
 "ServicesLastAccessed": [
        {
            "TotalAuthenticatedEntities": 1,
            "LastAuthenticated": 2018-11-01T21:24:33.222Z,
            "ServiceNamespace": "dynamodb",
            "LastAuthenticatedEntity": "arn:aws:iam::123456789012:user/IAMExampleUser",
            "ServiceName": "Amazon DynamoDB"
        },

        {
            "TotalAuthenticatedEntities": 0,
            "ServiceNamespace": "ec2",
            "ServiceName": "Amazon EC2"
        },

        {
            "TotalAuthenticatedEntities": 3,
            "LastAuthenticated": 2018-08-25T15:29:51.156Z,
            "ServiceNamespace": "s3",
            "LastAuthenticatedEntity": "arn:aws:iam::123456789012:role/IAMExampleRole",
            "ServiceName": "Amazon S3"
        }
    ]
```

通过此信息，Arnav 了解到 `ExamplePolicy1` 策略允许访问三项服务，即 Amazon DynamoDB、Amazon S3 和 Amazon EC2。名为 `IAMExampleUser` 的 IAM 用户上次于 11 月 1 日尝试访问过 DynamoDB，并且有人已于 8 月 25 日使用 `IAMExampleRole` 角色尝试访问 Amazon S3。此外，还有另外两个实体在去年尝试访问过 Amazon S3。但是，去年没有人尝试访问 Amazon EC2。

这意味着，Arnav 可从策略中安全地删除 Amazon EC2 操作。Arnav 想查看策略的当前 JSON 文档。首先，他必须使用以下命令确定策略的版本号。

```
aws iam list-policy-versions --policy-arn arn:aws:iam::123456789012:policy/ExamplePolicy1
```

从响应中，Arnav 收集 `Versions` 数组中的当前默认版本号。然后，他使用该版本号 (`v2`) 通过以下命令请求 JSON 策略文档。

```
aws iam get-policy-version --policy-arn arn:aws:iam::123456789012:policy/ExamplePolicy1 --version-id v2
```

Arnav 存储 `PolicyVersion` 数组的 `Document` 字段中返回的 JSON 策略文档。在该策略文档中，Arnav 在 `ec2` 命名空间中搜索操作。如果在该策略中没有其他命名空间中的操作，则他将该策略与受影响的身份（用户、组和角色）分离。然后，他删除该策略。在这种情况下，策略确实包含 Amazon DynamoDB 和 Amazon S3 服务。因此，Arnav 从文档中删除 Amazon EC2 操作并保存更改。然后，他使用以下命令通过文档的新版本更新策略并将该版本设置为默认策略版本。

```
aws iam create-policy-version --policy-arn arn:aws:iam::123456789012:policy/ExamplePolicy1 --policy-document file://UpdatedPolicy.json --set-as-default
```

`ExamplePolicy1` 策略现已更新以删除对不必要的 Amazon EC2 服务的访问权限。

## 其他 IAM 应用场景
<a name="last-accessed-scenarios-other"></a>

有关 IAM 资源（用户、组、角色或策略）上次尝试访问服务的时间的信息可在您完成以下任何任务时为您提供帮助：
+ **Policies**（策略）- [编辑现有的客户托管策略或内联策略以删除权限](access_policies_manage-edit.md)
+ **Policies**（策略）- [将内联策略转换为托管策略，然后将其删除](access_policies-convert-inline-to-managed.md)
+ **Policies**（策略）- [向现有策略添加显式拒绝](reference_policies_evaluation-logic_AccessPolicyLanguage_Interplay.md)
+ **Policies**（策略）- [将托管策略与身份（用户、组或角色）分离](access_policies_manage-attach-detach.md#detach-managed-policy-console)
+ **Entities**（实体）- [设置权限边界以控制实体（用户或角色）可以拥有的最大权限](access_policies_manage-attach-detach.md)
+ **Groups**（组）- [从组中删除用户](id_groups_manage_add-remove-users.md)

## 使用信息来优化组织部门的权限
<a name="access_policies_last-accessed-reduce-permissions-orgs"></a>

您可以在 AWS Organizations 中使用上次访问的信息优化组织部门 (OU) 的权限。

例如，John Stiles 是一个 AWS Organizations 管理员。他负责确保具有公司 AWS 账户 的人员没有多余的权限。作为定期安全审核的一部分，他检查组织的权限。他的 `Development` OU 包含经常用于测试新 AWS 服务的账户。John 决定定期查看超过 180 天未访问的服务的报告。然后，他删除 OU 成员访问这些服务的权限。

John 使用管理账户凭证登录到 IAM 控制台。在 IAM 控制台中，他找到 AWS Organizations OU 的 `Development` 数据。他查看 **Service access report (服务访问报告)** 表，并发现两个超过 180 天（首选的时段）未访问的 AWS 服务。他记得为开发团队添加了权限以访问 Amazon Lex 和 AWS Database Migration Service。John 联系开发团队，并确认他们不再有测试这些服务的业务需求。

John 现在已准备好处理上次访问的信息。他选择 **Edit in AWS Organizations**（在 Amazon Organizations 中编辑），系统提醒他 SCP 将附加到多个实体。他选择 **Continue (继续)**。在 AWS Organizations 中，他检查目标以了解 SCP 附加到哪些 AWS Organizations 实体。所有实体均位于 `Development` OU 中。

John 决定在 `NewServiceTest` SCP 中拒绝访问 Amazon Lex 和 AWS Database Migration Service 操作。该操作将删除这些对这些服务的不必要访问。