如何使用 IAM 角色中的 PassRole 权限 安全博客
如何使用 IAM 角色的 PassRole 权限
关键要点
在这篇文章中,我们将详细介绍 AWS 的 iamPassRole 权限,该权限允许 IAM 主体通过配置资源将权限传递给 AWS 服务。了解其工作原理、使用要求以及一些最佳实践将帮助您更有效地管理 AWS 环境中的角色和权限。
iamPassRole 是 AWS 身份和访问管理IAM权限之一,允许 IAM 主体将权限委托或传递给 AWS 服务。通过配置例如 Amazon Elastic Compute Cloud (Amazon EC2) 实例或 AWS Lambda 函数等资源后,该服务可以使用这些角色与您账户中的其他 AWS 资源进行互动。
在这篇博文中,我们将深入探讨 iamPassRole,解释其工作原理和使用要求,并介绍一些有效使用的最佳实践。
理解 IAM PassRole
当我们说 iamPassRole 是一种权限时,我们具体指的是它并不是一个 API 调用;而是一种可以在 IAM 策略中指定的 IAM 操作。每当使用 IAM 服务角色创建或更新资源时,都会检查 iamPassRole 权限。
以下是一个示例 IAM 策略,允许主体验证传递名为 lambdarole 的角色:
json{ Version 20121017 Statement [ { Effect Allow Action iamPassRole Resource [ arnawsiam111122223333role/lambdarole ] } ]}
可以在 IAM 策略的 Resource 元素中指定可以传递的角色。可以列出多个 IAM 角色,并且可以使用通配符 () 来匹配以您指定的模式开头的角色。仅在匹配角色模式时,通配符可作为最后字符使用,以帮助防止过度授权。
注意: 我们建议在大多数情况下避免在 iamPassRole 操作中使用资源“”,因为这可能会允许某人传递任何角色,从而引发意外权限升级的可能性。
使用最佳实践
在本节中,您将学习在 AWS 账户中使用 iamPassRole 时应采用的策略。
将 iamPassRole 放在单独的策略语句中如前所示,iamPassRole 策略动作需要资源的 IAM 角色。如果您在授予 iamPassRole 权限的策略中指定通配符作为资源,这意味着应用此策略的主体将能够传递该账户中的任何角色,从而可能使他们获得超出您预期的权限。
为了能够指定资源值并在与可能在同一策略中授予的其他权限相比较时更具 granularity,建议将 iamPassRole 操作放在自己的策略语句中:
json{ Version 20121017 Statement [ { Effect Allow Action iamPassRole Resource [ arnawsiam111122223333role/lambdarole ] } { Effect Allow Action cloudwatchGetMetricData Resource [ ] } ]}
使用 IAM 路径或命名约定组织 IAM 角色您可以使用 IAM 路径 或命名约定授予主体使用通配符传递 IAM 角色的权限。这减少了每当创建新角色时更新 IAM 策略的需要。
在您的 AWS 账户中,您可能有用于不同目的的 IAM 角色,例如应用程序角色和安全团队角色。在大多数情况下,您不会希望开发者将安全团队的角色关联到他们正在创建的资源,但仍希望允许他们创建和传递业务应用程序角色。
您可以通过验证这些角色是否附加了 权限边界 并且它们是在特定的 IAM 角色路径中创建的,来使开发者能够创建他们应用程序的角色。这样,您就可以只允许开发者传递该路径中的角色。有关使用权限边界的更多信息,请参阅我们的 示例权限边界 GitHub 库。
下面的示例策略授予只能传递位于 /applicationrole/ 路径中的角色的权限:
json{ Version 20121017 Statement [ { Effect Allow Action iamPassRole Resource [ arnawsiam111122223333role/applicationrole/ ] } ]}
保护特定 IAM 路径您还可以通过使用 SCP 来保护特定的 IAM 路径。
在以下示例中,SCP 阻止您的主体传递角色,除非在尝试传递的角色在 IAM 路径 /securityapproles/ 中时,其标签“team”的值为“security”:
json{ Version 20121017 Statement [ { Effect Deny Action iamPassRole Resource arnawsiamrole/securityapproles/ Condition { StringNotEquals { awsPrincipalTag/team security } } } ]}
同样,您可以创建一个策略,仅允许通过特定命名约定或 IAM 路径传递某个角色。例如,以下 SCP 显示如何防止在 IAM 路径 securityapproles 中的角色被不是该路径下的 securityresponseteam 的角色传递:
json{ Version 20121017 Statement [ { Effect Deny Action iamPassRole Resource arnawsiamrole/securityapproles/ Condition { ArnNotLike { awsPrincipalARN arnawsiamrole/securityresponseteam/ } } } ]}
与 iamPassRole 一起使用变量和标签iamPassRole 不支持使用 iamResourceTag 或 awsResourceTag 条件键来指定可以传递哪些角色。然而,IAM 策略语言支持在 IAM 策略的资源元素中使用变量。
以下 IAM 策略示例在资源元素中使用 awsPrincipalTag 条件键作为变量。这使得该策略能够根据调用者的 IAM 标签或会话标签的值构建 IAM 路径:
json{ Version 20121017 Statement [ { Effect Allow Action iamPassRole Resource [ arnawsiam111122223333role/{awsPrincipalTag/AllowedRolePath}/ ] } ]}
如果 AllowedRolePath 标签没有值,则资源将不匹配任何角色 ARN,因此不会授予任何 iamPassRole 权限。
传递不同的 IAM 角色以满足不同用例作为最佳实践,对于每个用例,使用单个 IAM 角色,并避免出现多个 AWS 服务共享同一角色的情况。
我们建议在 AWS 账户中为不同的工作负载使用不同的 IAM 角色,即便这些工作负载是基于同一 AWS 服务构建的。这将允许您仅授予工作负载所需的权限,从而使您能够遵循最小权限原则。
使用 iamPassRole 条件关键词
iamPassRole 操作有两个可用的条件键:iamPassedToService 和 iamAssociatedResourceArn。
iamPassedToService 允许您指定可以传递角色的服务,而 iamAssociatedResourceArn 允许您指定可以与该角色关联的资源 ARN。
如前所述,我们通常建议客户使用仅属于一个 AWS 服务的 IAM 角色。这最好的实现方式是将单一 AWS 服务列入角色的信任政策,减少在调用主体的身份基础策略中使用 iamPassedToService 条件键的需求。在拥有可以由多个 AWS 服务假设的 IAM 角色的情况下,您可以使用 iamPassedToService 指定该角色可以传递到哪个服务。例如,以下策略仅允许将 ExampleRole 传递给 Amazon EC2 服务:
json{ Version 20121017 Statement [ { Effect Allow Action iamPassRole Resource arnawsiamrole/ExampleRole Condition { StringEquals { iamPassedToService ec2amazonawscom } } } ]}
使用 iamAssociatedResourceArn 时,重要的是要理解 ARN 格式通常没有变化,但每个 AWS 资源会有唯一的 ARN。一些 AWS 资源在其 ARN 中有不可预测的组件,例如 EC2 实例 ID。这意味着在使用 iamAssociatedResourceArn 时,如果 AWS 资源被删除并创建了新资源,您可能需要修改 IAM 策略并更新资源 ARN,以允许角色与新资源关联。
大多数组织更喜欢限制谁可以删除和修改其 AWS 账户中的资源,而不是限制角色可以与之关联的资源。例如,有效限制某些主体修改 Lambda 函数,而不是限制角色可以关联哪个函数,因为为了将角色传递给 Lambda,主体需要具备更新函数本身的权限。
使用 iamPassRole 和服务链接角色
如果您处理的是使用 服务链接角色 (SLRs) 的服务,通常情况下您不需要 iamPassRole 权限。这是因为在大多数情况下,这些服务会在您身边创建和管理 SLR,因此您不需要在服务配置中传递角色,因此不会执行 iamPassRole 权限检查。
一些 AWS 服务允许您创建多个 SLR,并在使用这些服务创建或修改资源时传递它们。在这种情况下,您需要对服务链接角色具有 iamPassRole 权限,正如您对服务角色所需要的那样。
一元机场地址例如,Amazon EC2 Auto Scaling 允许您创建带有特定后缀的多个 SLR,并在请求中通过 ec2CreateAutoScalingGroup API 动作传递角色 ARN。为了成功创建 Auto Scaling 组,您需要执行 ec2CreateAutoScalingGroup 和 iamPassRole 操作的权限。
SLRs 位于 /awsservicerole/ 路径下。为了帮助确认账户中的主体仅传递他们可以传递的服务链接角色,我们建议使用后缀和 IAM 策略对不同团队拥有的 SLR 进行分隔。
例如,以下策略仅允许带有 BlueTeamSuffix 后缀的 SLR 被传递:
json{ Version 20121017 Statement [ { Effect Allow Action iamPassRole Resource [ arnawsiamrole/awsservicerole/BlueTeamSuffix ] } ]}
您可以将该策略附加到蓝队使用的角色上,以允许他们传递为其用例创建的带有特定后缀的 SLR。

