AWS JSON ポリシーの要素: NotPrincipal
NotPrincipal
要素を使用すると、NotPrincipal
要素で指定された IAM ユーザー、フェデレーションユーザー、IAM ロール、AWS アカウント、AWS のサービスなどのプリンシパル以外のすべてのプリンシパルへのアクセスを拒否できます。
これは、VPC エンドポイントなど、一部の AWS のサービスのリソースベースポリシーで使用できます。リソースベースのポリシーは、リソースに直接埋め込むポリシーです。IAM のアイデンティティベースのポリシーでも IAM ロールの信頼ポリシーでも NotPrincipal
要素は使用できません。
NotPrincipal
は "Effect":"Deny"
とともに使用する必要があります。"Effect":"Allow"
とともに使用することはサポートされていません。
重要
NotPrincipal
の使用が必要になるシナリオはほとんどありません。NotPrincipal
の使用を決定する前に、他の認可オプションを検討するようお勧めします。NotPrincipal
を使用すると、複数のポリシータイプの影響をトラブルシューティングすることが難しい場合があります。代わりに ARN 条件演算子で aws:PrincipalArn
コンテキストキーを使用することをおすすめします。詳細については、「すべてのプリンシパル」を参照してください。
Deny
とともに NotPrincipal
を指定する
NotPrincipal
で Deny
を使用する場合は、拒否されていないプリンシパルのアカウントの ARN も設定する必要があります。それ以外の場合、ポリシーでは、そのプリンシパルを含むアカウント全体へのアクセスが拒否されます。ポリシーに含めるサービスに応じて、AWS は最初にアカウントを確認し、次にユーザーを確認する場合があります。引き受けたロールのユーザー (ロールを使用しているユーザー) を評価する場合、AWS は最初にアカウントを確認し、次にロール、最後にロールを引き受けたユーザーを確認する場合があります。ロールを引き受けたユーザーは、ユーザーがロールを引き受けたときに指定されたロールセッション名で識別されます。したがって、ユーザーのアカウントの ARN、またはロールの ARN とそのロールを含むアカウントの ARN の両方を、明示的に含めることを強くお勧めします。
重要
アクセス許可の境界ポリシーがアタッチされている IAM ユーザーまたはロールに対する Deny
効果を持つ NotPrincipal
ポリシー要素を含むリソースベースのポリシーステートメントは使用しないでください。Deny
効果のある NotPrincipal
要素は、NotPrincipal
要素で指定されている値に関係なく、アクセス許可の境界ポリシーがアタッチされている IAM プリンシパルを常に拒否します。これにより、本来であればリソースにアクセスできたはずの IAM ユーザーまたはロールの一部がアクセスを失うことになります。リソースベースのポリシーステートメントを変更して、NotPrincipal
要素ではなく aws:PrincipalArn コンテキストキーで条件演算子 ArnNotEquals を使用してアクセスを制限することをおすすめします。アクセス許可の境界の詳細については、「IAM エンティティのアクセス許可境界」を参照してください。
注記
ベストプラクティスとして、アカウントの ARN をポリシーに含めます。一部のサービスではアカウント ARN が必要ですが、すべてのケースで必要になるわけではありません。必要なARNのない既存のポリシーは引き続き機能しますが、これらのサービスを含む新しいポリシーはこの要件を満たす必要があります。IAM はこれらのサービスを追跡しないため、常にアカウント ARN を含めることをお勧めします。
以下の例では、同じポリシーステートメント内で NotPrincipal
と "Effect":
"Deny"
を効果的に使用する方法を示しています。
例 同じまたは異なるアカウントの IAM ユーザーの例
以下の例では、444455556666 という AWS アカウント に含まれる Bob という名前のユーザーを除いて、すべてのプリンシパルによるリソースへのアクセスが明示的に拒否されています。ベストプラクティスとして、NotPrincipal
要素には、Bob というユーザーの ARN と、Bob が属する AWS アカウント (arn:aws:iam::444455556666:root
) の ARN が両方含まれています。NotPrincipal
要素に含まれているのが Bob の ARN のみであれば、このポリシーの結果として、ユーザー Bob を含む AWS アカウント のアクセスが明示的に拒否されることがあります。場合によっては、ユーザーは、親アカウントを超えるアクセス許可を得ることができないため、Bob のアカウントが明示的にアクセスを拒否されると、Bob もリソースにアクセスできなくなる可能性があります。
この例は、同じまたは異なる AWS アカウント (444455556666 ではない) のリソースにアタッチされているリソースベースのポリシー内でポリシーステートメントに含まれている場合、意図したとおりに動作します。この例自体は Bob にアクセス許可を付与しておらず、明示的に拒否するプリンシパルのリストから Bob を除外しているだけです。リソースへのアクセスを Bob に許可するには、別のポリシーステートメントで "Effect":
"Allow"
を使用して明示的にアクセスを許可する必要があります。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Deny", "NotPrincipal": {"AWS": [ "arn:aws:iam::444455556666:user/Bob", "arn:aws:iam::444455556666:root" ]}, "Action": "s3:*", "Resource": [ "arn:aws:s3:::BUCKETNAME", "arn:aws:s3:::BUCKETNAME/*" ] }] }
例 同じまたは異なるアカウントの IAM ロールの例
以下の例では、444455556666 という AWS アカウント に含まれる cross-account-audit-app という名前の引き受けたロールユーザーを除いて、すべてのプリンシパルによるリソースへのアクセスが明示的に拒否されています。ベストプラクティスとして、NotPrincipal
要素には、引き受けたロールユーザー (cross-account-audit-app)、ロール (cross-account-read-only-role)、ロールが属する AWS アカウント (444455556666) の ARN が含まれています。ロールの ARN が NotPrincipal
要素に含まれていなければ、このポリシーの効果としては、このロールに対して、アクセスを明示的に拒否することになります。同様に、ロールが属する AWS アカウント の ARN が NotPrincipal
エレメントに含まれていなければ、このポリシーの結果として、AWS アカウント とそのアカウントに属するすべてのエンティティへのアクセスは明示的に拒否されることがあります。場合によっては、引き受けたロールユーザーは、親ロールを超えるアクセス許可を得ることができず、ロールは、親である AWS アカウント を超えるアクセス許可を得ることができないため、ロールまたはアカウントが明示的にアクセスを拒否された場合、引き受けたロールユーザーはリソースにアクセスできなくなる可能性があります。
この例は、別の AWS アカウント (444455556666 ではない) のリソースにアタッチされているリソースベースのポリシー内でポリシーステートメントに含まれている場合、意図したとおりに動作します。この例自体は引き受けたロールユーザー (cross-account-audit-app) にアクセスを許可しておらず、明示的に拒否するプリンシパルのリストから cross-account-audit-app を除外しているだけです。リソースへのアクセス許可を cross-account-audit-app に付与するには、別のポリシーステートメントで "Effect":
"Allow"
を使用して明示的にアクセスを許可する必要があります。
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Deny", "NotPrincipal": {"AWS": [ "arn:aws:sts::444455556666:assumed-role/cross-account-read-only-role/cross-account-audit-app", "arn:aws:iam::444455556666:role/cross-account-read-only-role", "arn:aws:iam::444455556666:root" ]}, "Action": "s3:*", "Resource": [ "arn:aws:s3:::Bucket_AccountAudit", "arn:aws:s3:::Bucket_AccountAudit/*" ] }] }
NotPrincipal
要素で引き受けたロールセッションを指定する場合、ワイルドカード (*) を使用して「すべてのセッション」を意味することはできません。プリンシパルは常に特定のセッションに名前を付ける必要があります。