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

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

我正在使用“aws ec2 run-instances”命令(来自AWS 命令​​行界面 (CLI))推出亚马逊 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 资源:arn:aws:iam::xxxxxxxxxxxx:instance-profile /

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

我通过 Web UI 查找了 Arn 字符串,并在 run-instances 命令上通过“--iam-instance-profile Arn=arn:aws:iam::xxxxxxxxxxxx: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 角色(也许是“Super Root IAM”......组成这个名称)?

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

回答后:

我没有提到“PowerUserAccess”(相对于“AdministratorAccess”)的启动实例权限,因为在提出问题时我没有意识到需要额外的访问权限。我假设 IAM 角色是与启动相关的“信息”。但实际上不止于此。它是一种授予权限。

答案1

更新

Mike Pope 发表了一篇关于授予使用 IAM 角色启动 EC2 实例的权限 (PassRole 权限)AWS 安全博客,从 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":"*"
    }]
}

因此,这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"
    }]
}

答案2

要使用 IAM 角色启动 EC2 实例,需要具有对 IAM 设施的管理访问权限。即使新实例具有与执行启动的实例完全相同的角色,这也适用。我启动的实例具有“PowerUserAccess”权限,允许启动实例,但不允许访问 IAM 角色。一旦我将启动实例中的权限提升为“AdministratorAccess”,它就可以正常工作了。

由于 IAM 角色授予权限,因此显然存在一个需要解决的安全问题。您不希望 IAM 角色成为允许权限升级的手段。但这也意味着,为了授予任何 IAM 角色,启动实例必须具有“AdministratorAccess”或在实例内部使用用户访问/密钥(具有此类权限)(不推荐),这将允许授予任何 IAM 角色。

能够以与启动实例相同的权限(相同的 IAM 角色)启动实例会很有用,但 EC2 或 IAM 要么没有这种粒度级别,要么没有安全地验证这一点的方法。

相关内容