究竟啥是 AWS 中的“承担”角色?

Posted

技术标签:

【中文标题】究竟啥是 AWS 中的“承担”角色?【英文标题】:What is exactly "Assume" a role in AWS?究竟什么是 AWS 中的“承担”角色? 【发布时间】:2018-10-09 11:59:01 【问题描述】:

问题

“承担”角色在 AWS 中的确切含义是什么?在哪里提供了明确的定义?

背景

假设角色经常被使用并试图理解定义及其实际含义。

我想当委托人(IAM 用户、在 EC2 实例中运行的应用程序等调用操作以访问 AWS 资源)需要调用操作以访问 AWS 资源时:

    AWS(API?或 AWS 中的一些授权运行时?)标识可以授予委托人的角色。 例如如果指定 EC2 用户执行假设角色 API 调用并运行应用程序来访问附加了 IAM 配置文件的 EC2 实例中的 AWS 资源,则:

    EC2 IAM 配置文件中的所有 IAM 角色 假设角色调用中请求的 IAM 角色和策略 授予 EC2 用户的 IAM 角色

    AWS 从具有允许原则对资源执行操作的策略(操作、资源)的角色中找到一个角色。

    AWS 将原则的角色切换为确定的角色。

当第 3 步发生时,表示“委托人已承担角色”。这是正确的吗?

研究

Using IAM Roles

在 IAM 用户、应用程序或服务可以使用您创建的角色之前,您必须授予切换到该角色的权限。您可以使用附加到 IAM 用户组之一或用户本身的任何策略来授予必要的权限。

Assuming a Role AssumeRole Using IAM Roles Using an IAM Role to Grant Permissions to Applications Running on Amazon EC2 Instances

【问题讨论】:

【参考方案1】:

担任角色意味着要求安全令牌服务 (STS) 为您提供一组临时凭证 - 角色凭证 - 特定于您要担任的角色。 (特别是具有该角色的新“会话”。)

您可以选择在此请求中包含一个策略,这将用于将临时凭证的权限限制为角色策略允许的权限的子集。

然后,您可以使用这些凭据发出进一步的请求。这些凭证看起来类似于带有访问密钥 ID 和秘密的 IAM 用户凭证,但访问密钥以 ASIA 而不是 AKIA 开头,并且还有第三个元素,称为安全令牌,它必须包含在签名的请求中使用临时凭据。

当您使用这些临时凭证发出请求时,您拥有与该角色相关的权限,而不是您自己的权限(如果您有的话),因为您采用了新身份。 CloudTrail 可用于将角色凭据追溯到担任该角色的用户,否则服务不知道谁在使用这些凭据。

tl;dr:承担角色意味着获得一组与该角色相关联的临时凭证,而不是与承担该角色的实体相关联。

AWS(API?或 AWS 中的一些授权运行时?)标识可以授予委托人的角色。

没有。您指定要担任的角色。

当“您”是在 EC2 实例上运行的代码,并且该实例具有实例角色时,EC2 基础架构实际上会代表该实例调用假设角色,您可以从 instance metadata service 获取临时凭证。这些凭据只能从实例内部访问,但它们不存储在实例中。

在运行 Lambda 函数时,Lambda 基础设施会联系 STS 并将您的临时凭证放在 environment variables 中。同样,函数可以访问这些凭据,而无需存储在函数内部。

在任何一种情况下,您都可以使用这些凭据调用承担角色并承担不同的角色,但这在大多数环境中不是必需的。

例如如果指定 EC2 用户执行假设角色 API 调用并运行应用程序来访问附加了 IAM 配置文件的 EC2 实例中的 AWS 资源,则:

AWS 不了解 EC2 用户。实例上运行的所有东西都可以访问实例角色。

EC2 IAM 配置文件中的所有 IAM 角色

An instance profile can only include one role.

假设角色调用中请求的 IAM 角色和策略

您要求只担任一个角色。您不需要请求策略 - 如果您希望临时凭证具有比角色凭证允许的更少 权限,您只需指定策略。如果您需要在不受信任的地方(例如浏览器或应用程序中的代码)运行代码,以便能够使用凭据对请求进行签名,那么您可能会这样做。

AWS 从具有允许原则对资源执行操作的策略(操作、资源)的角色中找到一个角色。

没有。如上所述,您在调用假设角色时要求特定角色。

AWS 将原则的角色切换为识别的角色。

没有。 使用提供的临时凭据进行切换。

【讨论】:

所以当我将角色“X”附加到 EC2 实例时,EC2 实例会“承担”该角色吗?然后,当我使用“ec2-user”发出“aws s3 cp ...”请求时,“ec2-user”使用 EC2 实例可用的凭据,因为承担了角色 X?跨度> @SheelPancholi EC2 service 代入该角色并为 instance 提供凭证——实例上的任何和所有操作系统用户都可以访问如上所述,通过实例元数据服务的角色凭据。 假设我有角色 A 和 B。你能告诉我由 A 担任角色 B 的“优势”是什么,而不是仅仅在 A 上设置所需的权限(授予的权限) B)你自己? @Tomasz 如果这两个角色都是您自己帐户中的角色,那么没有很多明显的理由说明这会有用。 @programming_and_math 除了 IAM 角色 A 和 IAM 角色 B,更常见的是 IAM user A 和 IAM 角色 B,其中 IAM 角色 B 授予一些更高的权限,例如能够读取 S3 存储桶中的敏感日志。必须承担角色 B 与简单地授予用户 A 对存储桶的访问权的价值在于 IAM 用户凭证是长期的,而 IAM 角色/STS 凭证是短期的。暴露 STS 凭证的风险较低。您还可以在担任角色 B 时要求 MFA,而 IAM 用户通常可能很繁重地为日常使用提供 MFA。【参考方案2】:

我为自己创建了下图,以了解在 AWS 中究竟扮演什么角色。希望对您有所帮助。

在图中,我把它分为 3 个步骤:

    准备角色(ExecutionRole 和 AssumedRole) 在账户 A(在您的情况下是 EC2)上创建 Lambda 函数 执行 LambdaFunction。

图中以跨账户为例,如果在同一个账户内,则不需要步骤1.3。

通常,您在帐户中使用 AssumeRole 或进行跨帐户访问。 ... 与角色在同一账户中的用户不需要显式权限即可担任该角色。 来源:https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html

【讨论】:

【参考方案3】:

当第 3 步发生时,它说:“委托人已经假设 角色”。这是正确的吗?

您在担任角色时提到的步骤正确

这里的重点是 IAM 角色的信任关系配置,您可以在其中授予每个 IAM 用户、应用程序或服务代入该角色。这是您授予承担特定角色的权限的地方。

这在许多方面都很重要,它控制谁可以担任该角色,重要的是不仅要提供对该角色的最少访问权限,而且还要授予最少数量的可以担任该角色的实体。

【讨论】:

以上是关于究竟啥是 AWS 中的“承担”角色?的主要内容,如果未能解决你的问题,请参考以下文章

PyCharm/ IntelliJ IDEA 运行配置使用 MFA 承担 AWS 角色

通过 jclouds 使用 AWS (S3) - 如何承担角色

如何在 Elasticbeanstalk 环境中运行的 docker 容器中承担 AWS 角色?

究竟啥是 Web 框架?

在多账户 AWS 环境中,我将如何在 IAM 用户登录时强制他/她承担角色?

python 简单的python函数,用于从角色ARN承担AWS IAM角色并返回boto3会话对象