监控和控制使用代入的角色执行的操作 - Amazon Identity and Access Management
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

监控和控制使用代入的角色执行的操作

IAM 角色是体了权限 的 IAM 中的对象。当您使用 IAM 身份或 Amazon 外部的身份代入该角色时,您将收到拥有分配给该角色的权限的会话。

当您在 Amazon 中执行操作时,可以将有关会话的信息记录到 Amazon CloudTrail 以供账户管理员监控。管理员可以将角色配置为要求身份传递自定义字符串,通过该字符串标识在中执行操作的人员或应用程序 Amazon。此身份信息作为源身份存储在 Amazon CloudTrail 中。当管理员审核 CloudTrail 中的活动时,他们可以查看源身份信息,以确定由谁或什么使用代入角色会话执行操作。

设置源身份后,该身份将出现在角色会话期间执行的任何 Amazon 操作的请求中。当角色用于通过 Amazon CLI 或 Amazon API 代入另一个角色(称为角色链)时,设置的值将持续存在。设置的值在角色会话期间无法更改。管理员可以根据源身份的存在情况或值配置精细权限,以进一步控制对共享角色执行的 Amazon 操作。您可以决定是否可使用源身份属性、是否必需以及可以使用什么值。

您使用源身份的方式与角色会话名称和会话标记存在很显著的不同。源身份值在设置后无法更改,并且在使用角色会话执行的任何其他操作中,该值将持续存在。下面介绍了如何使用会话标签和角色会话名称:

  • 会话标签 –您可以在代入角色或联合身份用户时传递会话标签。代入角色时会显示会话标签。您可以定义策略,这些策略使用标签条件键来根据委托人的标签向其授予权限。然后,您可以使用 CloudTrail 查看为代入角色或联合身份用户而发出的请求。要了解有关会话标签的更多信息,请参阅在 Amazon STS 中传递会话标签

  • 角色会话名称 –您可以在角色信任策略中使用 sts:RoleSessionName 条件键,以要求您的用户在代入角色时提供特定的会话名称。当角色由不同委托人使用时,角色会话名称可用于区分角色会话。要了解有关角色会话名称的更多信息,请参阅 sts:RoleSessionName

我们建议您在要控制代入角色的身份时使用源身份。源身份也可用于挖掘 CloudTrail 日志,以确定谁使用该角色执行操作。

设置为使用源身份

设置为使用源身份的方式取决于代入角色时使用的方法。例如,您的 IAM 用户可能直接使用 AssumeRole 操作代入角色。如果您有企业身份(也称为员工身份),他们可能会使用 AssumeRoleWithSAML 访问您的 Amazon 资源。如果最终用户访问您的移动应用程序或 Web 应用程序,则他们可能会使用 AssumeRoleWithWebIdentity。下面是一个高级工作流概述,可帮助您了解如何进行设置以在现有环境中利用源身份信息。

  1. 配置测试用户和角色 – 使用预生产环境,配置测试用户和角色,并配置其策略以允许设置源身份。

    如果您对联合身份使用身份提供商 (IdP),请将 IdP 配置为在断言或令牌中传递您选择的源身份的用户属性。

  2. 代入角色 – 测试代入角色并传递拥有您为测试设置的用户和角色的源身份。

  3. 审核 CloudTrail – 审核 CloudTrail 日志中测试角色的源身份信息。

  4. 培训用户 – 在预生产环境中进行测试后,确保用户知道如何在必要时传递源身份信息。设置要求用户在生产环境中提供源身份的最后期限。

  5. 配置生产策略 – 为生产环境配置策略,然后将它们添加到生产用户和角色。

  6. 监控活动 – 使用 CloudTrail 日志监控生产角色活动。

关于源身份的需知信息

使用源身份时请记住以下事项。

  • 连接到身份提供商 (IdP) 的所有角色的信任策略都必须拥有 sts:SetSourceIdentity 权限。对于角色信任策略中没有此权限的角色,AssumeRole* 操作将失败。如果您不想更新每个角色的角色信任策略,则可以使用单独的 IdP 实例传递源身份。然后仅将 sts:SetSourceIdentity 权限添加到连接至单独 IdP 的角色。

  • 当一个身份设置源身份时,该 sts:SourceIdentity 键将出现在请求中。对于在角色会话期间执行的后续操作,请求中存在 aws:SourceIdentity 键。Amazon不能控制 sts:SourceIdentityaws:SourceIdentity 键中的源身份的值。如果您选择要求源身份,则必须选择您希望用户或 IdP 提供的属性。出于安全考虑,您必须确保可以控制提供这些值的方式。

  • 源身份的值的长度必须在 2 到 64 个字符之间,只能包含字母数字字符、下划线和以下字符:. , + = @ -(连字符)。您不能使用以文本 aws: 开头的值。此前缀专为 Amazon 内部使用预留。

  • Amazon 服务或服务相关角色代表联合身份或员工身份执行操作时,CloudTrail 不会捕获源身份信息。

