特定のタグが付いたAMIからのみEC2インスタンスを起動するためのIAMポリシー
はじめに
- 管理者(Administrator) が利用者(User)向けに AMIを作成
- AMIには
Owner: Administrator
タグを付ける
- AMIには
- 利用者(User) は
Owner: Administrator
タグを付けたAMIからのみインスタンス作成できないように IAMポリシー制御させる
上記を実現させるための IAMポリシー例を紹介します。
前提
- Administrator のポリシーは AdministratorAccess (Administratorの IAMポリシーは考慮しない)
- User のポリシーを PowerUserAccess をベースに設計
- 東京リージョンの利用を想定
User の IAMポリシー
PowerUserAccessのAWS管理ポリシーをアタッチした上で、 追加で以下ポリシーを加えます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:ap-northeast-1::image/ami-*", "Condition": { "StringNotEqualsIfExists": { "ec2:ResourceTag/Owner": "Administrator" } } }, { "Effect": "Deny", "Action": [ "ec2:DeleteTags", "ec2:CreateTags" ], "Resource": "arn:aws:ec2:ap-northeast-1::image/ami-*", "Condition": { "StringLike": { "aws:RequestTag/Owner": "*" } } } ] }
Statement
内の要素を順番に説明します。
1. Owner:Administrator
タグの付いていないAMIからは起動しない
"Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:ap-northeast-1::image/ami-*", "Condition": { "StringNotEqualsIfExists": { "ec2:ResourceTag/Owner": "Administrator" } }
インスタンスの起動を以下のケース時に拒否します。
Owner
タグが付いていないときOwner
タグの値がAdministrator
以外のとき
2. Owner
タグを作成・削除できないようにする
"Effect": "Deny", "Action": [ "ec2:DeleteTags", "ec2:CreateTags" ], "Resource": "arn:aws:ec2:ap-northeast-1::image/ami-*", "Condition": { "StringLike": { "aws:RequestTag/Owner": "*" } }
前述のポリシーだけでは、 Owner:Administrator
タグを Userが自由に作成・削除できてしまうので、
望まない AMIも起動させられる可能性があります。
そこで Owner
タグを AMIに作成・削除できないようにポリシーを追加します。
動作確認
User に以下IAMポリシーを割り当てています。
ami-restriction
は先程のIAMポリシーです。
事前に Administratorで AMIを作成し、タグ付けします。
AMIの起動
Owner: Administrator
タグが付いた AMIからの起動ができました。
Owner: Administrator
タグが付いていない AMIから起動しようとすると以下のようなメッセージが出ます。
なにのアクションで拒否されたのか、以下のようにデコードしてみます。
( $message
にエンコードされているメッセージを入れます)
> aws sts decode-authorization-message --encoded-message $message | jq -r '.DecodedMessage' | jq -c '.context.action' "ec2:RunInstances"
ec2:RunInstances
のオペレーションが拒否されたことが分かりました。
タグ付け
Owner
タグを削除しようとすると以下のようなメッセージが出ます。
ec2:DeleteTags
が拒否されています。
> aws sts decode-authorization-message --encoded-message $message | jq -r '.DecodedMessage' | jq -c '.context.action' "ec2:DeleteTags"
Owner
タグを新規作成 or 値を書き換えしようとすると同じようにエラーになります。
ec2:CreateTags
が拒否されています。
> aws sts decode-authorization-message --encoded-message $message | jq -r '.DecodedMessage' | jq -c '.context.action' "ec2:CreateTags"
Owner
以外のタグは自由に編集可能です。
おわりに
特定のタグが付いたAMIからのみインスタンスを起動するためのIAMポリシーを設定 、挙動を確かめてみました。
なお、IAMのポリシー作成は ビジュアルエディタ を使うと簡単に設定できるので、 これを使って設計していくといいと思います。
少しでもどなたかのお役に立てば幸いです。