使用 AWS CloudTrail 记录 IAM 和 AWS STS API 调用 - AWS Identity and Access Management

使用 AWS CloudTrail 记录 IAM 和 AWS STS API 调用

IAM 和 AWS STS 与 AWS CloudTrail 集成,后者是记录 IAM 用户或角色所执行操作的服务。CloudTrail 将对 IAM 和 AWS STS 的所有 API 调用作为事件捕获,包括来自控制台的调用和 API 调用。如果您创建了跟踪,则可以使 CloudTrail 事件持续传送到 Amazon S3 存储桶。如果您不配置跟踪,则仍可在 CloudTrail 控制台中的 事件历史记录 中查看最新事件。可使用 CloudTrail 获取有关对 IAM 或 AWS STS 发出的请求的信息。例如,您可以查看发出请求的源 IP 地址、用户、时间以及其他详细信息。

要了解有关 CloudTrail 的更多信息,请参阅 AWS CloudTrail 用户指南

CloudTrail 中的 IAM 和 AWS STS 信息

在您创建 AWS 账户 时,将在该帐户上启用 CloudTrail。当 IAM 或 AWS STS 中发生活动时,该活动将记录在 CloudTrail 事件中,并与其他 AWS 服务事件一同保存在 Event history(事件历史记录)中。您可以在 AWS 账户 中查看、搜索和下载最新事件。有关更多信息,请参阅使用 CloudTrail 事件历史记录查看事件

要持续记录 AWS 账户 中的事件(包括 IAM 和 AWS STS 的事件),请创建跟踪。通过跟踪,CloudTrail 可将日志文件传送至 Amazon S3 存储桶。预设情况下,在控制台中创建跟踪时,此跟踪应用于所有 区域。此跟踪记录在 AWS 分区中记录所有区域中的事件,并将日志文件传送至您指定的 Amazon S3 存储桶。此外,您可以配置其他 AWS 服务,进一步分析在 CloudTrail 日志中收集的事件数据并采取行动。有关更多信息,请参阅:

所有 IAM 和 AWS STS 操作均由 CloudTrail 记录,并记录在了 IAM API 参考AWS Security Token Service API 参考中。

记录 IAM 和 AWS STS API 请求

CloudTrail 将所有经过身份验证的 API 请求记录到 IAM 和 AWS STS API 操作。CloudTrail 还会将未经身份验证的请求记录到 AWS STS 操作、AssumeRoleWithSAMLAssumeRoleWithWebIdentity,并记录身份提供程序所提供的信息。但是,某些未经身份验证的 AWS STS 请求可能不会被记录,因为它们不符合最低期望,即其有效性不足以作为合法请求被信任。

您可以使用记录的信息将由一个联合用户通过担任角色发出的调用映射回原始外部联合调用方。如果使用 AssumeRole,您可以将调用映射回到发出请求的 AWS; 服务或发出请求的用户的账户。CloudTrail 日志条目中 JSON 数据的 userIdentity 部分包含您将 AssumeRole* 请求与特定联合用户进行映射时所需的信息。有关更多信息,请参阅《AWS CloudTrail 用户指南》中的 CloudTrail userIdentity 元素

例如,IAM CreateUserDeleteRoleListGroups 调用和其他 API 操作全部都由 CloudTrail 记录。

本主题后面将会介绍有关此类日志条目的示例。

将 API 请求记录到其他 AWS 服务

对其他 AWS 服务 API 操作的经过身份验证的请求由 CloudTrail 记录,这些日志条目包含有关生成请求的人员的信息。

例如,假设您发出一个请求来列出 Amazon EC2 实例或创建 AWS CodeDeploy 部署组。有关发出该请求的人员或服务的详细信息将包含在该请求的日志条目中。此信息可帮助您确定发出该请求的是 AWS 账户根用户、IAM 用户、角色还是其他 AWS 服务。

有关 CloudTrail 日志条目中用户身份信息的详细信息,请参阅 AWS CloudTrail 用户指南中的 userIdentity 元素

记录用户登录事件

CloudTrail 会将登录事件记录到 AWS Management Console、AWS 论坛 和 AWS Marketplace 中。CloudTrail 将为 IAM 用户和联合身份用户记录成功和失败的登录尝试。

