はじめに
「最小特権アクセス許可を適用する」ための最もシンプルなやり方としては、
IAM ポリシーの「Resource 句」で対象リソースのArnを指定することだと思います。
ただ、AWSリファレンス内の「リソースタイプ列」が空欄の場合は、
「Resource句」での制御ができるのでしょうか。
本記事では「リソースタイプ列」が空欄となっているアクションに対して、
リソース句での制御可否を確認した記事となります。
結論
リソースタイプが空欄のアクションに対しては Resource 要素で全てのリソースを指定する必要があります。
例としてリソースタイプが空欄のアクションである「s3:ListAllMyBuckets」に対しては、
以下のように「"Resource": "*"」を指定する必要がありました。
{
"Sid": "",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
}
確認方法
■AWS 公式ページ(Amazon S3 のアクション、リソース、条件キー - Amazon S3 で定義されるアクション)より
[アクション] テーブルの [リソースタイプ] 列は、各アクションがリソースレベルの許可をサポートしているかどうかを示します。この列に値がない場合は、ポリシーステートメントの Resource 要素で、ポリシーが適用されるすべてのリソース (「*」) を指定する必要があります。
上記の通り、公式ページに明記が存在していました。
また、リソースタイプ列が空欄なアクションをResource 句で制御しようとしましたが、
そのアクションの実行は拒否されました。
アクションがサポートしているリソースタイプの指定方法ではないため、
許可されない模様です。
※許可されない=拒否ではなく、Allow 設定とならず暗黙的な拒否となる
※暗黙的な拒否については後述
Resource 要素が空欄/記載有アクションを1つのポリシーに設定する方法
Resource 句で制御可能な形式が多種存在しているアクションは、
対応している Resource 句ごとにStatement を複数指定する必要があります。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListAllMyBuckets", "s3:GetBucketLocation"],
"Resource": "arn:aws:s3:::*"
},
{
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::BUCKET-NAME",
"Condition": {
"StringLike": { "s3:prefix": ["", "home/", "home/${aws:username}/"] }
}
},
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::BUCKET-NAME/home/${aws:username}",
"arn:aws:s3:::BUCKET-NAME/home/${aws:username}/*"
]
}
]
}
"Resource": "arn:aws:s3:::*"
:Resource句で制御しているようにみえるが「"Resource":"*"」と同義
※引用元:IAM JSON ポリシー要素 Statement
暗黙的な拒否について
IAM ポリシー内で明示的に Deny も Allow も記載していない状態を指します。
IAM ポリシーは、デフォルトでアクセスが拒否される仕様のため、
アクションを実行するには明示的に許可を記載する必要があります。
明示的な拒否と暗黙的な拒否と明示的な許可の優先順位
IAM ポリシーでは以下の順番で設定に優先順位があります。
明示的な拒否と明示的な許可をそれぞれ同じアクションを対象に設定していた場合、
明示的な拒否が優先され、アクションが実行できないです。
- 明示的な拒否("Effect": "Deny")
- 明示的な許可("Effect": "Allow")
- 暗黙的な拒否(記載なし)
終わりに
IAM ポリシー制御で悩んでいる人の助けになれば幸いです。
参考
・ポリシーの評価論理 - 明示的な拒否と暗黙的な拒否の違い
・IAM JSON ポリシー要素 Statement
・(Amazon S3 のアクション、リソース、条件キー - Amazon S3 で定義されるアクション)