IAMポリシーで、特定のリソース/タグに限定してアクションを許可したい場合、どのように記載すればいいですか?
この記事は アノテーション株式会社 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": "*" } ] }