要查看成功和不成功的根用户登录的 CloudTrail 事件示例,请参阅 AWS CloudTrail 用户指南中的根用户的事件记录示例

作为最佳安全做法,当用户名称不正确导致登录故障时,AWS 不记录输入的 IAM 用户名称文本。用户名称文本将用 HIDDEN_DUE_TO_SECURITY_REASONS 值代替。有关示例,请参阅本主题后面的用户名称不正确导致的登录失败事件示例。用户名称文本隐藏,因为此类错误可能是用户错误所导致。记录这些错误可能会泄露潜在的敏感信息。例如:

  • 您不小心在用户名框中键入了密码。

  • 您选择一个 AWS 账户 的登录页面的链接,但随后键入了另一 AWS 账户 的账号。

  • 您忘记了所登录的是哪个账户,不小心键入了个人电子邮件账户的账户名、银行登录标识符或某些其他私有 ID。

记录临时凭证的登录事件

当主体请求临时凭证时,主体类型将决定 CloudTrail 记录事件的方式。当主体代入其他账户中的角色时,这会很复杂。有多个 API 调用执行与角色跨账户操作相关的操作。首先,主体调用 AWS STS API 来检索临时凭证。该操作记录到调用账户中以及执行 AWS STS 操作的账户中。然后,主体使用角色在代入角色的账户中执行其他 API 调用。

您可以在角色信任策略中使用 sts:SourceIdentity 条件键,以要求用户在代入角色时指定身份。例如,您可以要求 IAM 用户指定自己的用户名作为其源身份。这可以帮助您确定哪个用户在 AWS 中执行了具体的操作。有关更多信息,请参阅 sts:SourceIdentity。您可以使用 sts:RoleSessionName,以要求用户在代入角色时指定会话名称。这可以在您查看 AWS CloudTrail 日志时帮助您区分不同主体对角色使用的角色会话。

下表说明了 CloudTrail 如何为生成临时凭证的每个 AWS STS API 记录不同的用户标识信息。

主体类型 STS API 发起人账户的 CloudTrail 日志中的用户身份 所代入角色的账户的 CloudTrail 日志中的用户身份 角色后续 API 调用的 CloudTrail 日志中的用户身份
AWS 账户根用户 凭证 GetSessionToken 根用户身份 角色所有者账户与调用账户相同 根用户身份
IAM 用户 GetSessionToken IAM 用户身份。 角色所有者账户与调用账户相同 IAM 用户身份。
IAM 用户 GetFederationToken IAM 用户身份。 角色所有者账户与调用账户相同 IAM 用户身份。
IAM 用户 AssumeRole IAM 用户身份。 账号和主体 ID(如果是用户)或 AWS 服务主体 仅角色身份(无用户)
外部验证的用户 AssumeRoleWithSAML 不适用 SAML 用户身份 仅角色身份(无用户)
外部验证的用户 AssumeRoleWithWebIdentity 不适用 OIDC/Web 用户身份 仅角色身份(无用户)

如果某项操作对资源没有任何变异影响,那么 CloudTrail 会将其视为只读。当记录只读事件时,CloudTrail 会编辑日志中的 responseElements 信息。当 CloudTrail 记录非只读事件时,日志条目中会显示完整的 responseElements。但是,对于 AWS STS API AssumeRoleAssumeRoleWithSAMLAssumeRoleWithWebIdentity,即使它们被记录为只读,CloudTrail 也会在这些 API 的日志中包含完整的 responseElements

下表说明了 CloudTrail 如何为生成临时凭证的每个 AWS STS API 记录 responseElementsreadOnly 信息。

STS API 响应元素信息 Read-only
AssumeRole 包含 true
AssumeRoleWithSAML 包含 true
AssumeRoleWithWebIdentity 包含 true
GetFederationToken 包含 false
GetSessionToken 包含 false

CloudTrail 日志中的 IAM API 事件示例

CloudTrail 日志文件包含的事件采用 JSON 格式。一个 API 事件表示一个 API 请求,并包括有关主体、所请求的操作、任意参数以及该操作日期和时间的信息。

CloudTrail 日志文件中的 IAM API 事件示例

