如何使用IAM基于标签隐藏EC2实例?

14
我想在IAM中创建一个新用户,并允许他能够创建新的EC2实例,但只能查看/管理他自己创建的那些实例。这在IAM中可行吗?这是我尝试过的组策略:
{
"Statement": 
[
{
  "Effect": "Allow",
  "Action": 
  [
    "ec2:DescribeImages",
    "ec2:DescribeKeyPairs", "ec2:DescribeSecurityGroups",
    "ec2:DescribeAvailabilityZones"
  ],
  "Resource": "*"
},

{
  "Effect": "Allow",
  "Action": 
  [
    "ec2:DescribeInstances","ec2:RunInstances", "ec2:TerminateInstances",
     "ec2:StartInstances", "ec2:StopInstances", "DescribeInstanceAttribute", "DescribeInstanceStatus"
  ],
  "Resource": "*",
  "Condition": 
  {
    "StringEquals": 
    {
      "ec2:ResourceTag/tag": "TheValueOfTheTag"
    }
  }

}
]
}
1个回答

19

很遗憾,目前还没有这个功能,至少不是你可能正在寻找的自动方式 - 你的使用情况有两个方面:

资源级权限

最近引入的EC2和RDS资源的资源级权限终于允许将Amazon EC2 API操作限制在特定实例上,从而从那个角度启用了您的使用情况,例如:

  • 允许用户在更大的多用户EC2环境中对有限的资源进行操作。
  • [...]
  • 控制哪些用户可以终止哪些实例。

示例 IAM 策略 功能展示了如何允许用户对其用户名匹配的 Amazon DynamoDB 表执行所有操作, 演示了策略变量${aws:username}的使用(有关详细信息,请参见IAM 策略变量概述):

{
  "Version": "2012-10-17",
  "Statement": [{
      "Effect": "Allow",
      "Action": ["dynamodb:*"],
      "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/${aws:username}"
    }
  ]
}

注意事项

目前并非所有API操作都支持资源级别的权限控制:

This is a complex and far-reaching feature and we'll be rolling it out in stages. In the first stage, the following actions on the indicated resources now support resource-level permissions:

Instances - Reboot, Start, Stop, Terminate.
EBS Volumes - Attach, Delete, Detach.

EC2 actions not listed above will not be governed by resource-level permissions at this time. We plan to add support for additional APIs throughout the rest of 2013.

值得注意的是,它不包含您似乎正在寻找的ec2:Describe*操作。

审计追踪

然而,AWS尚未公开发布任何类型的审计功能(由于Amazon IAM的工作方式必须在内部可用),这意味着没有选项可以找出哪个特定的IAM用户创建了特定的资源。

更新

正如预期的那样,AWS已经发布了AWS CloudTrail,它是一个记录您帐户的AWS API调用并将日志文件传递给您的Web服务:

记录的信息包括API调用者的身份、API调用时间、API调用者的源IP地址、请求参数以及AWS服务返回的响应元素。

有关一些详细信息和初始约束,请参见我的相关答案Logs for actions on amazon s3 / other AWS services

部分解决方法

我不知道任何自包含的解决方法 - 在协作环境中,您可以通过以下方式近似实现所需的监视和自动化:

1)您需要规定用户始终仅使用某种标记方案运行EC2实例,例如owner=<username>

2)有了这个方案,您可以应用基于${aws:username}的策略,如上所述,或者是基于标记的轻微变化 - AWS安全博客有一篇全面的文章Resource-level Permissions for EC2 – Controlling Management Access on Specific Instances说明了这种方法 - 您的策略可能如下所示:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "ec2:StartInstances",
        "ec2:StopInstances",      
        "ec2:RebootInstances",
        "ec2:TerminateInstances"
      ],
      "Condition": {
        "StringEquals": {
          "ec2:ResourceTag/owner":"${aws:username}"
        }
      },
      "Resource": [
        "arn:aws:ec2:your_region:your_account_ID:instance/*"
      ],
      "Effect": "Allow"
    }
  ]
}

3) 请注意,这意味着如果用户忘记使用正确的标签启动实例,他将无法管理自己的实例,因此除此之外,您还可以使用类似于Netflix的Conformity Monkey来基于启发式方法强制执行策略,即一旦检测到没有必需标签的实例,负责人会收到通知,并尝试通过询问用户或关闭实例来强制执行此操作(当然也可以自动完成)。


对于这种方法,这意味着管理员需要首先创建带有用户名称标签的EC2,是吗?有没有办法允许用户创建并仅将他的实例标记为他的用户名? - kklw
据我所知,即使在4年后的今天(2017年),许多操作仍然没有资源级权限,包括实例列表和描述。 - Zbyszek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接