AWSアカウントプリンシパルにIAMユーザーとIAMロールは含まれるのか
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つでも明示的な拒否がある場合、リクエストは拒否される
- 同一アカウント内でのアクセスでは、アイデンティティベースのポリシーとリソースベースのポリシーのいずれかに明示的な許可があれば、リクエストは許可される(※ただし、IAMロール信頼ポリシーとKMSキーポリシーは例外で、リソースベースのポリシーに必ず許可が必要)
- クロスアカウントのアクセスでは、アイデンティティベースのポリシーとリソースベースのポリシーの両方に明示的な許可があれば、リクエストは許可される
参考:ポリシーの評価論理 - AWS Identity and Access Management
IAMユーザーとIAMロールは含まれるのか
各ポリシーでの許可の状態と、評価結果を表にまとめました。リソースベースのポリシーでは、対象のプリンシパルがユーザー/ロールかアカウントかを区別しています。結果は、対象のリソースがIAMロールかそれ以外のほとんどのリソース(KMSキーは除く)かで列を分けています。
アカウント構成 | IDベースのポリシー | リソースベースのポリシー | 結果(ほとんどのリソース) | 結果(IAMロール) |
---|---|---|---|---|
同一アカウント | なし | なし | 拒否 | 拒否 |
同一アカウント | なし | 許可(ユーザー/ロール) | 許可 | 許可 |
同一アカウント | なし | 許可(アカウント) | 拒否 | 拒否 |
同一アカウント | 許可 | なし | 許可 | 拒否 |
同一アカウント | 許可 | 許可(ユーザー/ロール) | 許可 | 許可 |
同一アカウント | 許可 | 許可(アカウント) | 許可 | 許可 |
同一アカウント | 許可 | 拒否(ユーザー/ロール) | 拒否 | 拒否 |
同一アカウント | 許可 | 拒否(アカウント) | 拒否 | 拒否 |
クロスアカウント | 許可 | 許可(ユーザー/ロール) | 許可 | 許可 |
クロスアカウント | 許可 | 許可(アカウント) | 許可 | 許可 |
参考:
- Principal 要素で IAM ロールを指定するのと IAM ロールを引き受けたセッションを指定するのは何が違うのか? 72 個のパターンで考えてみた | DevelopersIO
- [仕様変更] IAM ロール信頼ポリシーの挙動が変更になり IAM ロールの「暗黙的な自己信頼」がなくなりました | DevelopersIO
結論
AWSアカウントプリンシパルに、IAMユーザーとIAMロールは…
- 同一アカウントでリソースベースのポリシーのみで許可を与える文脈では、含まれない
- 明示的な拒否の文脈では、含まれる
- クロスアカウントで許可を与える文脈では、含まれる
でした!
メモ
- どうにも「含まれるか含まれないか」のような考え方がよくない気がしている
- 「アカウントプリンシパルに対して許可を与えると、そのアカウント内のアイデンティティベースのポリシーによる評価が有効化される(ただし、同一アカウント内のほとんどのリソースではデフォルトでこれが有効であるためアカウントプリンシパルに対する許可には意味がなく、信頼ポリシー、キーポリシーおよびクロスアカウントアクセスではデフォルトでこれが無効であるためアカウントプリンシパルに対する許可には意味がある)」という考え方で納得できそう
- AWSサービスが含まれるのかどうか未確認
- KMSキーポリシーでどうなるのか未確認
Discussion