以下示例说明了为进行 IAM GetUserPolicy 操作而发出的请求的 CloudTrail 日志条目。

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AIDACKCEVSQ6C2EXAMPLE", "arn": "arn:aws:iam::444455556666:user/JaneDoe", "accountId": "444455556666", "accessKeyId": "AKIAI44QH8DHBEXAMPLE", "userName": "JaneDoe", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2014-07-15T21:39:40Z" } }, "invokedBy": "signin.amazonaws.com" }, "eventTime": "2014-07-15T21:40:14Z", "eventSource": "iam.amazonaws.com", "eventName": "GetUserPolicy", "awsRegion": "us-east-2", "sourceIPAddress": "signin.amazonaws.com", "userAgent": "signin.amazonaws.com", "requestParameters": { "userName": "JaneDoe", "policyName": "ReadOnlyAccess-JaneDoe-201407151307" }, "responseElements": null, "requestID": "9EXAMPLE-0c68-11e4-a24e-d5e16EXAMPLE", "eventID": "cEXAMPLE-127e-4632-980d-505a4EXAMPLE" }

通过此事件信息,您可以确定发出该请求的目的是为了获取用户 ReadOnlyAccess-JaneDoe-201407151307 的名为 JaneDoe 的用户策略,如 requestParameters 元素中所述。您还可以看到,该请求是由名为 JaneDoe 的 IAM 用户在 2014 年 7 月 15 日下午 9:40 (UTC) 发出的。在本示例中,请求源自 AWS Management Console,您可以从 userAgent 元素中判断出来。

CloudTrail 日志中的 AWS STS API 事件示例

CloudTrail 日志文件包含的事件采用 JSON 格式。一个 API 事件表示一个 API 请求,并包括有关主体、所请求的操作、任意参数以及该操作日期和时间的信息。

CloudTrail 日志文件中跨账户 AWS STS API 事件的示例

账户 777788889999 中名为 JohnDoe 的 IAM 用户调用 AWS STS AssumeRole 操作来在账户 111122223333 中担任角色 EC2-dev。账户管理员要求用户在担任角色时设置与其用户名相同的源身份。用户传入 JohnDoe 的源身份值。

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AIDAQRSTUVWXYZEXAMPLE", "arn": "arn:aws:iam::777788889999:user/JohnDoe", "accountId": "777788889999", "accessKeyId": "AKIAIOSFODNN7EXAMPLE", "userName": "JohnDoe" }, "eventTime": "2014-07-18T15:07:39Z", "eventSource": "sts.amazonaws.com", "eventName": "AssumeRole", "awsRegion": "us-east-2", "sourceIPAddress": "192.0.2.101", "userAgent": "aws-cli/1.11.10 Python/2.7.8 Linux/3.2.45-0.6.wd.865.49.315.metal1.x86_64 botocore/1.4.67", "requestParameters": { "roleArn": "arn:aws:iam::111122223333:role/EC2-dev", "roleSessionName": "JohnDoe-EC2-dev", "sourceIdentity": "JohnDoe", "serialNumber": "arn:aws:iam::777788889999:mfa" }, "responseElements": { "credentials": { "sessionToken": "<encoded session token blob>", "accessKeyId": "ASIAI44QH8DHBEXAMPLE", "expiration": "Jul 18, 2023, 4:07:39 PM" }, "assumedRoleUser": { "assumedRoleId": "AIDAQRSTUVWXYZEXAMPLE:JohnDoe-EC2-dev", "arn": "arn:aws:sts::111122223333:assumed-role/EC2-dev/JohnDoe-EC2-dev" }, "sourceIdentity": "JohnDoe" }, "resources": [ { "ARN": "arn:aws:iam::111122223333:role/EC2-dev", "accountId": "111122223333", "type": "AWS::IAM::Role" } ], "requestID": "4EXAMPLE-0e8d-11e4-96e4-e55c0EXAMPLE", "sharedEventID": "bEXAMPLE-efea-4a70-b951-19a88EXAMPLE", "eventID": "dEXAMPLE-ac7f-466c-a608-4ac8dEXAMPLE", "eventType": "AwsApiCall", "recipientAccountId": "111122223333" }

