如何创建 IAM 策略来向 IAM 用户、组或角色显式授予使用标签在指定 VPC 中创建和管理 EC2 实例的权限?

2 分钟阅读
0

如何创建 AWS Identity and Access Management(IAM)策略来显式地向 IAM 用户、组或角色授予在指定的 VPC 中创建和管理 Amazon Elastic Compute Cloud(Amazon EC2)实例的权限? 该策略必须限制权限,以便 IAM 实体可以创建包含特定标签的 EC2 实例,并使用这些标签在 VPC 中管理这些 EC2 实例。

简短描述

Amazon EC2 支持的资源级权限较为有限,但可以考虑在几个操作、资源和条件级别进行控制。某些 Amazon EC2 API 操作(例如启动 EC2 实例)可以使用控制实例的标签通过 VPC ARN 来控制。

解决方法

使用自定义 IAM 策略来限制 IAM 用户、组或角色在含有标签的指定 VPC 中创建 EC2 实例的权限。使用策略条件“ec2: ResourceTags”限制对实例的控制。此策略会授予在具有唯一标签的指定 VPC 中启动 EC2 实例的权限。然后,您可以使用限制性标签管理这些 EC2 实例。

创建要应用到用于启动实例的 IAM 实体的托管策略

1.    打开 IAM 控制台,选择策略,然后选择创建策略

2.    选择 JSON 选项卡,然后输入以下自定义策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "GrantIAMPassRoleOnlyForEC2",
      "Action": [
        "iam:PassRole"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:iam::ACCOUNTNUMBER:role/ROLENAME",
        "arn:aws:iam::ACCOUNTNUMBER:role/ROLENAME"
      ],
      "Condition": {
        "StringEquals": {
          "iam:PassedToService": "ec2.amazonaws.com"
        }
      }
    },
    {
      "Sid": "ReadOnlyEC2WithNonResource",
      "Action": [
        "ec2:Describe*",
        "iam:ListInstanceProfiles"
      ],
      "Effect": "Allow",
      "Resource": "*"
    },
    {
      "Sid": "ModifyingEC2WithNonResource",
      "Action": [
        "ec2:CreateKeyPair",
        "ec2:CreateSecurityGroup"
      ],
      "Effect": "Allow",
      "Resource": "*"
    },
    {
      "Sid": "RunInstancesWithTagRestrictions",
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [
        "arn:aws:ec2:REGION:ACCOUNTNUMBER:instance/*",
        "arn:aws:ec2:REGION:ACCOUNTNUMBER:volume/*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/TAG-KEY": "TAG-VALUE"
        }
      }
    },
    {
      "Sid": "RemainingRunInstancePermissionsNonResource",
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": [
        "arn:aws:ec2:REGION::image/*",
        "arn:aws:ec2:REGION::snapshot/*",
        "arn:aws:ec2:REGION:ACCOUNTNUMBER*:network-interface/*",
        "arn:aws:ec2:REGION:ACCOUNTNUMBER*:key-pair/*",
        "arn:aws:ec2:REGION:ACCOUNTNUMBER*:security-group/*"
      ]
    },
    {
      "Sid": "EC2RunInstancesVpcSubnet",
      "Effect": "Allow",
      "Action": "ec2:RunInstances",
      "Resource": "arn:aws:ec2:REGION:ACCOUNTNUMBER:subnet/*",
      "Condition": {
        "StringEquals": {
          "ec2:Vpc": "arn:aws:ec2:REGION:ACCOUNTNUMBER:vpc/VPC-ID"
        }
      }
    },
    {
      "Sid": "EC2VpcNonResourceSpecificActions",
      "Effect": "Allow",
      "Action": [
        "ec2:DeleteNetworkAcl",
        "ec2:DeleteNetworkAclEntry",
        "ec2:DeleteRoute",
        "ec2:DeleteRouteTable",
        "ec2:AuthorizeSecurityGroupEgress",
        "ec2:AuthorizeSecurityGroupIngress",
        "ec2:RevokeSecurityGroupEgress",
        "ec2:RevokeSecurityGroupIngress",
        "ec2:DeleteSecurityGroup",
        "ec2:CreateNetworkInterfacePermission",
        "ec2:CreateRoute",
        "ec2:UpdateSecurityGroupRuleDescriptionsEgress",
        "ec2:UpdateSecurityGroupRuleDescriptionsIngress"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "ec2:Vpc": "arn:aws:ec2:REGION:ACCOUNTNUMBER:vpc/VPC-ID"
        }
      }
    },
    {
      "Sid": "AllowInstanceActionsTagBased",
      "Effect": "Allow",
      "Action": [
        "ec2:RebootInstances",
        "ec2:StopInstances",
        "ec2:TerminateInstances",
        "ec2:StartInstances",
        "ec2:AttachVolume",
        "ec2:DetachVolume",
        "ec2:AssociateIamInstanceProfile",
        "ec2:DisassociateIamInstanceProfile",
        "ec2:GetConsoleScreenshot",
        "ec2:ReplaceIamInstanceProfileAssociation"
      ],
      "Resource": [
        "arn:aws:ec2:REGION:ACCOUNTNUMBER:instance/*",
        "arn:aws:ec2:REGION:ACCOUNTNUMBER:volume/*"
      ],
      "Condition": {
        "StringEquals": {
          "ec2:ResourceTag/TAG-KEY": "TAG-VALUE"
        }
      }
    },
    {
      "Sid": "AllowCreateTagsOnlyLaunching",
      "Effect": "Allow",
      "Action": [
        "ec2:CreateTags"
      ],
      "Resource": [
        "arn:aws:ec2:REGION:ACCOUNTNUMBER:instance/*",
        "arn:aws:ec2:REGION:ACCOUNTNUMBER:volume/*"
      ],
      "Condition": {
        "StringEquals": {
          "ec2:CreateAction": "RunInstances"
        }
      }
    }
  ]
}

