IAMポリシーで、特定のリソース/タグに限定してアクションを許可したい場合、どのように記載すればいいですか?

2022.12.22

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

この記事は アノテーション株式会社 AWS Technical Support Advent Calendar 2022 | Advent Calendar 2022 - Qiita 22日目の記事です。

困っていること

IAMポリシーで、以下のように RDS インスタンスについて、開始、停止、再起動するポリシーを記載しました。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds:StartDBInstance",
                "rds:StopDBInstance",
                "rds:RebootDBInstance"
            ],
            "Resource": "*"
        }
    ]
}

これについて、特定のリソースにだけアクションを許可するよう、制限を付与する要件があります。

その他、特定のタグが付与されたリソースにだけアクションを許可するよう、制限を付与する要件があります。

しかし、記載の仕方が分かりません。どのように記載すればいいですか?

どう対応すればいいの?

AWS サービスにおけるアクションには、リソースタイプと、条件キーという概念があります。

リソースタイプ

IAM ポリシーですと、Resource 句に記載するものとなります。

ここにはリソースの ARN を指定することができます。例えば、DB インスタンスの ARN の場合、以下のように指定します。

arn:aws:rds:ap-northeast-1:<AccoundID>:db:<InstanceName>

条件キー

IAM ポリシーですと、Condition 句に記載するものとなります。

この指定可否については、リソースタイプに大きく関わってきます(後述します)。

確認方法

例示として、RDS の StopInstances アクションの詳細を探す方法を紹介します。

始めに、RDS サービスにおけるアクションの一覧について、ドキュメントを参照します。

Amazon RDS のアクション、リソース、および条件キー - サービス認証リファレンス

こちらの、StopInstances アクションを探します。以下の記載が確認できます。

アクション 説明 アクセスレベル リソースタイプ (* 必須) 条件キー 依存アクション
StopDBInstance DB インスタンスを停止する許可を付与。 書き込み db*

リソースタイプの部分に db* という記載があります。こちらはドキュメントの末尾で確認ができます。

リソースタイプ ARN 条件キー
db arn:${Partition}:rds:${Region}:${Account}:db:${DbInstanceName} aws:ResourceTag/${TagKey}
rds:DatabaseClass
rds:DatabaseEngine
rds:DatabaseName
rds:MultiAz
rds:Piops
rds:StorageEncrypted
rds:StorageSize
rds:Vpc
rds:db-tag/${TagKey}

この場合、リソースタイプとして db の ARN が指定でき、併せて、条件キーでさらに絞り込みができます。

さて、条件キーの中にrds:db-tag/${TagKey}の記載が確認できます。

こちらは DB インスタンスに付与されているタグを示すため、タグで絞り込むことができるという意味になります。

上記を踏まえて、アクションを特定のタグ、及び、値が付与されたリソースに絞り込む記載方法は下記となります。

DB インスタンス名: test のみに絞り込みたいとき

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds:StartDBInstance",
                "rds:StopDBInstance",
                "rds:RebootDBInstance"
            ],
            "Resource": "arn:aws:rds:ap-northeast-1:<AccoundID>:db:test"
        }
    ]
}

例:タグ: TAG001 に 値: VALUE001 または VALUE002 が付与されているリソースに絞り込みたいとき

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "rds:StartDBInstance",
                "rds:StopDBInstance",
                "rds:RebootDBInstance"
            ],
            "Condition": {
                "StringEquals": {
                    "rds:db-tag/TAG001": [
                        "VALUE001",
                        "VALUE002"
                    ]
                }
            },
            "Resource": "*"
        }
    ]
}

参考資料

IAM と連携する AWS のサービス - AWS Identity and Access Management

IAM タグベース制限ポリシーを作成する