重要

您不能切换到 Amazon Web Services Management Console 中要求在代入角色时设置源身份的角色。要代入此类角色,您可以使用 Amazon CLI 或 Amazon API 调用 AssumeRole 操作并指定源身份参数。

设置源身份所需的权限

除了与 API 操作匹配的操作之外,您的策略中还必须具有以下仅限授权执行的操作:

sts:SetSourceIdentity
  • 要指定源身份,委托人(IAM 用户和角色)必须拥有 sts:SetSourceIdentity 的权限。作为管理员,您可以在角色信任策略和委托人的权限策略中配置此项。

  • 当您使用另一个角色代入一个角色(称为角色链)时,在担任该角色的委托人的权限策略和目标角色的角色信任策略中都需要 sts:SetSourceIdentity 的权限。否则,代入角色操作将失败。

  • 使用源身份时,连接到 IdP 的所有角色的角色信任策略都必须拥有 sts:SetSourceIdentity 权限。对于连接到 IdP 而没有此权限的任何角色,AssumeRole* 操作将失败。如果您不想更新每个角色的角色信任策略,则可以使用单独的 IdP 实例传递源身份,然后仅将 sts:SetSourceIdentity 权限添加到连接到单独 IdP 的角色。

  • 要跨账户边界设置源身份,必须在两个位置包含 sts:SetSourceIdentity 权限。它必须位于源账户内委托人的权限策略中以及目标账户内角色的角色信任策略中。例如,当使用角色通过角色链代入另一个账户中的角色时,您可能需要执行此操作。

作为账户管理员,假定您希望允许账户中的 IAM 用户 DevUser 代入同一账户中的 Developer_Role。但是,只有在用户已将源身份设置为其 IAM 用户名时,您才希望允许此操作。您可以将以下策略附加到 IAM 用户。

例 附加到 DevUser 的基于身份的策略示例

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AssumeRole", "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "arn:aws:iam::123456789012:role/Developer_Role" }, { "Sid": "Set_AWSUserName_as_SourceIdentity", "Effect": "Allow", "Action": "sts:SetSourceIdentity", "Resource": "arn:aws:iam::123456789012:role/Developer_Role", "Condition": { "StringLike": {"sts:SourceIdentity": "${aws:username}"} } } ] }

要强制使用可接受的源身份值,可以配置以下角色信任策略。该策略授予 IAM 用户 DevUser 权限以代入角色和设置源身份。sts:SourceIdentity 条件键定义了可接受的源身份值。

例 源身份的角色信任策略示例

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowDevUserAssumeRole", "Effect": "Allow", "Principal": {"AWS": " arn:aws:iam::123456789012:user/DevUser"}, "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Condition": { "StringEquals": {"sts:SourceIdentity": "DevUser"} } } ] }

使用 IAM 用户的凭证 DevUser,用户尝试使用以下 Amazon CLI 请求代入 DeveloperRole

例 示例 AssumeRole CLI 请求

aws sts assume-role \ --role-arn arn:aws:iam::123456789012:role/Developer_Role \ --role-session-name Dev-project \ --source-identity DevUser \

当 Amazon 评估请求时,请求上下文包含 DevUsersts:SourceIdentity

代入角色时指定源身份

使用 Amazon STS AssumeRole* API 操作之一获取角色的临时安全凭证时,您可以指定源身份。根据您的使用案例,您使用的 API 操作会有所不同。例如,如果您使用 IAM 角色向 IAM 用户授予对他们通常无权访问的 Amazon 资源的访问权限,则可以使用 AssumeRole 操作。如果您使用企业联合身份来管理员工用户,则可以使用该 AssumeRoleWithSAML 操作。如果使用 Web 联合身份来允许最终用户访问移动应用程序或 Web 应用程序,则可以使用该 AssumeRoleWithWebIdentity 操作。以下各节介绍了如何在每个操作中使用源身份。要详细了解临时凭证的常见场景,请参阅 临时凭证的常见情形

将源身份与 AssumeRole 一起使用

