
特定のタグが付いたAMIからのみEC2インスタンスを起動するためのIAMポリシー
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに

- 管理者(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のポリシー作成は ビジュアルエディタ を使うと簡単に設定できるので、 これを使って設計していくといいと思います。
少しでもどなたかのお役に立てば幸いです。






