AWSのIAMポリシーについて、「~ベースのポリシー」といったりしますが、何があってその中ではどういう記載が必要なんだっけ?と迷うことがあったので、基本中の基本を考え直してみました。
アイデンティティベースのポリシー
{
"Version": "2012-10-17",
"Statement": {
"Sid": "1",
"Effect": "Allow",
"Action": "s3:ListBucket",
"Resource": "arn:aws:s3:::example_bucket"
}
}
リソースベースのポリシー
{
"Version": "2012-10-17",
"Statement": {
"Sid": "1",
"Effect": "Allow",
"Principal": {"AWS": ["arn:aws:iam::account-id:root"]},
"Action": "s3:*",
}
}
アイデンティティベースにはPrincipalがなくてResourceがある、リソースベースにはPrincipalがありResourceがないという違いがあります。
Principal
「Principal」は日本語で「主な」「主要な」といった意味があります。IAMポリシーにおいて、Principalはアクションを実行する主体を指します。
アイデンティティベースのポリシーはIAMユーザーやIAMロールにアタッチされるため、ポリシー自体には主体=PrincipalであるIAMユーザーやロールの記載が不要なのです。
逆にリソースベースのポリシーは、リソース側の視点から、この主体=Principalにアクションできるようにしてほしい/ほしくないという指示を出すため、Principalの記載が必要となります。
Resource
Resourceについても同様の考え方ができます。
アイデンティティベースのポリシーは、IAMユーザーやロールの視点から、このリソースに対してアクションできるようにしてほしい/ほしくないという指示を出すため、Resourceの記載が必要です。
逆にリソースベースのポリシーは、S3バケットなどのリソースにアタッチされるため、ポリシー自体にはResourceの記載が不要なのです。
ただ、明示的に対象リソースを指定することもよくあります。
まとめ
「~ベース」というのは、アタッチする対象を指しており、ポリシーのアクションが誰の立場から行われるものなのかを表現したものなんですね。
改めて整理できました。