ヘッダー画像

【AWS】応用的なIAMポリシーのjsonの書き方

IAM
投稿 2025年1月26日 最終更新 2025年1月26日 専門用語多め

前置き

今回はIAMポリシーの応用的な書き方をご紹介していきます。

前回の基本的な書き方の続きです。

条件

IAMポリシーには、適用する条件を指定できます。

AWS公式のIAM JSON ポリシー要素Conditionにも記載されていますが、構文的には下記のような形になっています。

{
  "Condition": {
    "条件演算子": {
      "条件キー": "条件値"
    }
  }
}

条件演算子

AWS公式のIAM JSON ポリシー要素: 条件演算子に記載されている情報の文字列演算子の一覧を簡単にまとめてみました。

文字列条件演算子 説明
StringEquals 大文字と小文字の区別ありの完全一致する
StringNotEquals 大文字と小文字の区別ありの完全一致しない
StringEqualsIgnoreCase 大文字と小文字の区別なしの完全一致する
StringNotEqualsIgnoreCase 大文字と小文字の区別なしの完全一致しない
StringLike 大文字と小文字の区別ありで、ワイルドカード(* or ?)での部分一致する
StringNotLike 大文字と小文字の区別ありで、ワイルドカード(* or ?)での部分一致しない

AWS公式ページに書いてある通り、文字列以外にも下記のような条件演算子が存在するため、状況にあった演算子を使えます。

  • 数値条件演算子
  • 日付条件演算子
  • プール条件演算子
  • バイナリ条件演算子
  • IPアドレス条件演算子
  • Amazon リソースネーム (ARN)条件演算子
  • IfExists条件演算子
  • 条件キーの有無をチェックする条件演算子

条件キーと条件値

条件キーはあらかじめ決められたキーが入り、AWS全体で使用できるグローバルなキーと、サービス固有のキーが存在します。

条件値には文字列や数値等の固定値や、のちに出てくるポリシー変数を設定します。

例えば、「env」というタグに「prod」が設定されているLambdaだけ、操作不可にさせるポリシーは下記の通りです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowNotProd",
      "Effect": "Allow",
      "Action": "lambda:*",
      "Resource": "*",
      "Condition": {
        "Null": {
          "aws:ResourceTag/env": true
        },
        "StringNotEqualsIfExists": {
          "aws:ResourceTag/env": "prod"
        }
      }
    }
  ]
}

こうすることで、タグが付与されていない or envタグがprodではないLambdaが触れます。

ポリシー変数

ResourceやConditionには、${}でくくった変数を使えます。

例えば、自信のIAMユーザー名のS3バケットだけを触れるようなポリシーは、下記のようになります。

S3の「work」バケット直下にある自身のオブジェクトのみを操作可能にするポリシーです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowMyWork",
      "Effect": "Allow",
      "Action": "s3:*Object",
      "Resource": "arn:aws:s3:::work/${aws:username}/*"
    }
  ]
}

IAMユーザーが「taro.s3」だった場合

workバケット
┣taro.s3 ← ここがResourceで指定した箇所
┣jiro.s3
┗saburo.s3

備考

Version「2012-10-17」からポリシー変数が導入されたため、「2012-10-17」より古いVersionを指定すると使用できません。
また、大文字小文字は区別されないため、${aws:username} も ${aws:UserName} も一緒です。

使える変数の一覧がいまいちAWS公式で見つけられず、何が使えるのかを調べるのが大変です…。

使用例(MFA強制ポリシー)

上記のConditionとポリシー変数を使用した例を紹介します。

下記はMFAを強制させるためのIAMポリシーです。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowMFADevice",
      "Effect": "Allow",
      "Action": "iam:*MFADevice*",
      "Resource": [
        "arn:aws:iam::123456789012:mfa/*",
        "arn:aws:iam::123456789012:sms-mfa/*",
        "arn:aws:iam::123456789012:user/${aws:username}"
      ]
    },
    {
      "Sid": "DenyNoMFA",
      "Effect": "Deny",
      "NotAction": [
        "iam:*MFADevice*",
        "iam:ChangePassword",
        "iam:GetAccountPasswordPolicy"
      ],
      "Resource": "*",
      "Condition": {
        "BoolIfExists": {
          "aws:MultiFactorAuthPresent": "false"
        }
      }
    }
  ]
}

PowerUserAccess等のIAMは触れない権限と一緒に使う想定です。

簡単に説明すると下記のような感じです。

Sid 説明
AllowMFADevice IAMで自身のMFAを設定する権限を付与
DenyNoMFA まだMFAを設定していない場合は、MFAを設定する以外の権限を与えない

まとめ

IAMポリシーの応用的なJsonの書き方を紹介しました。

調べれば調べるほど使い方があって、まだまだ使いこなすのは難しいです…。

以上、ここまで見ていただきありがとうございます。

皆さまの快適な開発ライフに、ほんの少しでもお役に立てれば幸いです。

コメント

この記事のコメントはありません。