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