第二个示例显示同一请求的代入角色账户 (111122223333) 的 CloudTrail 日志条目。

{ "eventVersion": "1.05", "userIdentity": { "type": "AWSAccount", "principalId": "AIDAQRSTUVWXYZEXAMPLE", "accountId": "777788889999" }, "eventTime": "2014-07-18T15:07:39Z", "eventSource": "sts.amazonaws.com", "eventName": "AssumeRole", "awsRegion": "us-east-2", "sourceIPAddress": "192.0.2.101", "userAgent": "aws-cli/1.11.10 Python/2.7.8 Linux/3.2.45-0.6.wd.865.49.315.metal1.x86_64 botocore/1.4.67", "requestParameters": { "roleArn": "arn:aws:iam::111122223333:role/EC2-dev", "roleSessionName": "JohnDoe-EC2-dev", "sourceIdentity": "JohnDoe", "serialNumber": "arn:aws:iam::777788889999:mfa" }, "responseElements": { "credentials": { "sessionToken": "<encoded session token blob>", "accessKeyId": "ASIAI44QH8DHBEXAMPLE", "expiration": "Jul 18, 2014, 4:07:39 PM" }, "assumedRoleUser": { "assumedRoleId": "AIDAQRSTUVWXYZEXAMPLE:JohnDoe-EC2-dev", "arn": "arn:aws:sts::111122223333:assumed-role/EC2-dev/JohnDoe-EC2-dev" }, "sourceIdentity": "JohnDoe" }, "requestID": "4EXAMPLE-0e8d-11e4-96e4-e55c0EXAMPLE", "sharedEventID": "bEXAMPLE-efea-4a70-b951-19a88EXAMPLE", "eventID": "dEXAMPLE-ac7f-466c-a608-4ac8dEXAMPLE" }

CloudTrail 日志文件中 AWS STS 角色链接 API 事件示例

以下示例演示账户 111111111111 中 John Doe 发出的请求的 CloudTrail 日志条目。John 之前使用自己的 JohnDoe 用户代入 JohnRole1 角色。对于此请求,他使用来自该角色的凭证代入 JohnRole2 角色。这称为角色链。当他担任 JohnDoe1 角色时设置的源身份将在担任 JohnRole2 的请求中继续存在。如果 John 尝试在担任角色时设置不同的源身份,请求将被拒绝。John 将两个会话标签传递到请求中。他将这两个标签设置为可传递。请求继承 Department 标签作为可传递标签,因为 John 在代入 JohnRole1 时将其设置为可传递。更多有关源身份的信息,请参阅 监控和控制使用所担任角色执行的操作。有关角色链中可传递键的更多信息,请参阅使用会话标签链接角色

