如何使用 IAM 策略限制用户仅启动具有特定 AMI 集的实例?

如何使用 IAM 策略限制用户仅启动具有特定 AMI 集的实例?

我有想要允许使用“类型”标签标记的 AMI。

这是我尝试过的策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:RunInstances",
        "ec2:StartInstances"
      ],
      "Condition": {
        "StringEquals": {
          "ec2:ResourceTag/type": "permitted_amis"
        }
      },
      "Resource": [
        "*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeInstances",
        "ec2:CreateTags"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}

当我尝试从其中一个 AMI 启动实例时,权限被拒绝。

答案1

问题是您不再具有 ec2:RunInstances 权限,因为您将该权限与条件一起添加,因此它会覆盖 - 它将查找具有该标签的 EC2 实例;看到您在 Resource:["*"] 上只有“ec2:DescribeInstances”;

添加两个单独的语句,并为每个语句指定确切的资源:

  • 一个用于具有资源的 AMI:[“arn:aws:ec2:region::image/ami-*”]
  • 一个用于 ec2:RunInstances,其资源为:[“arn:aws:ec2:region:account:instance/*”]

例子: (取自http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ExamplePolicies_EC2.html#ex5

以下策略允许用户仅使用具有指定标签“department=dev”的 AMI 启动实例。用户无法使用其他 AMI 启动实例,因为第一个语句的 Condition 元素要求用户指定具有此标签的 AMI。用户也无法启动到子网,因为该策略不授予子网和网络接口资源的权限。但是,他们可以启动到 EC2-Classic。第二个语句使用通配符使用户能够创建实例资源,并要求用户指定密钥对 project_keypair 和安全组 sg-1a2b3c4d。用户仍然可以在没有密钥对的情况下启动实例。

{
   "Version": "2012-10-17",
   "Statement": [{
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [ 
         "arn:aws:ec2:region::image/ami-*"
      ],
      "Condition": {
         "StringEquals": {
            "ec2:ResourceTag/department": "dev"
         }
      }
   },
   {
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [ 
          "arn:aws:ec2:region:account:instance/*",
          "arn:aws:ec2:region:account:volume/*",
          "arn:aws:ec2:region:account:key-pair/project_keypair",
          "arn:aws:ec2:region:account:security-group/sg-1a2b3c4d"
         ]
      }
   ]
}

相关内容