AssumeRole 操作返回一组可用于访问 Amazon 资源的临时凭证。您可以使用 IAM 用户或角色凭证来调用 AssumeRole。要在代入角色时传递源身份,请使用 -–source-identity Amazon CLI 选项或 SourceIdentity Amazon API 参数。以下示例说明如何使用 Amazon CLI 指定源身份。

例 示例 AssumeRole CLI 请求

aws sts assume-role \ --role-arn arn:aws:iam::123456789012:role/developer \ --role-session-name Audit \ --source-identity Admin \

将源身份与 AssumeRoleWithSAML 一起使用

调用 AssumeRoleWithSAML 操作的委托人使用基于 SAML 的联合身份进行身份验证。此操作返回一组可用于访问 Amazon 资源的临时凭证。有关将基于 SAML 的联合身份用于 Amazon Web Services Management Console访问的更多信息,请参阅使 SAML 2.0 联合身份用户能够访问 Amazon Web Services Management Console。有关 Amazon CLI 或 Amazon API 访问的详细信息,请参阅关于基于 SAML 2.0 的联合身份验证。有关为 Active Directory 用户设置 SAML 联合身份的教程,请参阅 Amazon 安全博客中的使用 Active Directory 联合身份验证服务 (ADFS) 的 Amazon 联合身份验证

作为管理员,您可以使用 Amazon STS AssumeRoleWithSAML 操作,允许公司目录的成员联合身份到 Amazon 中。要执行此操作,您必须完成以下任务:

要为源身份设置 SAML 属性,请包含 Attribute 元素并将 Name 属性设置为 https://aws.amazon.com/SAML/Attributes/SourceIdentity。使用 AttributeValue 元素指定源身份的值。例如,假设您要将以下身份属性作为源身份传递。

SourceIdentity:DiegoRamirez

要传递此属性,请在 SAML 断言中包含以下元素。

例 SAML 断言的示例片段

<Attribute Name="http://www.amazonaws.cn/SAML/Attributes/SourceIdentity"> <AttributeValue>DiegoRamirez</AttributeValue> </Attribute>

将源身份与 AssumeRoleWithWebIdentity 一起使用

调用 AssumeRoleWithWebIdentity 操作的委托人使用兼容 OpenID Connect (OIDC) 的 Web 联合身份进行身份验证。此操作返回一组可用于访问 Amazon 资源的临时凭证。有关将基于 Web 联合身份用于 Amazon Web Services Management Console访问的更多信息,请参阅关于 Web 联合身份验证

要从 OpenID Connect (OIDC) 传递源身份,必须在 JSON Web 令牌 (JWT) 中包含源身份。当您提交 AssumeRoleWithWebIdentity 请求时,请在令牌的 https://aws.amazon.com/source_identity 命名空间中包含源身份。要了解有关 OIDC 令牌和声明的更多信息,请参阅 Amazon Cognito 开发人员指南 中的 将令牌与用户池结合使用

例如,以下解码的 JWT 是一个令牌,用于通过 Admin 源身份调用 AssumeRoleWithWebIdentity

例 解码的 JSON Web 令牌示例

{ "sub": "johndoe", "aud": "ac_oic_client", "jti": "ZYUCeRMQVtqHypVPWAN3VB", "iss": "https://xyz.com", "iat": 1566583294, "exp": 1566583354, "auth_time": 1566583292, "https://aws.amazon.com/source_identity":"Admin" }

使用来源身份信息控制访问

最初设置源身份时,请求中会出现 sts:SourceIdentity 键。设置源身份后,aws:SourceIdentity 密钥将出现在角色会话期间发出的所有后续请求中。作为管理员,您可以编写授予条件授权的策略,以根据源身份属性的存在或值执行 Amazon 操作。

假定您希望要求开发人员设置源身份,以代入有权写入生产关键 Amazon 资源的关键角色。另外想象一下,您使用 AssumeRoleWithSAML 授予 Amazon 访问员工身份的权限。您只希望高级开发人员 Saanvi 和 Diego 有权访问该角色,因此您可以为该角色创建以下信任策略。

例 源身份的角色信任策略示例

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AssumeRoleAndSetSourceIdentity", "Effect": "Allow", "Principal": { "AWS": " arn:aws:iam::111111111111:role/CriticalRole" }, "Action": [ "sts:AssumeRoleWithSAML", "sts:SetSourceIdentity" ], "Condition": { "StringLike": { "sts:SourceIdentity": ["Saanvi", "Diego"] } } } ] }

