IAM ユーザー、グループ、またはロールに明示的に許可を付与し、タグを使用して特定の VPC 内に EC2 インスタンスを作成および管理するための IAM ポリシーを作成するにはどうすればよいですか?

最終更新日: 2021 年 10 月 19 日

特定の VPC で Amazon Elastic Compute Cloud (Amazon EC2) インスタンスの作成および管理を行うため、IAM ユーザー、グループ、またはロールに許可を明示的に付与する AWS Identity and Access Management (IAM) ポリシーを作成するにはどうすればよいですか? IAM エンティティが特定のタグを使用して EC2 インスタンスを作成し、それらのタグを使用して VPC でそれらの EC2 インスタンスを管理できるように、許可を制限する必要があります。

簡単な説明

Amazon EC2 は制限されているサポートされているリソースレベルの許可を提供しますが、検討すべきアクション、リソース、条件が複数あります。EC2 インスタンスの起動などの特定の Amazon EC2 API アクションは、インスタンスを制御するタグを使用して、VPC ARN を通して制御することができます。

解決方法

タグを使用して特定の VPC で EC2 インスタンスを作成するため、カスタム IAM ポリシーを適用して IAM ユーザー、グループ、またはロールの許可を制限します。「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-ID、および ROLENAME パラメータを環境の値に置き換えます。

4.    (オプション) このポリシーを唯一の IAM ユーザーまたはグループへ割り当てようとしている場合は、TAG-KEY または TAG-VALUE パラメータを IAM ポリシー変数 ${aws:username}に置き換えます。このポリシー変数により、IAM サービスが IAM ユーザーの呼び出しの フレンドリ名 にこれらのパラメータを自動入力できるようにします。このステップでは、IAM ユーザーが指定された VPC でのみインスタンスを起動できるようにし、自分のインスタンスを制御できるようにします。

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 エントリの削除
  • セキュリティグループの Ingress ルールと Egress ルールの認可
  • ネットワークインターフェイス許可の作成
  • Ingress ルールと Egress ルールのセキュリティグループ説明を更新する

この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?