メニュー
AWS Identity and Access Management
ユーザーガイド

IAM JSON ポリシーエレメント: NotPrincipal

NotPrincipal エレメントは、プリンシパルのリストに対して例外を指定する場合に使用します。たとえば、NotPrincipal エレメント内で指定されているプリンシパルを除くすべてのプリンシパルによるアクセスを拒否することもできますNotPrincipal を指定する場合の構文は、IAM JSON ポリシーエレメント: Principal を指定する場合と同じです。

NotPrincipal を使用して、NotPrincipal エレメント内で指定されているものを除くすべてのプリンシパルを許可することもできますが、この指定方法はお勧めできません。

警告

"Effect": "Allow" と同じポリシーステートメント内で NotPrincipal を使用すると、指定のプリンシパルを除き、匿名の(承認されていない)ユーザーを含めたすべてのプリンシパルに、このポリシーステートメントで指定されているアクセス許可が付与されます。NotPrincipal は、"Effect": "Allow" と同じポリシーステートメント内で使用しないことを強くお勧めします。

"Effect": "Deny" と同じポリシーステートメント内で NotPrincipal を使用すると、指定のプリンシパルを除くすべてのプリンシパルに、このポリシーステートメントで指定されているアクセス許可が明示的に拒否されます。これにより、一種の "ホワイトリスト" を実装できます。AWS アカウントによるアクセスを明示的に拒否すると、そのアカウントに含まれるすべてのユーザーのアクセスが拒否されます。

リソースベースのポリシーで、AWS アカウントのプリンシパルのみを指定する NotPrincipal エレメントと "Effect": "Deny" を組み合わせて使用すると、そのプリンシパルを含むアカウントに対するアクセスはポリシーによって拒否される可能性があり、その結果、指定したプリンシパルからリソースにアクセスできない場合があります。この状況がどのように発生するかを理解するには、次のセクションの例を参照してください。

重要

NotPrincipal の使用が必要になるシナリオは非常に少ないため、NotPrincipal の使用を決定する前に、他の承認オプションを検討するようお勧めします。

"Effect": "Deny" と同じポリシーステートメント内で NotPrincipal を指定する

NotPrincipal エレメント内にプリンシパルを指定する場合は、IAM JSON ポリシーエレメント: Principal エレメント内にプリンシパルを指定する場合と同じ構文を使用します。ただし、特に複数の AWS アカウントを扱っている場合に同じポリシーステートメント内で NotPrincipal"Effect": "Deny" を組み合わせると、意図した効果を得ることが難しい場合があります。

重要

DenyNotPrincipal の結合は、AWS がプリンシパルを評価する順序によって違いが発生する唯一の時間です。AWS は "トップダウン" でプリンシパルを内部的に評価します。つまり、AWS はアカウントを最初に確認してから、ユーザーを確認します。引き受けたロールのユーザー (IAM ユーザーではなくロールを使用しているユーザー) を評価する場合、AWS は最初にアカウント、次にロール、最後にロールを引き受けたユーザーを確認します。ロールを引き受けたユーザーは、ユーザーがロールを引き受けたときに指定されたロールセッション名で識別されます。

通常、この順序によってポリシーの評価結果に影響はありません。ただし、Deny および NotPrincipal の両方とも使用する場合、評価順序では指定されたプリンシパルに関連付けられたエンティティの ARN を含めるよう明示的に要求されます。たとえば、ユーザーを指定するには、ユーザーのアカウントの ARN を明示的に含める必要があります。ロールを引き受けたユーザーを指定するには、ロールの ARN と、ロールを含むアカウントの ARN の両方を含める必要があります。

以下の例では、同じポリシーステートメント内で NotPrincipal"Effect": "Deny" を効果的に使用する方法を示しています。

例 1: 同じまたは異なるアカウントの IAM ユーザー

次の例では、444455556666 という AWS アカウントに含まれる Bob という名前のユーザーを除いて、すべてのプリンシパルによるリソースへのアクセスが明示的に拒否されています。意図した効果を得るために、NotPrincipal エレメントには、Bob というユーザーと、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/*" ] }] }

例 2: 同じまたは異なるアカウントの 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 アカウントを超えるアクセス許可を得ることができないため、ロールまたはアカウントが明示的にアクセスを拒否された場合、引き受けたロールユーザーはリソースにアクセスできません。

この例は、444455556666 ではなく別の AWS アカウントのリソースにアタッチされているリソースベースのポリシー内でポリシーステートメントに含まれている場合、意図したとおりに動作します。この例自体は引き受けたロールユーザー(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/*" ] }] }