信任策略包含 sts:SourceIdentity 的条件,它要求将源身份设置为 Saanvi 或 Diego 才能代入关键角色。

角色链和跨账户要求

假定您希望允许已代入 CriticalRole 的用户代入另一个账户中的 CriticalRole_2。通过所获得的用于代入 CriticalRole 的角色会话凭证,可与不同账户中的第二个角色 CriticalRole_2 形成角色链。该角色正在跨账户边界代入。因此,必须在 CriticalRole 上的权限策略中和 CriticalRole_2 上的角色信任策略中授予 sts:SetSourceIdentity 权限。

例 关于 CriticalRole 的权限策略示例

{ "Version": "2012-10-17", "Statement": [ { "Sid": "AssumeRoleAndSetSourceIdentity", "Effect": "Allow", "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Resource": "arn:aws:iam::222222222222:role/CriticalRole_2" } ] }

为了保护跨账户边界设置源身份时的安全,以下角色信任策略仅信任 CriticalRole 用于设置源身份的角色委托人。

例 CriticalRole_2 上的角色信任策略示例

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": " arn:aws:iam::111111111111:role/CriticalRole" }, "Action": [ "sts:AssumeRole", "sts:SetSourceIdentity" ], "Condition": { "StringLike": { "aws:SourceIdentity": ["Saanvi","Diego"] } } } ] }

用户使用从代入 ClealRole 获得的角色会话凭证进行以下调用。源身份在代入重要角色期间设置,因此无需再次明确设置。如果用户尝试设置与代入 CriticalRole 时设置的值不同的源身份,则代入角色请求将被拒绝。

例 示例 AssumeRole CLI 请求

aws sts assume-role \ --role-arn arn:aws:iam::222222222222:role/CriticalRole_2 \ --role-session-name Audit \

当调用委托人代入角色时,请求中的源身份从第一个代入角色会话开始始终保持不变。因此,aws:SourceIdentitysts:SourceIdentity 键都存在于请求上下文中。

在 CloudTrail 中查看源身份

您可以使用 CloudTrail 查看为代入角色或联合身份用户而发出的请求。您还可以查看要在 Amazon 中执行操作的角色或用户请求。CloudTrail 日志文件包括有关所代入角色或联合身份用户会话的源身份集的信息。有关更多信息,请参阅

例如,假设用户发出 Amazon STS AssumeRole 请求,并设置源身份。您可以在 CloudTrail 日志内的 requestParameters 键中找到 sourceIdentity 信息。

例 Amazon CloudTrail 日志中的 requestParameters 部分示例

"eventVersion": "1.05", "userIdentity": { "type": "AWSAccount", "principalId": "AIDAJ45Q7YFFAREXAMPLE", "accountId": "123456789012" }, "eventTime": "2020-04-02T18:20:53Z", "eventSource": "sts.amazonaws.com", "eventName": "AssumeRole", "awsRegion": "us-east-1", "sourceIPAddress": "203.0.113.64", "userAgent": "aws-cli/1.16.96 Python/3.6.0 Windows/10 botocore/1.12.86", "requestParameters": { "roleArn": "arn:aws:iam::123456789012:role/Assumed_Role", "roleSessionName": "Test1", "sourceIdentity": "source-identity-value-set", },

如果用户使用代入角色会话执行操作,则源身份信息将出现在 CloudTrail 日志内的 userIdentity 密钥中。

例 Amazon CloudTrail 日志中的 userIdentity 键示例

{ "eventVersion": "1.08", "userIdentity": { "type": "AssumedRole", "principalId": "AROAJ45Q7YFFAREXAMPLE: Dev1", "arn": "arn: aws: sts: : 123456789012: assumed-role/DevRole/Dev1", "accountId": "123456789012", "accessKeyId": "ASIAIOSFODNN7EXAMPLE", "sessionContext": { "sessionIssuer": { "type": "Role", "principalId": "AROAJ45Q7YFFAREXAMPLE", "arn": "arn: aws: iam: : 123456789012: role/DevRole", "accountId": "123456789012", "userName": "DevRole" }, "webIdFederationData": {}, "attributes": { "mfaAuthenticated": "false", "creationDate": "2021-02-21T23: 46: 28Z" }, "sourceIdentity": "source-identity-value-present" } } }

要在 CloudTrail 日志中查看示例 Amazon STS API 事件,请参阅 CloudTrail 日志中的 IAM API 事件示例。若要详细了解 CloudTrail 日志文件中包含的信息,请参阅Amazon CloudTrail User Guide中的 CloudTrail 事件参考