プリンシパル アクセス境界(PAB)ポリシーを使用すると、プリンシパルがアクセスできるリソースを制限できます。
たとえば、プリンシパル アクセス境界ポリシーを使用して、プリンシパルが他の組織のリソースにアクセスできないようにすると、フィッシング攻撃やデータの引き出しを防ぐことができます。
Identity and Access Management(IAM)が提供する他のタイプのアクセス制御ポリシーについては、ポリシーの種類をご覧ください。
プリンシパル アクセス境界ポリシーの仕組み
デフォルトでは、プリンシパルはすべての Google Cloud リソースにアクセスできます。つまり、プリンシパルがリソースに対する権限を持ち、その権限が拒否されていなければ、プリンシパルはリソースにアクセスできます。
プリンシパル アクセス境界ポリシーを使用すると、プリンシパルがアクセスできるリソースを制限できます。プリンシパル アクセス境界ポリシーによってプリンシパルがリソースにアクセスできなくなった場合、付与されたロールに関係なく、そのリソースへのアクセスが制限されます。
プリンシパルがアクセス権のないリソースにアクセスしようとすると、プリンシパル アクセス境界ポリシーによって Identity and Access Management(IAM)の権限の一部がブロックされます。ブロックされる権限の詳細については、プリンシパル アクセス境界でブロックできる権限をご覧ください。
プリンシパル アクセス境界ポリシーは、プリンシパル アクセス境界ルールで構成されます。各プリンシパル アクセス境界ルールは、影響を受けるプリンシパルがアクセスできる一連のリソースを定義します。組織で作成できるプリンシパルのアクセス境界ポリシーは最大 1,000 個です。
プリンシパル アクセス境界ポリシーを作成したら、ポリシー バインディングを作成して、ポリシーをプリンシパルのセットに適用します。
プリンシパルは、1 つ以上のプリンシパル アクセス境界ポリシーの対象にすることができます。各プリンシパルは、これらのポリシーにリストされているリソースにのみアクセスできます。他のすべてのリソースの場合、そのリソースに対するプリンシパルのアクセスは、そのリソースに対するプリンシパルにロールを付与しても制限されます。
プリンシパル アクセス境界ポリシーはリソースではなくプリンシパルに関連付けられているため、プリンシパルが所有していないリソースに対するアクセスも禁止できます。たとえば、次のシナリオについて考えてみましょう。
- プリンシパル Tal(
tal@altostrat.com
)は、Google Workspace 組織altostrat.com
のメンバーです。 - Tal には、別の組織
cymbalgroup.com
の Cloud Storage バケットに対するストレージ管理者(roles/storage.admin
)ロールが付与されています。このロールには、バケット内のオブジェクトを表示するために必要なstorage.objects.get
権限が含まれています。 cymbalgroup.com
には、Tal がstorage.objects.get
権限を使用できないようにする拒否ポリシーはありません。
許可ポリシーと拒否ポリシーだけでは、altostrat.com
は Tal によるこの外部バケット内のオブジェクトの表示を防ぐことはできません。altostrat.com
プリンシパルにはバケットの許可ポリシーを編集する権限がないため、Tal のロールを取り消すことはできません。また、cymbalgroup.com
に拒否ポリシーを作成する権限もないため、拒否ポリシーを使用して Tal によるバケットへのアクセスを禁止することもできません。
ただし、プリンシパル アクセス境界ポリシーを使用すると、altostrat.com
管理者は、Tal による cymbalgroup.com
バケット内のオブジェクトまたは altostrat.com
外の任意のバケット内のオブジェクトの表示を防ぐことができます。これを行うには、管理者は、altostrat.com
プリンシパルが altostrat.com
のリソースにのみアクセスできるようにするプリンシパル アクセス境界ポリシーを作成します。次に、ポリシー バインディングを作成して、このポリシーを組織 altostrat.com
内のすべてのプリンシパルに適用します。このポリシーが適用されると、Tal はバケットにストレージ管理者ロールが付与されていても、cymbalgroup.com
バケット内のオブジェクトを表示できなくなります。
フェイルオープンの評価
プリンシパル アクセス境界ポリシーのプレビュー リリース中は、プリンシパル アクセス境界ポリシーはフェイルオープンになります。つまり、IAM がプリンシパル アクセス境界ポリシーを評価できない場合、プリンシパル アクセス境界ポリシーは無視され、関連する許可ポリシーと拒否ポリシーの評価に進みます。
プリンシパル アクセス境界ポリシーによってブロックされる権限
プリンシパルがアクセス権のないリソースにアクセスしようとすると、プリンシパル アクセス境界ポリシーにより、プリンシパルは、リソースにアクセスするための Identity and Access Management(IAM)権限の一部(すべてではありません)を使用できなくなります。
プリンシパル アクセス境界ポリシーが権限をブロックすると、IAM はその権限に対してプリンシパル アクセス境界ポリシーを適用します。つまり、リソースにアクセスする資格のないプリンシパルが、その権限を使用してリソースにアクセスできないようにします。
プリンシパル アクセス境界ポリシーが権限をブロックしない場合、プリンシパル アクセス境界ポリシーは、プリンシパルが権限を使用できるかどうかに影響しません。
たとえば、プリンシパル Lee(lee@example.com
)に Dataflow デベロッパー ロール(roles/dataflow.developer
)が付与されているとします。このロールには dataflow.jobs.snapshot
権限が含まれており、Lee は Dataflow ジョブのスナップショットを取得できます。Lee には、example.com
外のリソースにアクセスできないようにするプリンシパル アクセス境界ポリシーも適用されます。ただし、プリンシパル アクセス境界ポリシーで dataflow.jobs.snapshot
権限がブロックされていない場合、Lee は example.com
外の組織の Dataflow ジョブのスナップショットを取得できます。
プリンシパル アクセス境界ポリシーがブロックする権限は、プリンシパル アクセス境界の適用バージョンによって異なります。
プリンシパル アクセス境界の適用バージョン
各プリンシパル アクセス境界ポリシーでは適用バージョン指定します。これにより、プリンシパル アクセス境界ポリシーがブロックできる IAM 権限の事前定義リストが決まります。適用バージョンは、プリンシパル アクセス境界ポリシーを作成または更新するときに指定します。適用バージョンを指定しないと、IAM は最新の適用バージョンを使用し、更新するまでそのバージョンを継続して使用します。
IAM では、追加の権限をブロックできる新しいプリンシパル アクセス境界適用バージョンが定期的に追加されています。新しいバージョンでは、以前のバージョンの権限をすべてブロックすることもできます。
新しい適用バージョンで権限をブロックするには、新しいバージョンを使用するようにプリンシパル アクセス境界ポリシーを更新する必要があります。新しいバージョンがリリースされたときに適用バージョンを自動的に更新するには、ポリシーの作成時に値 latest
を使用します。ただし、この値を使用することはおすすめしません。プリンシパルが予期せずリソースへのアクセス権を失う可能性があるためです。
各適用バージョンでブロックされる権限の一覧については、プリンシパル アクセス境界ポリシーでブロックされる権限をご覧ください。
プリンシパル アクセス境界ポリシーをプリンシパル セットにバインドする
プリンシパル アクセス境界ポリシーをプリンシパル セットにバインドするには、適用するプリンシパル アクセス境界ポリシーとプリンシパル セットの両方を指定するポリシー バインディングを作成します。ポリシーをプリンシパル セットにバインドすると、そのプリンシパル セット内のプリンシパルは、プリンシパル アクセス境界ポリシーのルールに含まれるリソースにのみアクセスできます。
プリンシパル アクセス境界ポリシーは、任意の数のプリンシパル セットにバインドできます。各プリンシパル セットには、最大 10 個のプリンシパル アクセス境界ポリシーをバインドできます。
プリンシパル アクセス境界ポリシーの管理方法については、プリンシパル アクセス境界ポリシーを作成して適用するをご覧ください。
サポートされているプリンシパル セット
次の表に、プリンシパル アクセス境界ポリシーをバインドできるプリンシパル セットの種類を示します。各行の内容は次のとおりです。
- プリンシパル セットのタイプ
- そのタイプのプリンシパル セット内のプリンシパル
- そのタイプのプリンシパル セットの ID の形式
- そのタイプのプリンシパル セットのポリシー バインディングを親とする Resource Manager リソース(プロジェクト、フォルダ、組織)
プリンシパル セット | 詳細 | ポリシー バインディングの親リソース |
---|---|---|
Workforce Identity プール |
指定された Workforce Identity プールのすべての ID が含まれます。
形式: |
Workforce Identity プールを含む組織 |
Workload Identity プール |
指定された Workload Identity プール内のすべての ID が含まれます。
形式: |
Workload Identity プールを含むプロジェクト |
Google Workspace ドメイン |
指定された Google Workspace ドメイン内のすべての ID が含まれます。
形式: Workspace ID は、次の方法で確認できます。
|
Google Workspace ドメインに関連付けられている組織 |
プロジェクトのプリンシパル セット |
指定したプロジェクト内のすべてのサービス アカウントと Workload Identity プールが含まれます。
形式: |
プロジェクト |
フォルダのプリンシパル セット |
指定したフォルダ内のすべてのプロジェクトのすべてのサービス アカウントと Workload Identity プールが含まれます。
形式: |
フォルダ |
組織のプリンシパル セット |
次の ID が含まれます。
形式: |
組織 |
プリンシパル アクセス境界ポリシーの条件付きポリシー バインディング
プリンシパル アクセス境界ポリシーのポリシー バインディングで条件式を使用して、ポリシーが適用されるプリンシパルをさらに絞り込むことができます。
ポリシー バインディングの条件式は、最大 10 個の論理演算子(&&
、||
、または !
)で結合された 1 つ以上のステートメントで構成されます。各ステートメントは、ポリシー バインディングに適用される属性ベースの制御ルールを表します。これにより、最終的にポリシーが適用されるかどうかが決まります。
ポリシー バインディングの条件で principal.type
属性と principal.subject
属性を使用できます。ポリシー バインディングの条件では、他の属性はサポートされていません。
principal.type
属性は、リクエスト内のプリンシパルのタイプ(サービス アカウント、Workload Identity プール内の ID など)を示します。この属性の条件を使用して、プリンシパル アクセス境界ポリシーを適用するプリンシパルの種類を制御できます。たとえば、プリンシパル アクセス境界ポリシーのバインディングに次の条件式を追加すると、このポリシーはサービス アカウントにのみ適用されます。
principal.type == 'iam.googleapis.com/ServiceAccount'
principal.subject
属性は、リクエスト内のプリンシパルの ID を示します(例:cruz@example.com
)。この属性に条件を使用すると、プリンシパル アクセス境界ポリシーの対象となるプリンシパルを正確に制御できます。たとえば、プリンシパル アクセス境界ポリシーのバインディングに次の条件式を追加すると、ユーザー
special-admin@example.com
にはポリシーが適用されません。principal.subject != 'special-admin@example.com'
これらの条件に使用できる値の詳細については、Conditions 属性のリファレンスをご覧ください。
例: 条件を使用して、プリンシパルがアクセスできるリソースを減らす
プリンシパル アクセス境界ポリシー バインディングで条件を使用する目的の一例は、1 つの特定のプリンシパルがアクセスできるリソースを減らすことです。
メールアドレス dev-project-service-account@dev-project.iam.gserviceaccount.com
を持つサービス アカウント dev-project-service-account
があるとします。このサービス アカウントは、組織 example.com
内のすべてのリソースへのアクセスをプリンシパルに許可するプリンシパル アクセス境界ポリシーの対象となっています。このポリシーは、example.com
組織のプリンシパル セットに関連付けられています。
ここで、dev-project-service-account
が example.com
内のすべてのリソースにアクセスできるようにするのではなく、dev-project
内のリソースにのみアクセスできるようにします。ただし、example.com
プリンシパル セット内の他のプリンシパルがアクセスできるリソースは変更しないようにする必要があります。
この変更を行うには、プリンシパルがアクセスできるリソースを減らすための手順を進めます。ただし、ポリシー バインディングを削除するのではなく、ポリシー バインディングに条件を追加します。
dev-project-service-account
を対象とする唯一のプリンシパル アクセス境界ポリシーは、プリンシパルがexample.com
内のすべてのリソースにアクセスできるようにするポリシーであることを確認します。プリンシパルが
dev-project
内のリソースにアクセスできるようにする新しいプリンシパル アクセス境界ポリシーを作成し、dev-project
のプリンシパル セットに関連付けます。ポリシー バインディングで次の条件を使用して、ポリシーがdev-project-service-account
に対してのみ適用されるようにします。"condition": { "title": "Only dev-project-service-account", "expression": "principal.type == 'iam.googleapis.com/ServiceAccount' && principal.subject == 'dev-project-service-account@dev-project.iam.gserviceaccount.com'" }
プリンシパルが
example.com
内のすべてのリソースにアクセスできるようにするプリンシパル アクセス境界ポリシーからdev-project-service-account
を除外します。これを行うには、そのプリンシパル アクセス境界ポリシーを組織のプリンシパル セットに関連付けるポリシー バインディングに次の条件を追加します。"condition": { "title": "Exempt dev-project-service-account", "expression": "principal.subject != 'dev-project-service-account@dev-project.iam.gserviceaccount.com' || principal.type != 'iam.googleapis.com/ServiceAccount'" }
既存のプリンシパル アクセス境界ポリシーを更新する方法については、プリンシパル アクセス境界ポリシーを編集するをご覧ください。
この条件をポリシー バインディングに追加すると、dev-project-service-account
は example.com
内のすべてのリソースにアクセスすることはできなくなり、dev-project
内のリソースにのみアクセスできるようになります。
ポリシーの相互作用
IAM は、各プリンシパル アクセス境界ポリシーを許可ポリシー、拒否ポリシー、他のプリンシパル アクセス境界ポリシーと組み合わせて評価します。これらのポリシーはすべて、プリンシパルがリソースにアクセスできるかどうかを判断するために使用されます。
他のポリシータイプとの相互作用
プリンシパルがリソースにアクセスを試みると、IAM は関連するすべてのプリンシパル アクセス境界ポリシー、許可ポリシー、拒否ポリシーを評価し、プリンシパルがリソースにアクセスできるかどうかを確認します。これらのポリシーのいずれかで、プリンシパルがリソースにアクセスできないことが示されている場合、IAM はアクセスを拒否します。
そのため、プリンシパル アクセス境界ポリシーによってプリンシパルがリソースにアクセスできない場合、リソースに適用されている許可ポリシーと拒否ポリシーに関係なく、IAM はプリンシパルがそのリソースにアクセスできないようにします。
また、プリンシパル アクセス境界ポリシーだけでは、プリンシパルにリソースへのアクセス権が付与されません。プリンシパル アクセス境界ポリシーは、プリンシパルにリソースへのアクセスの資格を付与できますが、実際にプリンシパルにリソースへのアクセス権を付与できるのは許可ポリシーのみです。
IAM ポリシーの評価の詳細については、ポリシーの評価をご覧ください。
プリンシパル アクセス境界ポリシー間の相互作用
いずれかのプリンシパル アクセス境界ポリシーでリソースへのアクセスをプリンシパルに許可している場合、そのプリンシパルを対象とする他のプリンシパル アクセス境界ポリシーに関係なく、そのプリンシパルはそのリソースにアクセスできます。そのため、プリンシパルがすでにプリンシパル アクセス境界ポリシーの対象になっている場合、プリンシパル アクセス境界ポリシーを追加してそのプリンシパルのアクセスを制限することはできません。
たとえば、プリンシパル Dana(dana@example.com
)が、1 つのプリンシパル アクセス境界ポリシー prod-projects-policy
の対象であるとします。このポリシーにより、プリンシパルは prod-project
内のリソースにアクセスできるようになります。Dana は、組織のプリンシパル セットにバインドされているため、このポリシーの対象となります。
さらに、dev-project
と staging-project
のリソースにプリンシパルがアクセスできるようにする新しいプリンシパル アクセス境界ポリシー dev-staging-projects-policy
を作成し、組織のプリンシパル セットにバインドします。
これらのプリンシパル アクセス境界ポリシーの結果、Dana は dev-project
、staging-project
、prod-project
のリソースにアクセスできます。
ここで、Dana がアクセスできるリソースを減らすには、Dana を対象とするプリンシパル アクセス境界ポリシーを変更または削除する必要があります。
たとえば、プリンシパルが dev-project
内のリソースにアクセスできないように dev-staging-projects-policy
を編集できます。この場合、Dana は staging-project
と prod-project
のリソースにのみアクセスできます。
また、prod-projects-policy
を組織のプリンシパル セットにバインドするポリシー バインディングを削除して、このプリンシパル アクセス境界ポリシーを削除することもできます。この場合、Dana は dev-project
と staging-project
のリソースにのみアクセスできるようになります。
ただし、これらの変更は Dana にのみ影響するわけではありません。変更したプリンシパル アクセス境界ポリシーとポリシー バインディングの対象となる他のプリンシパルにも影響します。1 つの特定のプリンシパルがアクセスできるリソースを減らす場合は、条件付きポリシー バインディングを使用します。
ポリシーの継承
プリンシパル アクセス境界ポリシーは、Resource Manager リソースではなく、プリンシパル セットに適用されます。そのため、許可ポリシーや拒否ポリシーとは異なり、リソース階層を介して継承されません。
ただし、Resource Manager 親リソース(フォルダと組織)のプリンシパル セットには、常に子孫のリソースのプリンシパル セットが含まれます。たとえば、プリンシパルがプロジェクトのプリンシパル セットに含まれている場合、そのプリンシパルは親フォルダまたは組織のプリンシパル セットにも含まれます。
たとえば、example.com
という組織について考えてみましょう。この組織はドメイン example.com
に関連付けられており、次の Resource Manager リソースがあります。
- 組織
example.com
- 組織の子であるプロジェクト
project-1
- 組織の子フォルダ
folder-a
folder-a
の子である 2 つのプロジェクトproject-2
とproject-3
これらのリソースのプリンシパル セットには、次の ID が含まれています。
プリンシパル セット | example.com ドメインの Google Workspace ID |
example.com の Workforce Identity 連携プール |
project-1 のサービス アカウントと Workload Identity プール |
project-2 のサービス アカウントと Workload Identity プール |
project-3 のサービス アカウントと Workload Identity プール |
---|---|---|---|---|---|
example.com のプリンシパル セット |
|||||
folder-a のプリンシパル セット |
|||||
project-1 のプリンシパル セット |
|||||
project-2 のプリンシパル セット |
|||||
project-3 のプリンシパル セット |
その結果、次のプリンシパルは、次のプリンシパル アクセス境界ポリシーの影響を受けます。
example.com
ドメインの Google Workspace ID はexample.com
のプリンシパル セットに属し、そのプリンシパル セットにバインドされたプリンシパル アクセス境界ポリシーの影響を受けます。project-1
のサービス アカウントは、project-1
とexample.com
のプリンシパル セットに属しており、これらのプリンシパル セットのいずれかにバインドされたプリンシパル アクセス境界ポリシーの影響を受けます。project-3
のサービス アカウントは、project-3
、folder-a
、example.com
のプリンシパル セットに属しており、これらのプリンシパル セットのいずれかにバインドされているプリンシパル アクセス境界ポリシーの影響を受けます。
プリンシパル アクセス境界ポリシーとキャッシュに保存されたリソース
一部の Google Cloud サービスは、一般公開されているリソースをキャッシュに保存します。たとえば、Cloud Storage は一般公開で読み取り可能なオブジェクトをキャッシュに保存します。
プリンシパル アクセス境界で、権限のないプリンシパルが公開リソースを表示できないようにできるかどうかは、リソースがキャッシュに保存されているかどうかによって異なります。
- リソースがキャッシュに保存されている場合、プリンシパル アクセス境界によってプリンシパルのリソース表示を防ぐことはできません。
- リソースがキャッシュに保存されていない場合、プリンシパル アクセス境界により、資格のないプリンシパルによるリソースの表示を防ぐことができます。
いずれの場合も、プリンシパル アクセス境界ポリシーにより、資格のないプリンシパルによる一般公開リソースの変更または削除を防ぐことができます。
プリンシパル アクセス境界ポリシーの構造
プリンシパル アクセス境界ポリシーは、メタデータとプリンシパル アクセス境界ポリシーの詳細のコレクションです。メタデータには、ポリシー名やポリシーの作成日時などの情報が含まれます。ポリシーの詳細では、ポリシーの機能(影響を受けるプリンシパルがアクセスできるリソースなど)を定義します。
たとえば、次のプリンシパル アクセス境界ポリシーでは、ポリシーの対象となるプリンシパルが、ID 0123456789012
の組織内のリソースにアクセスできるようになります。
{
"name": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-policy",
"uid": "puid_0123456789012345678",
"etag": "W/\"Gh/PcTdJD/AWHUhPW45kdw==\"",
"displayName": "Example policy",
"annotations": {
"example-key": "example-value"
},
"createTime": "2024-01-02T15:01:23Z",
"updateTime": "2024-01-02T15:01:23Z",
"details": {
"rules": [
{
"description": "Example principal access boundary policy rule",
"resources": [
"//cloudresourcemanager.googleapis.com/organizations/0123456789012"
],
"effect": "ALLOW"
}
],
"enforcementVersion": "1"
}
}
以降のセクションでは、プリンシパル アクセス境界ポリシーのメタデータと詳細のフィールドについて説明します。
メタデータ
プリンシパル アクセス境界ポリシーには次のメタデータが含まれます。
name
: プリンシパル アクセス境界ポリシーの名前。この名前の形式はorganizations/ORGANIZATION_ID/locations/global/principalAccessBoundaryPolicies/PAB_POLICY_ID
です。ここで、ORGANIZATION_ID
はプリンシパル アクセス境界ポリシーが作成された組織の数値 ID、PAB_POLICY_ID
はプリンシパル アクセス境界ポリシーの英数字の ID です。uid
: プリンシパル アクセス境界ポリシーに割り当てられた一意の ID。etag
: ポリシーの現在の状態の ID。この値は、ポリシーを更新すると変更されます。更新の競合を回避するため、etag
値は IAM に保存されている値と一致させる必要があります。etag
値が一致しない場合、リクエストは失敗します。displayName
: 人が読める形式のプリンシパル アクセス境界ポリシーの名前。annotations
: 省略可。ユーザー定義の Key-Value ペアのリスト。これらのアノテーションを使用して、ポリシーにメタデータを追加できます。たとえば、ポリシーを作成したユーザーや、ポリシーが自動化されたパイプラインによってデプロイされたかどうかなどを追加できます。アノテーションの詳細については、アノテーションをご覧ください。createTime
: プリンシパル アクセス境界ポリシーの作成時間。updateTime
: プリンシパル アクセス境界ポリシーが最後に更新された時刻。
詳細
各プリンシパル アクセス境界ポリシーには details
フィールドが含まれています。このフィールドは、プリンシパル アクセス境界ルールと適用バージョンを表します。
rules
: プリンシパル アクセス境界ルールのリスト。影響を受けるプリンシパルがアクセスできるリソースを定義します。各ルールには次のフィールドが含まれます。description
: 人が読める形式のルールの説明。resources
: プリンシパルがアクセスできるようにする Resource Manager リソース(プロジェクト、フォルダ、組織)のリスト。このポリシーの対象となるプリンシパルは、これらのリソースにアクセスできます。各プリンシパル アクセス境界ポリシーは、ポリシー内のすべてのルールで最大 500 個のリソースを参照できます。
effect
: プリンシパルとresources
フィールドにリストされているリソースの関係。プリンシパル アクセス境界ルールで指定できる効果は"ALLOW"
のみです。この関係により、プリンシパルはルールにリストされているリソースにアクセスできるようになります。
enforcementVersion
: IAM がポリシーの適用時に使用する適用バージョン。プリンシパル アクセス境界ポリシーのバージョンによって、プリンシパル アクセス境界ポリシーでブロックできる権限が決まります。プリンシパル アクセス境界ポリシーのバージョンの詳細については、このページのプリンシパル アクセス境界の適用バージョンをご覧ください。
ポリシー バインディングの構造
プリンシパル アクセス境界ポリシーのポリシー バインディングには、ポリシーの名前、ポリシーをバインドするように設定されたプリンシパルの名前、ポリシー バインディングを記述するメタデータが含まれます。また、ポリシーが適用されるプリンシパルを変更する条件を含めることもできます。
たとえば、次のポリシー バインディングは、ID が 0123456789012
の example.com
組織内のすべてのプリンシパルにポリシー example-policy
をバインドします。ポリシー バインディングには、プリンシパル super-admin@example.com
にポリシーが適用されないようにする条件も含まれます。
{
"name": "organizations/0123456789012/locations/global/policyBindings/example-policy-binding",
"uid": "buid_01234567890123456789",
"etag": "W/\"cRMdDXbT82aLuZlvoL9Gqg==\"",
"displayName": "Example policy binding",
"annotations": {
"example-key": "example-value"
},
"target": {
"principalSet": "//cloudresourcemanager.googleapis.com/organizations/0123456789012"
},
"policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
"policy": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-policy",
"policyUid": "puid_0123456789012345678",
"condition": {
"title": "Exempt principal",
"description": "Don't enforce the policy for super-admin@example.com",
"expression": "principal.subject != 'super-admin@example.com'"
},
"createTime": "2024-01-02T17:00:16Z",
"updateTime": "2024-01-02T17:00:16Z"
}
各ポリシー バインディングには次のフィールドが含まれます。
name
: ポリシー バインディングの名前。この名前の形式はRESOURCE_TYPE/RESOURCE_ID/locations/global/policyBindings/BINDING_ID
です。ここで、RESOURCE_TYPE/RESOURCE_ID
はポリシー バインディングの親リソースのタイプと ID、BINDING_ID
はポリシー バインディングの英数字の ID です。uid
: ポリシー バインディングに割り当てられた一意の ID。etag
: ポリシーの現在の状態の ID。この値は、ポリシーを更新すると変更されます。更新の競合を回避するため、etag
値は IAM に保存されている値と一致させる必要があります。etag
値が一致しない場合、リクエストは失敗します。displayName
: 人が読める形式のポリシー バインディングの名前。annotations
: 省略可。ユーザー定義の Key-Value ペアのリスト。これらのアノテーションを使用して、ポリシー バインディングにメタデータを追加できます。たとえば、ポリシー バインディングの作成者や、ポリシー バインディングが自動化パイプラインによってデプロイされたかどうかなどを追加できます。アノテーションの詳細については、アノテーションをご覧ください。target
: ポリシーをバインドするプリンシパル。値の形式は{"principalSet": PRINCIPAL_SET}
です。ここで、PRINCIPAL_SET
はポリシーをバインドするプリンシパル セットの ID です。各ターゲットには、最大 10 個のポリシーをバインドできます。
policyKind
: ポリシー バインディングが参照するポリシーのタイプ。プリンシパル アクセス境界ポリシーのポリシー バインディングの場合、この値は常にPRINCIPAL_ACCESS_BOUNDARY
です。policy
: ターゲット プリンシパル セットにバインドするプリンシパル アクセス境界ポリシー。policyUid
:policy
フィールドで参照されるプリンシパル アクセス境界ポリシーに割り当てられた一意の ID。condition
: 省略可。IAM がポリシーを適用するプリンシパルに影響する論理式。条件が true と評価されるか、評価できない場合、Identity and Access Management はリクエストを行ったプリンシパルのポリシーを適用します。条件が false と評価された場合、Identity and Access Management はプリンシパルのポリシーを適用しません。詳細については、このページのプリンシパル アクセス境界と条件をご覧ください。createTime
: ポリシー バインディングの作成時間。updateTime
: ポリシー バインディングが最後に更新された時間。
ユースケース
以下では、プリンシパル アクセス境界ポリシーを使用する一般的な状況と、それぞれの状況で作成するプリンシパル アクセス境界ポリシーとポリシー バインディングの例を示します。プリンシパル アクセス境界ポリシーを作成してプリンシパル セットにバインドする方法については、プリンシパル アクセス境界ポリシーを作成して適用するをご覧ください。
プリンシパルを組織内のリソースに制限する
プリンシパル アクセス境界ポリシーを使用すると、組織内のプリンシパルが組織内のリソースにのみアクセスできるようにすることができます。
たとえば、組織 example.com
内のすべてのプリンシパルが example.com
内のリソースにのみアクセスできるようにするとします。example.com
内のプリンシパルには、example.com
ドメイン内の ID、example.com
内の Workforce Identity プール、example.com
内のプロジェクト内のサービス アカウントと Workload Identity プールがすべて含まれます。
組織内のプリンシパルに適用されるプリンシパル アクセス境界ポリシーはありません。その結果、すべてのプリンシパルがすべてのリソースにアクセスできるようになります。
プリンシパルが example.com
以外のリソースにアクセスできないようにするには、プリンシパルが example.com
のリソースにアクセスできるようにするプリンシパル アクセス境界ポリシーを作成します。
{
"name": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-org-only",
"displayName": "Boundary for principals in example.org",
"details": {
"rules": [
{
"description": "Principals are only eligible to access resources in example.org",
"resources": [
"//cloudresourcemanager.googleapis.com/organizations/0123456789012"
],
"effect": "ALLOW"
}
],
"enforcementVersion": "1"
}
}
次に、このポリシーをプリンシパル セットにバインドするポリシー バインディングを作成します。
{
"name": "organizations/0123456789012/locations/global/policyBindings/example-org-only-binding",
"displayName": "Bind policy to all principals in example.com",
"target": {
"principalSet": "//cloudresourcemanager.googleapis.com/organizations/0123456789012"
},
"policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
"policy": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-org-only"
}
これで、example.com
内のすべてのプリンシパルは、example.com
内のリソースにのみアクセスできるようになりました。これらのユーザーは、プリンシパル アクセス境界ポリシーによってブロックされている権限を使用して、example.com
外部のリソースにアクセスすることはできません。これらのリソースに対する権限が付与されていてもアクセスすることはできません。
サービス アカウントを 1 つのプロジェクトのリソースに制限する
プリンシパル アクセス境界ポリシーを使用すると、特定のプロジェクトのサービス アカウントがそのプロジェクト内のリソースにのみアクセスできるように制御できます。
たとえば、プロジェクト example-dev
があるとします。example-dev
のサービス アカウントが example-dev
のリソースにのみアクセスできるようにします。
example-dev
のサービス アカウントを含む、組織内のすべてのプリンシパルが example.com
のリソースにアクセスできるようにするプリンシパル アクセス境界ポリシーがすでに存在します。このタイプのポリシーの詳細については、プリンシパルを組織内のリソースに制限するをご覧ください。
example-dev
のサービス アカウントが example-dev
外のリソースにアクセスできないようにするには、まず、プリンシパルが example-dev
のリソースにアクセスできるようにするプリンシパル アクセス境界ポリシーを作成します。
{
"name": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-dev-only",
"displayName": "Boundary for principals in example-dev",
"details": {
"rules": [
{
"description": "Principals are only eligible to access resources in example-dev",
"resources": [
"//cloudresourcemanager.googleapis.com/projects/example-dev"
],
"effect": "ALLOW"
}
],
"enforcementVersion": "1"
}
}
次に、このポリシーを example-dev
のすべてのプリンシパルにバインドするポリシー バインディングを作成し、ポリシー バインディングがサービス アカウントにのみ適用されるように条件を追加します。
{
"name": "organizations/0123456789012/locations/global/policyBindings/example-dev-only-binding",
"displayName": "Bind policy to all service accounts in example-dev",
"target": {
"principalSet": "//cloudresourcemanager.googleapis.com/projects/example-dev"
},
"policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
"policy": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-dev-only",
"condition": {
"title": "Only service accounts",
"description": "Only enforce the policy if the principal in the request is a service account",
"expression": "principal.type == 'iam.googleapis.com/ServiceAccount'"
}
}
ただし、このポリシー自体では、サービス アカウントの利用資格を制限することはできません。これは、example.com
内のすべてのプリンシパルが example.com
内のすべてのリソースにアクセスできるようにするプリンシパル アクセス境界ポリシーがすでに存在するためです。プリンシパル アクセス境界ポリシーは累積的であるため、example-dev
のサービス アカウントは引き続き example.com
内のすべてのリソースにアクセスできます。
example-dev
のサービス アカウントが example-dev
のリソースにのみアクセスできるようにするには、既存のプリンシパル アクセス境界ポリシーのポリシー バインディングに条件を追加して、example-dev
のサービス アカウントに適用されないようにする必要があります。
{
"name": "organizations/0123456789012/locations/global/policyBindings/example-org-only-binding",
"displayName": "Bind policy to all principals in example.com",
"target": {
"principalSet": "//cloudresourcemanager.googleapis.com/organizations/0123456789012"
},
"policyKind": "PRINCIPAL_ACCESS_BOUNDARY",
"policy": "organizations/0123456789012/locations/global/principalAccessBoundaryPolicies/example-org-only",
"condition": {
"title": "Exempt example-dev service accounts",
"description": "Don't enforce the policy for service accounts in the example-dev project",
"expression": "principal.type != 'iam.googleapis.com/ServiceAccount' || !principal.subject.endsWith('@example-dev.iam.gserviceaccount.com')"
}
}
これで、example-dev
のサービス アカウントは、example-dev
のリソースにのみアクセスできるようになりました。これらのユーザーは、プリンシパル アクセス境界ポリシーによってブロックされている権限を使用して、example-dev
外部のリソースにアクセスすることはできません。これらのリソースに対する権限が付与されていてもアクセスすることはできません。
次のステップ
- プリンシパル アクセス境界ポリシーを作成して適用する方法を学習する。
- プリンシパル アクセス境界ポリシーの適用バージョンがブロックする権限を確認する。