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


20

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

发生客户端错误(AccessDenied):用户:arn:aws:sts :: xxxxxxxxxxxx:assumed-role / shell / i-15c2766d无权执行:iam:ListInstance资源上的配置文件:arn:aws:iam :: xxxxxxxxxxxx:instance -轮廓/

(其中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角色(也许是“超级根IAM” ...组成此名称)?

仅供参考,一切都涉及在实例上运行Linux。另外,由于无法在台式机上安装这些工具,因此我从一个实例运行所有这些程序。那并且我不想按照这里的AWS建议将IAM用户凭据放在任何AWS存储上。

回答后:

我没有提到“ PowerUserAccess”(相对于“ AdministratorAccess”)的启动实例权限,因为在提出问题时我没有意识到需要其他访问权限。我以为IAM角色是与发布相关的“信息”。但这还不仅仅如此。这是授予权限。

Answers:


23

更新资料

Mike Pope 在AWS Security Blog上发表了一篇不错的文章,内容涉及授予具有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":"*"
    }]
}

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

感谢您提供有关iam:PassRole的信息。这比我以前学到的要详细得多,它确实比通过配置这样的权限显示了更多的事情。
Skaperen

1

要启动具有IAM角色的EC2实例,需要对IAM设施具有管理权限。即使新实例的角色与启动实例的角色完全相同,也是如此。我从中启动的实例具有“ PowerUserAccess”权限,该权限允许启动实例,但没有IAM角色访问权限。一旦我在启动实例中将权限提升为“ AdministratorAccess”,便可以使用。

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

能够以与实例启动时所拥有的权限相同的权限(具有相同的IAM角色)启动实例将很有用,但是EC2或IAM没有这种级别的粒度,或者没有安全地验证此级别的方法。


1
您已经正确地分析/描述了潜在问题(+1),但是您的结论有点不准确/具有误导性-我添加了一个单独的答案以正确解释IAM如何解决潜在的安全问题。
斯特芬·欧宝2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.