ちょっと話題の記事

特定インスタンスタイプのEC2インスタンスが起動できないIAMユーザーを作成する

2014.05.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

AWSを教育目的等で利用する際、利用費が高額なインスタンスタイプのEC2を起動させたくないなという場合があります。もちろん業務利用においても、オペレーションミスを防ぐために、同様の防御策を採りたいといったケースは少なく無いと思います。今回は、このような目的を達成するようなポリシーが設定されたIAMユーザーを作成したいと思います。

この記事のテクニックを利用すると特定AWSサービスの特定のAPIを特定条件でのみ禁止するようにする事ができるようになります。

GroupとUserの作成

まず最初に本記事で利用するGroupとUserを作成します。下記では「ec2-restricted」という名前でGroupを作成しています。

EC2インスタンスタイプ制限01

いったん No Permissions でGroupを作成してしまいます。権限が何もない状態です。

次に、同じ「ec2-restricted」という名前でUserを作成します。作成したら、「ec2-restricted」Groupに所属させておきます。

この後、PolicyをGroupに付与していきます。Userに直接Policyを付与することは推奨されていません。

GroupへのPolicyの付加

次にGroupに下記の要件を満たすPolicyを付加します。

・EC2 PowerUser権限が与えられている。 ・インスタンスタイプ=t1.microの場合だけ処理が許可されない。

 先ほど作成したGroup「ec2-restricted」を選択し、Permissionsタブで「Attach Policy」ボタンをクリックしてPolicyを作成していきます。「Manage Group Permissions」画面が表示されるので、「Custom Policy」を選択し、「Select」ボタンをクリックするとカスタムポリシーを記入する画面が出ます。そこで「Policy Name」と「Policy Document」を下記のように設定します。

Policy Name

AmazonEC2InstanceTypeRestrictedPolicy

Policy Document

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": "ec2:*",
      "Effect": "Allow",
      "Resource": "*"
    },
    {
      "Effect": "Deny",
      "Action": "ec2:RunInstances",
      "Condition": {
        "StringEquals": {
          "ec2:InstanceType": "t1.micro"
        }
      },
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "elasticloadbalancing:*",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "cloudwatch:*",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "autoscaling:*",
      "Resource": "*"
    }
  ]
}

Conditionを用いてec2:InstanceType=t1.microの場合に処理をDenyするようにしています。

※このPolicyはPolicy Templateで「Amazon EC2 Full Access」を選択した際のPolicyにハイライト部分のPolicyを追加したものです。

制限されているインスタンスタイプのEC2インスタンスの起動

それでは、制限されているインスタンスタイプのEC2インスタンスを起動してみましょう。今回はt1.microが制限されているので、t1.microのインスタンスをAWS Management Consoleで起動してみます。

EC2の起動ウィザードでインスタンスタイプとしてt1.microを指定し、他の設定はデフォルト値でもよいので設定し、インスタンスを起動してみます。すると下記エラー画面が表示されます。

EC2インスタンスタイプ制限05

今回のポリシーではec2:RunInstances以外のEC2 APIは全て許可されていますので、ウィザードも特にエラー無く表示され、最後のインスタンス起動処理でもSecurity Groupの作成等は成功していますが、最後のサーバー起動処理で失敗していることが分かります。

制限されていないインスタンスタイプのEC2インスタンスの起動

次に制限されていないインスタンスタイプのEC2インスタンスを起動してみます。t1.micro以外は許可されているので、m1.smallを起動してみます。t1.micro同様にウイザードでインスタンスタイプとしてm1.smallを選択したら、その他は適当に設定をし、インスタンスを起動してみます。すると下記のお馴染みの起動成功画面が表示されます。パチパチパチパチー(拍手)

EC2インスタンスタイプ制限06

まとめ

今回はEC2のt1.microの起動が制限されたIAMユーザーを作成しました。Custom Plicyのt1.microの部分を高価な起動させたくないインスタンスタイプの配列に差し替えると、それらのインスタンスの起動を抑制することができるようになります。これで、社内セミナーなどで高価なc3.8xlargeやhs1.8xlargeが起動されるのを防ぐことが出来ますね。

この記事により多くの無駄な血が流れなくなることを祈っております。