{ "eventVersion": "1.05", "userIdentity": { "type": "AssumedRole", "principalId": "AROAIN5ATK5U7KEXAMPLE:JohnRole1", "arn": "arn:aws:sts::111111111111:assumed-role/JohnDoe/JohnRole1", "accountId": "111111111111", "accessKeyId": "ASIAIOSFODNN7EXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2019-10-02T21:50:54Z" }, "sessionIssuer": { "type": "Role", "principalId": "AROAIN5ATK5U7KEXAMPLE", "arn": "arn:aws:iam::111111111111:role/JohnRole1", "accountId": "111111111111", "userName": "JohnDoe" }, "sourceIdentity": "JohnDoe" } }, "eventTime": "2019-10-02T22:12:29Z", "eventSource": "sts.amazonaws.com", "eventName": "AssumeRole", "awsRegion": "us-east-2", "sourceIPAddress": "123.145.67.89", "userAgent": "aws-cli/1.16.248 Python/3.4.7 Linux/4.9.184-0.1.ac.235.83.329.metal1.x86_64 botocore/1.12.239", "requestParameters": { "incomingTransitiveTags": { "Department": "Engineering" }, "tags": [ { "value": "johndoe@example.com", "key": "Email" }, { "value": "12345", "key": "CostCenter" } ], "roleArn": "arn:aws:iam::111111111111:role/JohnRole2", "roleSessionName": "Role2WithTags", "sourceIdentity": "JohnDoe", "transitiveTagKeys": [ "Email", "CostCenter" ], "durationSeconds": 3600 }, "responseElements": { "credentials": { "accessKeyId": "ASIAI44QH8DHBEXAMPLE", "expiration": "Oct 2, 2019, 11:12:29 PM", "sessionToken": "AgoJb3JpZ2luX2VjEB4aCXVzLXdlc3QtMSJHMEXAMPLETOKEN+//rJb8Lo30mFc5MlhFCEbubZvEj0wHB/mDMwIgSEe9gk/Zjr09tZV7F1HDTMhmEXAMPLETOKEN/iEJ/rkqngII9///////////ARABGgw0MjgzMDc4NjM5NjYiDLZjZFKwP4qxQG5sFCryASO4UPz5qE97wPPH1eLMvs7CgSDBSWfonmRTCfokm2FN1+hWUdQQH6adjbbrVLFL8c3jSsBhQ383AvxpwK5YRuDE1AI/+C+WKFZb701eiv9J5La2EXAMPLETOKEN/c7S5Iro1WUJ0q3Cxuo/8HUoSxVhQHM7zF7mWWLhXLEQ52ivL+F6q5dpXu4aTFedpMfnJa8JtkWwG9x1Axj0Ypy2ok8v5unpQGWych1vwdvj6ez1Dm8Xg1+qIzXILiEXAMPLETOKEN/vQGqu8H+nxp3kabcrtOvTFTvxX6vsc8OGwUfHhzAfYGEXAMPLETOKEN/L6v1yMM3B1OwFOrQBno1HEjf1oNI8RnQiMNFdUOtwYj7HUZIOCZmjfN8PPHq77N7GJl9lzvIZKQA0Owcjg+mc78zHCj8y0siY8C96paEXAMPLETOKEN/E3cpksxWdgs91HRzJWScjN2+r2LTGjYhyPqcmFzzo2mCE7mBNEXAMPLETOKEN/oJy+2o83YNW5tOiDmczgDzJZ4UKR84yGYOMfSnF4XcEJrDgAJ3OJFwmTcTQICAlSwLEXAMPLETOKEN" }, "assumedRoleUser": { "assumedRoleId": "AROAIFR7WHDTSOYQYHFUE:Role2WithTags", "arn": "arn:aws:sts::111111111111:assumed-role/test-role/Role2WithTags" }, "sourceIdentity": "JohnDoe" }, "requestID": "b96b0e4e-e561-11e9-8b3f-7b396EXAMPLE", "eventID": "1917948f-3042-46ec-98e2-62865EXAMPLE", "resources": [ { "ARN": "arn:aws:iam::111111111111:role/JohnRole2", "accountId": "111111111111", "type": "AWS::IAM::Role" } ], "eventType": "AwsApiCall", "recipientAccountId": "111111111111" }

CloudTrail 日志文件中 AWS 服务 AWS STS API 事件的示例

以下示例显示由 AWS 服务使用服务角色中的权限调用其他服务 API 发出的请求的 CloudTrail 日志条目。它显示了在 777788889999 账户中发出的请求的 CloudTrail 日志条目。

{ "eventVersion": "1.04", "userIdentity": { "type": "AssumedRole", "principalId": "AROAQRSTUVWXYZEXAMPLE:devdsk", "arn": "arn:aws:sts::777788889999:assumed-role/AssumeNothing/devdsk", "accountId": "777788889999", "accessKeyId": "ASIAI44QH8DHBEXAMPLE", "sessionContext": { "attributes": { "mfaAuthenticated": "false", "creationDate": "2016-11-14T17:25:26Z" }, "sessionIssuer": { "type": "Role", "principalId": "AROAQRSTUVWXYZEXAMPLE", "arn": "arn:aws:iam::777788889999:role/AssumeNothing", "accountId": "777788889999", "userName": "AssumeNothing" } } }, "eventTime": "2016-11-14T17:25:45Z", "eventSource": "s3.amazonaws.com", "eventName": "DeleteBucket", "awsRegion": "us-east-2", "sourceIPAddress": "192.0.2.1", "userAgent": "[aws-cli/1.11.10 Python/2.7.8 Linux/3.2.45-0.6.wd.865.49.315.metal1.x86_64 botocore/1.4.67]", "requestParameters": { "bucketName": "amzn-s3-demo-bucket" }, "responseElements": null, "requestID": "EXAMPLE463D56D4C", "eventID": "dEXAMPLE-265a-41e0-9352-4401bEXAMPLE", "eventType": "AwsApiCall", "recipientAccountId": "777788889999" }

