特定のタグが付いたAMIからのみEC2インスタンスを起動するためのIAMポリシー

2020.07.09

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

はじめに

img

  • 管理者(Administrator) が利用者(User)向けに AMIを作成
    • AMIには Owner: Administrator タグを付ける
  • 利用者(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ポリシーです。

img

事前に Administratorで AMIを作成し、タグ付けします。

img

AMIの起動

Owner: Administrator タグが付いた AMIからの起動ができました。

img

Owner: Administrator タグが付いていない AMIから起動しようとすると以下のようなメッセージが出ます。

img

なにのアクションで拒否されたのか、以下のようにデコードしてみます。 ( $message にエンコードされているメッセージを入れます)

> aws sts decode-authorization-message --encoded-message $message | jq -r '.DecodedMessage'  | jq -c '.context.action'
"ec2:RunInstances"

ec2:RunInstances のオペレーションが拒否されたことが分かりました。

タグ付け

Owner タグを削除しようとすると以下のようなメッセージが出ます。 ec2:DeleteTags が拒否されています。

img

> aws sts decode-authorization-message --encoded-message $message | jq -r '.DecodedMessage'  | jq -c '.context.action'
"ec2:DeleteTags"

Owner タグを新規作成 or 値を書き換えしようとすると同じようにエラーになります。 ec2:CreateTags が拒否されています。

img

> aws sts decode-authorization-message --encoded-message $message | jq -r '.DecodedMessage'  | jq -c '.context.action'
"ec2:CreateTags"

Owner 以外のタグは自由に編集可能です。

img

おわりに

特定のタグが付いたAMIからのみインスタンスを起動するためのIAMポリシーを設定 、挙動を確かめてみました。

なお、IAMのポリシー作成は ビジュアルエディタ を使うと簡単に設定できるので、 これを使って設計していくといいと思います。

少しでもどなたかのお役に立てば幸いです。

参考