AWS CloudTrail 记录
由于 iamPassRole 不是 API 调用,因此在 AWS CloudTrail 中没有相应的条目。要识别传递给 AWS 服务的角色,您必须检查 CloudTrail 路线中与创建或修改相关 AWS 服务资源的事件。
在下图中,您可以看到开发者使用 Lambda CreateFunction API 调用的 CloudTrail 日志,其中记录的角色 ARN 在角色字段中标明。
PassRole 和 VPC 端点
之前提到过,iamPassRole 受 VPC 端点策略的约束。如果通过配置了自定义 VPC 端点策略的 VPC 端点发出需要 iamPassRole 权限的请求,则必须在该 VPC 端点策略的 Action 元素中允许 iamPassRole,否则请求将被拒绝。
结论
在本文中,您了解了 iamPassRole 的概念,它是如何用于与 AWS 服务和资源进行交互的,以及成功将角色传递给服务的三个先决条件。您现在也知道在 AWS 账户中使用 iamPassRole 的最佳实践。要获取更多信息,请查看有关 为用户授予传递角色到 AWS 服务的权限 的文档。
如果您对本文有反馈,请在下方评论部分提交。对于本文中的问题,请在 AWS 安全、身份和合规性 rePost 中开启新的讨论,或 联系 AWS 支持。
想获取更多 AWS 安全新闻?请在 Twitter 上关注我们。
作者简介
Laura Reith
Laura是 AWS 的身份解决方案架构师,乐于帮助客户解决安全和身份方面的挑战。
Liam Wadman
Liam 是身份解决方案团队的解决方案架构师。当他没有在 AWS 上构建令人兴奋的解决方案或帮助客户时,他通常会在不列颠哥伦比亚省的山上骑自行车。他指出,“LIAM”这个词没有“IAM”是拼不出来的。
标签: AWS IAM, AWS 身份和访问管理 (IAM), IAM 角色, 权限升级, 角色, 安全博客