CloudTrail 日志文件中 SAML AWS STS API 事件的示例

以下示例说明了为进行 AWS STS AssumeRoleWithSAML 操作而发出的请求的 CloudTrail 日志条目。请求包括 SAML 属性 CostCenterProject,这些属性作为会话标签通过 SAML 断言传递。这些标签被设置为可传递标签,因此在角色链场景中持续存在。该请求包含可选的 API 参数 DurationSeconds,在 CloudTrail 日志中表示为 durationSeconds,并设置为 1800 秒。该请求还包含在 SAML 断言中传递的 SAML 属性 sourceIdentity。如果某人使用生成的角色会话凭证担任另一个角色,则此源身份将仍然存在。

{ "eventVersion": "1.08", "userIdentity": { "type": "SAMLUser", "principalId": "SampleUkh1i4+ExamplexL/jEvs=:SamlExample", "userName": "SamlExample", "identityProvider": "bdGOnTesti4+ExamplexL/jEvs=" }, "eventTime": "2023-08-28T18:30:58Z", "eventSource": "sts.amazonaws.com", "eventName": "AssumeRoleWithSAML", "awsRegion": "us-east-2", "sourceIPAddress": "AWS Internal", "userAgent": "aws-internal/3 aws-sdk-java/1.12.479 Linux/5.10.186-157.751.amzn2int.x86_64 OpenJDK_64-Bit_Server_VM/17.0.7+11 java/17.0.7 kotlin/1.3.72 vendor/Amazon.com_Inc. cfg/retry-mode/standard", "requestParameters": { "sAMLAssertionID": "_c0046cEXAMPLEb9d4b8eEXAMPLE2619aEXAMPLE", "roleSessionName": "MyAssignedRoleSessionName", "sourceIdentity": "MySAMLUser", "principalTags": { "CostCenter": "987654", "Project": "Unicorn", "Department": "Engineering" }, "transitiveTagKeys": [ "CostCenter", "Project" ], "roleArn": "arn:aws:iam::444455556666:role/SAMLTestRoleShibboleth", "principalArn": "arn:aws:iam::444455556666:saml-provider/Shibboleth", "durationSeconds": 1800 }, "responseElements": { "credentials": { "accessKeyId": "ASIAIOSFODNN7EXAMPLE", "sessionToken": "<encoded session token blob>", "expiration": "Aug 28, 2023, 7:00:58 PM" }, "assumedRoleUser": { "assumedRoleId": "AROAD35QRSTUVWEXAMPLE:MyAssignedRoleSessionName", "arn": "arn:aws:sts::444455556666:assumed-role/SAMLTestRoleShibboleth/MyAssignedRoleSessionName" }, "packedPolicySize": 1, "subject": "SamlExample", "subjectType": "transient", "issuer": "https://server.example.com/idp/shibboleth", "audience": "https://signin.aws.amazon.com/saml", "nameQualifier": "bdGOnTesti4+ExamplexL/jEvs=", "sourceIdentity": "MySAMLUser" }, "requestID": "6EXAMPLE-e595-11e5-b2c7-c974fEXAMPLE", "eventID": "dEXAMPLE-265a-41e0-9352-4401bEXAMPLE", "readOnly": true, "resources": [ { "accountId": "444455556666", "type": "AWS::IAM::Role", "ARN": "arn:aws:iam::444455556666:role/SAMLTestRoleShibboleth" }, { "accountId": "444455556666", "type": "AWS::IAM::SAMLProvider", "ARN": "arn:aws:iam::444455556666:saml-provider/test-saml-provider" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "444455556666", "eventCategory": "Management", "tlsDetails": { "tlsVersion": "TLSv1.2", "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256", "clientProvidedHostHeader": "sts.us-east-2.amazonaws.com" } }

CloudTrail 日志文件中 OIDC AWS STS API 事件示例

以下示例说明了为进行 AWS STS AssumeRoleWithWebIdentity 操作而发出的请求的 CloudTrail 日志条目。请求包括属性 CostCenterProject,这些属性作为会话标签通过 OpenID Connect(OIDC)身份提供商(IdP)令牌传递。这些标签被设置为可传递标签,因此在角色链中持续存在。请求包含身份提供程序令牌中的 sourceIdentity 属性。如果某人使用生成的角色会话凭证担任另一个角色,则此源身份将仍然存在。

CloudTrail 日志条目还包含一个带有 identityProviderConnectionVerificationMethod 属性的 additionalEventData 字段。此属性表示 AWS 用于验证与 OIDC 提供商的连接的方法。属性值将为 IAMTrustStoreThumbprintIAMTrustStore 值表示 AWS 使用我们的可信根凭证颁发机构(CA)库成功验证了与 OIDC IdP 的连接。Thumbprint 值表示 AWS 使用在 IdP 配置中设置的证书指纹来验证 OIDC IdP 服务器证书。

{ "eventVersion": "1.08", "userIdentity": { "type": "WebIdentityUser", "principalId": "arn:aws:iam::444455556666:oidc-provider/<issuer url of OIDC provider>:<id of application>:<id of user>", "userName": "<id of user>", "identityProvider": "arn:aws:iam::444455556666:oidc-provider/<issuer url of OIDC provider>" }, "eventTime": "2024-07-09T15:41:37Z", "eventSource": "sts.amazonaws.com", "eventName": "AssumeRoleWithWebIdentity", "awsRegion": "us-east-2", "sourceIPAddress": "192.0.2.101", "userAgent": "aws-cli/2.13.29 Python/3.11.6 Windows/10 exe/AMD64 prompt/off command/sts.assume-role-with-web-identity", "requestParameters": { "roleArn": "arn:aws:iam::444455556666:role/FederatedWebIdentityRole", "roleSessionName": "<assigned role session name>", "sourceIdentity": "MyWebIdentityUser", "durationSeconds": 3600, "principalTags": { "CostCenter": "24680", "Project": "Pegasus" }, "transitiveTagKeys": [ "CostCenter", "Project" ] }, "responseElements": { "credentials": { "accessKeyId": "ASIAIOSFODNN7EXAMPLE", "sessionToken": "<encoded session token blob>", "expiration": "Jul 9, 2024, 4:41:37 PM" }, "subjectFromWebIdentityToken": "<id of user>", "sourceIdentity": "MyWebIdentityUser", "assumedRoleUser": { "assumedRoleId": "AROA123456789EXAMPLE:<assigned role session name>", "arn": "arn:aws:sts::444455556666:assumed-role/FederatedWebIdentityRole/<assigned role session name>" }, "provider": "arn:aws:iam::444455556666:oidc-provider/<issuer url of OIDC provider>", "audience": "<id of application>" }, "additionalEventData": { "identityProviderConnectionVerificationMethod": "IAMTrustStore" }, "requestID": "aEXAMPLE-0b26-40df-8973-c7012EXAMPLE", "eventID": "aEXAMPLE-ee29-4ac0-a0ed-3f5c5EXAMPLE", "readOnly": true, "resources": [ { "accountId": "444455556666", "type": "AWS::IAM::Role", "ARN": "arn:aws:iam::444455556666:role/FederatedWebIdentityRole" } ], "eventType": "AwsApiCall", "managementEvent": true, "recipientAccountId": "444455556666", "eventCategory": "Management", "tlsDetails": { "tlsVersion": "TLSv1.3", "cipherSuite": "TLS_AES_128_GCM_SHA256", "clientProvidedHostHeader": "sts.us-east-2.amazonaws.com" } }

CloudTrail 日志中的登录事件示例

CloudTrail 日志文件包含的事件采用 JSON 格式。登录事件表示单个登录请求,并包括有关登录主体、区域以及操作的日期和事件的信息。

CloudTrail 日志文件中的登录成功事件示例

以下示例显示了一个成功的登录事件的 CloudTrail 日志条目。

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AIDACKCEVSQ6C2EXAMPLE", "arn":"arn:aws:iam::111122223333:user/JohnDoe", "accountId": "111122223333", "userName": "JohnDoe" }, "eventTime": "2014-07-16T15:49:27Z", "eventSource": "signin.amazonaws.com", "eventName": "ConsoleLogin", "awsRegion": "us-east-2", "sourceIPAddress": "192.0.2.110", "userAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0", "requestParameters": null, "responseElements": { "ConsoleLogin": "Success" }, "additionalEventData": { "MobileVersion": "No", "LoginTo": "https://console.aws.amazon.com/s3/", "MFAUsed": "No" }, "eventID": "3fcfb182-98f8-4744-bd45-10a395ab61cb" }

有关 CloudTrail 日志文件中所包含信息的更多详细信息,请参阅 AWS CloudTrail 用户指南中的 CloudTrail 事件参考

CloudTrail 日志文件中的登录失败事件示例

以下示例显示了一个失败的登录事件的 CloudTrail 日志条目。

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "principalId": "AIDACKCEVSQ6C2EXAMPLE", "arn":"arn:aws:iam::111122223333:user/JaneDoe", "accountId": "111122223333", "userName": "JaneDoe" }, "eventTime": "2014-07-08T17:35:27Z", "eventSource": "signin.amazonaws.com", "eventName": "ConsoleLogin", "awsRegion": "us-east-2", "sourceIPAddress": "192.0.2.100", "userAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0", "errorMessage": "Failed authentication", "requestParameters": null, "responseElements": { "ConsoleLogin": "Failure" }, "additionalEventData": { "MobileVersion": "No", "LoginTo": "https://console.aws.amazon.com/sns", "MFAUsed": "No" }, "eventID": "11ea990b-4678-4bcd-8fbe-62509088b7cf" }