3.    使用您环境中的值替换 ACCOUNTNUMBERREGIONTAG-KEYTAG-VALUEVPC IDROLENAME 参数。

4.    (可选)如果您仅将此策略分配给 IAM 用户或组,则可以使用 IAM 策略变量 ${aws:username} 替换 TAG-KEY 或 TAG-VALUE 参数。此策略变量允许 IAM 服务使用调用 IAM 用户的友好名称预填充这些参数。此步骤允许 IAM 用户仅在指定的 VPC 中启动实例,且允许 IAM 用户控制他们自己的实例。

5.    选择查看策略,然后在名称中输入一个名称。例如,输入“VPC_Lockdown_VPC-ID”,其中“VPC-ID”是您要将此策略应用到的 VPC 的 ID。

6.    选择创建策略

**注意:**必须将一些项目替换为您环境中的特定资源。有关更多信息,请参阅 Amazon 资源名称 (ARN)

将策略附加到用户、组或角色

1.    在 IAM 控制台导航窗格中,选择用户角色

2.    选择要将策略附加到的用户、组或角色。

3.    选择附加策略

4.    在搜索框中输入要创建的策略的名称,然后选择您的策略。例如,输入“VPC_Lockdown_VPC-ID”。

5.    选择 Attach Policy(附加策略)。

附加了此自定义策略的 IAM 实体可以登录 AWS 管理控制台,打开 Amazon EC2 控制面板,然后在指定子网、VPC 和标签后启动 EC2 实例。

此策略使用策略条件“ec2:ResourceTags”来限制以下操作:

  • 启动实例
  • 停止实例
  • 重启实例
  • 终止实例
  • 向实例附加卷
  • 从实例分离卷
  • 解除实例与 IAM 实例配置文件的关联
  • 替换实例的 IAM 实例配置文件关联
  • 获取实例的控制台屏幕截图

此策略针对指定的 VPC 限制以下操作:

  • 删除安全组
  • 创建和删除路由
  • 删除路由表
  • 删除网络 ACL
  • 删除 ACL 条目
  • 授权或撤销安全组入口和出口规则
  • 创建网络接口权限
  • 更新入口和出口规则的安全组描述

AWS 官方
AWS 官方已更新 2 年前