【问题标题】:How to allow AWS user to see but not launch, start or stop instances如何允许 AWS 用户查看但不能启动、启动或停止实例
【发布时间】:2015-02-02 12:38:43
【问题描述】:

我已经为 AWS 用户设置了这样的策略:

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect":"Allow",
         "Action": "ec2:Describe*",
         "Resource":"*"
      }
   ]
}

其目的是允许使用此策略的用户在控制台上查看 EC2 实例,但实际上不对它们进行任何操作。问题是,一旦应用此策略,用户可以启动、停止、终止和启动新实例,即使上述策略 AFAIK 中没有解决这些权限。

为什么上述政策会发生这种情况,我可以做些什么来防止它(即实现我所追求的“查看但不触摸”结果)?

【问题讨论】:

  • 好的 - 没关系[在此处插入表情符号以表示尴尬]。正如 Steffen 猜测的那样,我在别处附加了一个错误的“ec2:*”权限(即“继续,做任何你想做的事情”)。
  • 先生,我想将此策略应用于单个实例。那可能吗?如果是的话怎么办?我陷入了很多困境。我想将单个用户限制为单个实例
  • 是的,你可以这样做。由于评论编辑器的限制,我将在下面发布一个新的“答案”。

标签: amazon-web-services amazon-ec2 amazon-iam


【解决方案1】:

Amazon IAM 策略是默认拒绝,与显式拒绝不同,详见The Difference Between Denying by Default and Explicit Deny

因此,默认情况下观察到的行为是不可能的,因此必须为该用户制定另一项政策,明确授予不受欢迎的操作,例如ec2:RunInstances。您可以通过以下选项来解决此问题:

识别/删除显式允许

您可以通过出色的新AWS Identity and Access Management Policy Simulator 来分析哪些策略允许不受欢迎的操作,这对此类问题非常有帮助。

添加显式拒绝

您可以为那些用户不应该执行的操作添加显式拒绝,例如:

{
  "Statement": [
    {
      "Action": [
        "ec2:RebootInstances",
        "ec2:RunInstances",
        "ec2:StartInstances",
        "ec2:StopInstances",
        "ec2:TerminateInstances"
      ],
      "Effect": "Deny",
      "Resource": "*"
    }
  ]
}

请注意,后者仍将允许您可能不想要的相当多的其他 EC2 操作,因此明确拒绝除所需操作之外的所有操作的更完整方法是促进NotAction

NotAction 元素可让您指定操作列表的例外情况。例如,您可以使用 NotAction 让用户仅使用 Amazon SQS SendMessage 操作,而不必列出不允许用户执行的所有操作。与使用 Action 元素并列出许多操作相比,使用 NotAction 有时会导致更短的策略。

  • 警告:请注意,使用 NotAction 表示明确的 Deny 时,很容易限制超出您的预期,甚至将自己锁定 - 始终确保 Resource 语句仅针对所需的资源。例如,简单地使用通用通配符* 而不是像arn:aws:ec2:*:*:* 这样的更具体的资源选择器归结为“拒绝所有服务对每个服务以外的所有操作” - 例如,这将包括再次删除错误策略的能力!最好通过预先仔细模拟策略来避免这种情况。

分别。政策可能如下所示:

{
  "Statement": [
    {
      "NotAction": [
        "ec2:Describe*"
      ],
      "Effect": "Deny",
      "Resource": "arn:aws:ec2:*:*:*"
    }
  ]
}

【讨论】:

  • 你是对的。正如我要添加到我自己的问题中一样,在我没有注意到的其他地方设置了错误的“ec2:*”。让我兴奋一阵子。
  • 另外,请注意,我对在任何地方使用显式拒绝都非常谨慎,因为它们优先。如果必须,我会尽可能将它们添加到食物链的最底层(即针对我想要拒绝的用户)。
【解决方案2】:

对于 user3086014,创建类似于以下的策略:

{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect":"Allow",
         "Action": [
             "ec2:DescribeInstances",
             "ec2:StartInstances",
             "ec2:StopInstances",
             "ec2:RebootInstances"
         ],
         "Resource":[
            "arn:aws:ec2:us-west-1:0123456789012:instance/i-ffffffff"
         ]
      }
   ]
}

将操作更改为您希望允许用户执行的操作。更改资源以识别 您的 实例 - 即更改帐户 ID(我在上面写了 0123456789012)和实例 ID(我在上面写了 i-ffffffff)。然后将该策略应用于您的用户。如果您想允许使用两个实例,请添加第二个 ARN,并在 ARN 之间使用逗号分隔符(需要 JSON 格式)。

请下次单独提问。在 cmets 本身中进行问答是很尴尬的。谢谢!

【讨论】:

  • 先生,当我使用控制台执行此操作时,它无法正常工作,我收到此错误:You are not authorized to describe Running Instances You are not authorized to describe Elastic IPs You are not authorized to describe Volumes You are not authorized to describe Snapshots
  • 最快的做法是将上面示例中的“DescribeInstances”替换为“Describe*”。但是,没有什么可以替代研究行动列表以确定您可以控制的内容 - 然后制定您想要控制的计划。对于 EC2 操作,请参阅docs.aws.amazon.com/AWSEC2/latest/APIReference/Welcome.html - 您可以单击“操作”或“按功能列出的操作”,这样组织起来更好。在任一列表中,您都可以单击特定操作以了解更多信息。本文档更多用于 API 编程,但名称映射到 IAM 权限。
  • @JackLThornton - 不幸的是,这目前不起作用,因为 Describe* 操作尚未启用资源级别权限(即此处的特定实例 ID),而仅适用于通配符资源 @987654326 @(有关背景,请参阅我对 user3086014 的问题 How can I allow a single user to have access of an ec2 instance in AWs console using IAM 的回复和后续 cmets,我已经对此进行了非常详细的解释,但无济于事......)。
  • 嗯..你是对的,我忘记了。但是,您可以将“Describe*”移动到单独的语句中,以允许用户查看所有内容;虽然他们可以看到一切,但他们仍然只能按照资源有限的声明来操作项目。唯一需要注意的是,AWS Web 控制台在设置 UI 之前不会检查权限,只有在运行操作时才检查权限 - 所以看起来 AWS 将允许用户做被禁止的事情,只会告诉他们去捣沙在他们点击操作上的“应用”或“执行”按钮之后。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-15
  • 2019-08-03
  • 2016-11-22
  • 2014-04-08
  • 1970-01-01
  • 2022-11-18
  • 1970-01-01
相关资源
最近更新 更多