如何为通过 AWS CLI 启动的 Amazon EC2 实例指定 IAM 角色?

Ska*_*ren 21 amazon-ec2 amazon-iam

我正在使用“aws ec2 run-instances”命令(来自AWS 命令​​行界面 (CLI))来启动Amazon EC2实例。我想为我正在启动的 EC2 实例设置IAM 角色。IAM 角色已配置,我可以在从 AWS Web UI 启动实例时成功使用它。但是当我尝试使用该命令和“--iam-instance-profile”选项执行此操作时,它失败了。执行“aws ec2 run-instances help”会显示值的 Arn= 和 Name= 子字段。当我尝试使用“aws iam list-instance-profiles”查找 Arn 时,它给出了以下错误消息:

发生客户端错误 (AccessDenied):用户:arn:aws:sts::xxxxxxxxxxxx:assumed-role/shell/i-15c2766d 无权执行:iam:ListInstanceProfiles on resource: arn:aws:iam::xxxxxxxxxxxx:instance -轮廓/

(其中 xxxxxxxxxxxx 是我的 AWS 12 位帐号)

我通过 Web UI 查找 Arn 字符串,并通过 run-instances 命令上的“--iam-instance-profile Arn=arn:aws:iam::xxxxxxxxxxxxxx:instance-profile/shell”使用它,但失败了:

发生客户端错误 (UnauthorizedOperation):您无权执行此操作。

如果我完全不使用“--iam-instance-profile”选项,实例将启动,但它不会具有我需要的 IAM 角色设置。因此,该权限似乎与使用“--iam-instance-profile”或访问 IAM 数据有关。我重复了几次以防 AWS 故障(它们有时会发生)但没有成功。

我怀疑可能存在一个限制,即不允许具有 IAM 角色的实例启动具有更强大 IAM 角色的实例。但在这种情况下,我正在执行命令的实例具有与我尝试使用的相同的 IAM 角色。命名为“shell”(虽然我也尝试使用另一个,但没有运气)。

  • 是否甚至不允许从实例(通过其 IAM 角色凭证)设置 IAM 角色?

  • 使用 IAM 角色是否需要比启动普通实例更高的 IAM 角色权限?

  • “--iam-instance-profile”是指定 IAM 角色的适当方式吗?

  • 我是否需要使用 Arn 字符串的子集,或以其他方式对其进行格式化?

  • 是否可以设置一个可以执行任何 IAM 角色访问的 IAM 角色(可能是“超级根 IAM”...组成这个名称)?

仅供参考,一切都涉及在实例上运行的 Linux。此外,我正在从一个实例运行所有这些,因为我无法在我的桌面上安装这些工具。我不想将我的 IAM 用户凭证放在 AWS此处建议的任何 AWS 存储上。

回答后:

我没有提到“PowerUserAccess”(与“AdministratorAccess”)的启动实例权限,因为在提出问题时我没有意识到需要额外的访问权限。我假设 IAM 角色是附加到发布的“信息”。但它确实不止于此。这是一种许可。

Ste*_*pel 24

更新

Mike Pope在AWS 安全博客上发表了一篇关于授予启动具有 IAM 角色的 EC2 实例的权限(PassRole 权限)的好文章,从 AWS 的角度解释了主题。


初步答复

Skaperen 的回答部分正确(+1),但有点不精确/误导如下(解释似乎有点过于复杂,无法发表评论,因此这是单独的答案):

要启动具有 IAM 角色的 EC2 实例,需要对 IAM 工具进行管理访问。

这是正确的,并指出了潜在的问题,但所需的管理权限相当有限,因此以下结论......

由于 IAM 角色授予权限,因此显然需要解决一个安全问题。您不希望 IAM 角色成为允许权限升级的一种方式。

... 有点误导,只要潜在的安全问题可以得到妥善解决。授予在 Amazon EC2 实例上运行的应用程序访问 AWS 资源中解决了该主题:

您可以使用 IAM 角色来管理在 Amazon EC2 实例上运行的应用程序的凭证。使用角色时,您不必将 AWS 凭证分发到 Amazon EC2 实例。相反,您可以创建一个具有应用程序在 Amazon EC2 上运行并调用其他 AWS 资源时所需的权限的角色。当开发人员启动 Amazon EC2 实例时,他们可以指定您创建的与该实例关联的角色。然后,在实例上运行的应用程序可以使用角色凭据对请求进行签名。

现在,在手头的用例中,提到的开发人员[启动] Amazon EC2 实例实际上是 EC2 实例本身,这似乎产生了 Skaperen 概述的 catch 22 安全问题。尽管如使用 Amazon EC2 的角色所需的权限部分中的示例策略所示,情况并非如此:

{
   "Version": "2012-10-17",
   "Statement": [{
      "Effect":"Allow",
      "Action":"iam:PassRole",
      "Resource":"*"
    },
    {
      "Effect":"Allow",
      "Action":"iam:ListInstanceProfiles",
      "Resource":"*"
    },
    {
      "Effect":"Allow",
      "Action":"ec2:*",
      "Resource":"*"
    }]
}
Run Code Online (Sandbox Code Playgroud)

所以iam:PassRole实际上是唯一需要的 IAM 权限,虽然在技术上具有管理性质,但这并不是那么深远 - 当然,上面的示例策略仍然允许通过列出并依次传递任何可用角色来升级权限,但这可以通过仅指定那些需要/安全地传递给手头用例的角色来防止 - 这在限制哪些角色可以传递给 Amazon EC2 实例(使用 PassRole)部分中概述:

您可以使用 PassRole 权限来防止用户向 Amazon EC2 传递比用户已授予的权限更多的角色,然后在该角色的提升权限下运行应用程序。在角色策略中,允许 PassRole 操作并指定资源(例如 arn:aws:iam::111122223333:role/ec2Roles/*)以指示只能将特定角色或角色集传递给 Amazon EC2 实例.

相应的示例策略说明了与手头的用例完全匹配,即授予使用 Amazon EC2 API 启动具有角色的实例的权限

{
  "Version": "2012-10-17",
  "Statement": [{
      "Effect":"Allow",
      "Action":"ec2:RunInstances",
      "Resource":"*"
    },
    {
      "Effect":"Allow",
      "Action":"iam:PassRole",
      "Resource":"arn:aws:iam::123456789012:role/Get-pics"
    }]
}
Run Code Online (Sandbox Code Playgroud)