从此信息,您可以确定此次登录尝试源自名为 JaneDoe 的 IAM 用户,如 userIdentity 元素中所示。您还可以发现此次登录尝试失败,如 responseElements 元素中所示。可以看出 JaneDoe 是在 2014 年 7 月 8 日下午 5:35 (UTC) 尝试登录 Amazon SNS 控制台的。

用户名称不正确导致的登录失败事件示例

以下示例显示了一个失败登录事件的 CloudTrail 日志条目,该事件是由于用户输入错误用户名导致的。AWS 用 HIDDEN_DUE_TO_SECURITY_REASONS 代替了 userName 文本以帮助防止泄露可能的敏感信息。

{ "eventVersion": "1.05", "userIdentity": { "type": "IAMUser", "accountId": "123456789012", "accessKeyId": "", "userName": "HIDDEN_DUE_TO_SECURITY_REASONS" }, "eventTime": "2015-03-31T22:20:42Z", "eventSource": "signin.amazonaws.com", "eventName": "ConsoleLogin", "awsRegion": "us-east-2", "sourceIPAddress": "192.0.2.101", "userAgent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0", "errorMessage": "No username found in supplied account", "requestParameters": null, "responseElements": { "ConsoleLogin": "Failure" }, "additionalEventData": { "LoginTo": "https://console.aws.amazon.com/console/home?state=hashArgs%23&isauthcode=true", "MobileVersion": "No", "MFAUsed": "No" }, "eventID": "a7654656-0417-45c6-9386-ea8231385051", "eventType": "AwsConsoleSignin", "recipientAccountId": "123456789012" }

IAM 角色信任策略行为

2022 年 9 月 21 日,AWS 对 IAM 角色信任策略行为进行了更改,要求角色代入自己时在角色信任策略中显式允许。对于 AssumeRole 事件,旧行为允许列表中的 IAM 角色会有一个有关 explicitTrustGrant 的 additionalEventData 字段。当旧允许列表中的角色使用旧行为代入自己时,explicitTrustGrant 的值为 false。当旧允许列表中的角色代入自己,但角色信任策略行为已更新为显式允许该角色代入自己时,explicitTrustGrant 的值为 true。

只有极少数的 IAM 角色出现在旧行为的允许列表中,并且只有当这些角色代入自己时,此字段才会出现在其 CloudTrail 日志中。在大多数情况下,IAM 角色并不需要代入自己。AWS 建议通过更新进程、代码或配置来消除此行为,或者更新角色信任策略以显式允许这种行为。有关更多信息,请参阅 Announcing an update to IAM role trust policy behavior