🫠

AWSアカウントプリンシパルにIAMユーザーとIAMロールは含まれるのか

2024/05/25に公開

Q. AWSアカウントプリンシパルにはIAMユーザーとIAMロールが含まれるのですか? 例えば、AWSアカウントプリンシパルに許可を与えたら、それはそのアカウント内のIAMユーザーとIAMロールに許可を与えたという意味でいいんですか?

A. どちらとも言えない。

AWSアカウントプリンシパルとは

AWSアカウントプリンシパルとは、IAMのリソースベースのポリシーの Principal 要素で以下のように記載したときに指定されるものです。

"Principal": { "AWS": "arn:aws:iam::123456789012:root" }
"Principal": { "AWS": "123456789012" }

これらはどちらで記載しても同じように動作します。ルートユーザーのARNを使用していますが、AWSアカウントプリンシパルはルートユーザーのみを指定するものではなく、AWSアカウントを指定するものです。

参考:AWS JSON ポリシーの要素: Principal - AWS Identity and Access Management

問題は、その「AWSアカウント」には何が含まれるのか、です。そのアカウント内のIAMユーザーとIAMロールが含まれるということでよいでしょうか。リソースベースのポリシーでAWSアカウントプリンシパルを指定したとき、そのアカウントに所属するIAMユーザーとIAMロール(IAMロールセッション)のリクエストはどう評価されるのでしょうか。

IAMポリシー評価論理の基本

結果を示す前に、リソースベースのポリシーに関するIAMポリシー評価論理の基本をおさらいしておきましょう。

  1. 評価されるポリシーのどこかに1つでも明示的な拒否がある場合、リクエストは拒否される
  2. 同一アカウント内でのアクセスでは、アイデンティティベースのポリシーとリソースベースのポリシーのいずれかに明示的な許可があれば、リクエストは許可される(※ただし、IAMロール信頼ポリシーとKMSキーポリシーは例外で、リソースベースのポリシーに必ず許可が必要)
  3. クロスアカウントのアクセスでは、アイデンティティベースのポリシーとリソースベースのポリシーの両方に明示的な許可があれば、リクエストは許可される

参考:ポリシーの評価論理 - AWS Identity and Access Management

IAMユーザーとIAMロールは含まれるのか

各ポリシーでの許可の状態と、評価結果を表にまとめました。リソースベースのポリシーでは、対象のプリンシパルがユーザー/ロールかアカウントかを区別しています。結果は、対象のリソースがIAMロールかそれ以外のほとんどのリソース(KMSキーは除く)かで列を分けています。

アカウント構成 IDベースのポリシー リソースベースのポリシー 結果(ほとんどのリソース) 結果(IAMロール)
同一アカウント なし なし 拒否 拒否
同一アカウント なし 許可(ユーザー/ロール) 許可 許可
同一アカウント なし 許可(アカウント) 拒否 拒否
同一アカウント 許可 なし 許可 拒否
同一アカウント 許可 許可(ユーザー/ロール) 許可 許可
同一アカウント 許可 許可(アカウント) 許可 許可
同一アカウント 許可 拒否(ユーザー/ロール) 拒否 拒否
同一アカウント 許可 拒否(アカウント) 拒否 拒否
クロスアカウント 許可 許可(ユーザー/ロール) 許可 許可
クロスアカウント 許可 許可(アカウント) 許可 許可

参考:

結論

AWSアカウントプリンシパルに、IAMユーザーとIAMロールは…

  • 同一アカウントでリソースベースのポリシーのみで許可を与える文脈では、含まれない
  • 明示的な拒否の文脈では、含まれる
  • クロスアカウントで許可を与える文脈では、含まれる

でした!

メモ

  • どうにも「含まれるか含まれないか」のような考え方がよくない気がしている
    • 「アカウントプリンシパルに対して許可を与えると、そのアカウント内のアイデンティティベースのポリシーによる評価が有効化される(ただし、同一アカウント内のほとんどのリソースではデフォルトでこれが有効であるためアカウントプリンシパルに対する許可には意味がなく、信頼ポリシー、キーポリシーおよびクロスアカウントアクセスではデフォルトでこれが無効であるためアカウントプリンシパルに対する許可には意味がある)」という考え方で納得できそう
  • AWSサービスが含まれるのかどうか未確認
  • KMSキーポリシーでどうなるのか未確認

Discussion