【AWS 権限運用】IAM ポリシー作成時、リソース指定をサポートしないアクションには注意しよう

記事タイトルとURLをコピーする

初めに

皆さん、こんにちは CS2 課の山﨑です。

今回は、 AWS IAM ポリシーで権限変更する際に注意するべき点を発見したため共有させていただきます。

結論

結論から述べると、IAMポリシーでリソース指定をサポートしないIAMアクションを許可する際は、リソース要素に「 * 」を指定しないと許可されないということです。

言葉だとわかりづらいですね。

実際にポリシーを書くと以下の通りになります。

s3:ListAllMyBuckets のリソース指定を 「*」にしなければいけません。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket-name",
                "arn:aws:s3:::example-bucket-name/*",
            ]
        }
    ]
}

リソース指定をサポートしないIAMアクションとは

特定の単一リソースではなく、アカウント全体やサービス全体の設定に対して実行されるアクション(操作)のことで、 IAMポリシーでリソースARN(Amazon Resource Name)を指定することができないアクションのことを指します。

リソース指定をサポートしないIAMアクションは、意外とたくさんあり、S3 のアクションの ListAllMyBuckets アクションもその一つになります。 状況として、特定のリソースに対してのみの動作を許可したい場合にも、「*」で許可しないといけない場合があります。 ※回避方法についても、以下に記載しております

他にもたくさんありますので、以下のAWS 公式ドキュメントをご参照ください。

docs.aws.amazon.com

設定例

一般的なリソース指定をサポートするアクション、(例 : s3:GetObject) などは、以下のように設定しますよね。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket-name",
                "arn:aws:s3:::example-bucket-name/*",
            ]
        }
    ]
}

上記の場合、example-bucket-name という名前のバケットに対してのみ、GetObject が可能となります。

一方で、上記で述べた ListAllMyBuckets のようなアクションで、一部のバケットのみ、List させたいと思い、誤って以下のように設定してしまった場合、下記の画像のようにエラーが起こってしまいます。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:ListAllMyBuckets"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket-name",
                "arn:aws:s3:::example-bucket-name/*"
            ]
        }
    ]
}

厄介なのは、ポリシー作成時にエラーとして表示されず、ポリシーが作成できてしまうんですよね…

正しくは、以下のようにリソース指定をサポートしているアクションとはステートメントを分けて記載する必要があります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListAllMyBuckets"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::example-bucket-name",
                "arn:aws:s3:::example-bucket-name/*",
            ]
        }
    ]
}

リソース指定を絞りたい場合

ただ上記の場合、すべてのバケットをリストさせているように、最小権限の法則に則っていないことを懸念する方もいらっしゃると思います。 条件キー(Condition)で絞ることができないか、検討してみましょう。

  • ※”s3:ListAllMyBuckets” の場合、Condition 句で指定することができません。

  • "s3:ListBucket" を組み合わせましょう。

例えば、glue:CreateCrawler も、リソース指定を「*」にする必要がありますが、以下のように設定することで、Name tag を持った、クローラーのみを作成することが可能になります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "glue:CreateCrawler",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:RequestTag/Name": "hogehoge-Crawler"
                }
            }
        }
    ]
}

まとめ

今回は、AWS IAM で権限を運用する際の注意点についてブログにしてみました。 上記でも述べましたが、2025年12月現在リソース指定をサポートしないアクションについて誤ってリソース指定をした状態でも IAM ポリシーは作成できます。

いざ、該当のアクションをする際になって権限不足によって作業ができないことが起こりえますので、事前に該当のアクションがリソース指定があるのかないのかを確認・検証してみることが大事になってきますね。

docs.aws.amazon.com