はじめに
組織内で利用しているAWS環境の利用ルールを整備している過程で、「EC2へ特定のタグ付けを強制するIAMポリシー」を作成したのでここに記しておきます。
こちらのポリシーを適用することで、特定のタグをつけなければEC2の起動が拒否されるようになります。
前提条件
前提として、IAMユーザはEC2へのすべてのアクションを許可されているとします。
そのユーザに対して、Denyステートメントを用いて「EC2へ特定のタグ付けを強制するIAMポリシー」を適用します。
ポリシーではDenyがAllowより優先されます。
該当するポリシーに Deny ステートメントが含まれている場合、リクエストは明示的に拒否されます。リクエストに適用されるポリシーに Allow ステートメントと Deny ステートメントが含まれている場合は、Deny ステートメントが Allow ステートメントより優先されます。リクエストは明示的に拒否されます。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#AccessPolicyLanguage_Interplay
IAMポリシーの作成・適用
今回はEC2へProject
というタグを強制するポリシーを作成し、IAMユーザに適用します。
IAMポリシーの作成
-
管理コンソールから「IAM」→「ポリシー」→「ポリシーの作成」をクリックします。
-
ポリシーエディタでJSONを選択し、以下のポリシーを入力します。
ポリシー定義{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyRunInstancesWithoutTag", "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "Null": { "aws:RequestTag/Project": "true" } } } ] }
こちらのポリシーでは、
Action
にec2:RunInstances
を指定し、EC2インスタンスの起動操作がこのポリシーにより制御されるようにします。
Resource
にarn:aws:ec2:*:*:instance/*
を指定し、すべてのEC2インスタンスを対象とします。
Condition
は、このポリシーが適用される具体的な条件を指定します。ここでのNull
コンディションは、指定されたキーが存在しない場合にマッチします。つまり、aws:RequestTag/Project
がtrue
となっているので、EC2インスタンス作成リクエストがProject
タグを持っていない場合に、このポリシーが適用されます。
(参考:条件キーの有無をチェックする条件演算子) -
ポリシー名を設定し、「ポリシーを作成」をクリックします。
(今回は「DenyRunInstancesWithoutTag」というポリシー名を設定しました。)
ポリシーの適用
今回は簡易的に動作確認を実施するために、testユーザへ直接ポリシーを適用します。
- 「IAM」→「ユーザー」からポリシーを適用するユーザを選択します。
- 「許可」タブ→「許可を追加」をクリックします。
- 許可のオプションから「ポリシーを直接アタッチする」を選択し、先ほど作成したIAMポリシーを選択します。「次へ」をクリックします。
- 「許可を追加」をクリックします。
動作確認
testユーザで管理コンソールへログインし、動作確認を行います。
指定されたタグ無しでEC2を起動
指定されたタグ付きでEC2を起動
ポリシー条件のキー名では、大文字と小文字は区別されないため、タグ名をproject
と設定しても起動できます。
ポリシー条件のキー名では、大文字と小文字は区別されません。
https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_tags.html#access_tags_control-tag-keys