プリンシパル アクセス境界ポリシー

プリンシパル アクセス境界(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 が含まれます。

形式: //iam.googleapis.com/locations/global/workforcePools/WORKFORCE_POOL_ID

Workforce Identity プールを含む組織
Workload Identity プール

指定された Workload Identity プール内のすべての ID が含まれます。

形式: //iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/WORKLOAD_POOL_ID

Workload Identity プールを含むプロジェクト
Google Workspace ドメイン

指定された Google Workspace ドメイン内のすべての ID が含まれます。

形式: //iam.googleapis.com/locations/global/workspace/WORKSPACE_ID

Workspace ID は、次の方法で確認できます。

Google Workspace ドメインに関連付けられている組織
プロジェクトのプリンシパル セット

指定したプロジェクト内のすべてのサービス アカウントと Workload Identity プールが含まれます。

形式: //cloudresourcemanager.googleapis.com/projects/PROJECT_ID

プロジェクト
フォルダのプリンシパル セット

指定したフォルダ内のすべてのプロジェクトのすべてのサービス アカウントと Workload Identity プールが含まれます。

形式: //cloudresourcemanager.googleapis.com/folders/FOLDER_ID

フォルダ
組織のプリンシパル セット

次の ID が含まれます。

  • Google Workspace のお客様 ID に関連付けられているすべてのドメイン内のすべての ID
  • 組織内のすべての Workforce Identity プール
  • 組織内の任意のプロジェクト内のすべてのサービス アカウントと Workload Identity プール

形式: //cloudresourcemanager.googleapis.com/organizations/ORGANIZATION_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-accountexample.com 内のすべてのリソースにアクセスできるようにするのではなく、dev-project 内のリソースにのみアクセスできるようにします。ただし、example.com プリンシパル セット内の他のプリンシパルがアクセスできるリソースは変更しないようにする必要があります。

この変更を行うには、プリンシパルがアクセスできるリソースを減らすための手順を進めます。ただし、ポリシー バインディングを削除するのではなく、ポリシー バインディングに条件を追加します。

  1. dev-project-service-account を対象とする唯一のプリンシパル アクセス境界ポリシーは、プリンシパルが example.com 内のすべてのリソースにアクセスできるようにするポリシーであることを確認します。
  2. プリンシパルが 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'"
    }
    
  3. プリンシパルが 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-accountexample.com 内のすべてのリソースにアクセスすることはできなくなり、dev-project 内のリソースにのみアクセスできるようになります。

ポリシーの相互作用

IAM は、各プリンシパル アクセス境界ポリシーを許可ポリシー、拒否ポリシー、他のプリンシパル アクセス境界ポリシーと組み合わせて評価します。これらのポリシーはすべて、プリンシパルがリソースにアクセスできるかどうかを判断するために使用されます。

他のポリシータイプとの相互作用

プリンシパルがリソースにアクセスを試みると、IAM は関連するすべてのプリンシパル アクセス境界ポリシー、許可ポリシー、拒否ポリシーを評価し、プリンシパルがリソースにアクセスできるかどうかを確認します。これらのポリシーのいずれかで、プリンシパルがリソースにアクセスできないことが示されている場合、IAM はアクセスを拒否します。

そのため、プリンシパル アクセス境界ポリシーによってプリンシパルがリソースにアクセスできない場合、リソースに適用されている許可ポリシーと拒否ポリシーに関係なく、IAM はプリンシパルがそのリソースにアクセスできないようにします。

また、プリンシパル アクセス境界ポリシーだけでは、プリンシパルにリソースへのアクセス権が付与されません。プリンシパル アクセス境界ポリシーは、プリンシパルにリソースへのアクセスの資格を付与できますが、実際にプリンシパルにリソースへのアクセス権を付与できるのは許可ポリシーのみです。

IAM ポリシーの評価の詳細については、ポリシーの評価をご覧ください。

プリンシパル アクセス境界ポリシー間の相互作用

いずれかのプリンシパル アクセス境界ポリシーでリソースへのアクセスをプリンシパルに許可している場合、そのプリンシパルを対象とする他のプリンシパル アクセス境界ポリシーに関係なく、そのプリンシパルはそのリソースにアクセスできます。そのため、プリンシパルがすでにプリンシパル アクセス境界ポリシーの対象になっている場合、プリンシパル アクセス境界ポリシーを追加してそのプリンシパルのアクセスを制限することはできません。

たとえば、プリンシパル Dana(dana@example.com)が、1 つのプリンシパル アクセス境界ポリシー prod-projects-policy の対象であるとします。このポリシーにより、プリンシパルは prod-project 内のリソースにアクセスできるようになります。Dana は、組織のプリンシパル セットにバインドされているため、このポリシーの対象となります。

さらに、dev-projectstaging-project のリソースにプリンシパルがアクセスできるようにする新しいプリンシパル アクセス境界ポリシー dev-staging-projects-policy を作成し、組織のプリンシパル セットにバインドします。

これらのプリンシパル アクセス境界ポリシーの結果、Dana は dev-projectstaging-projectprod-project のリソースにアクセスできます。

ここで、Dana がアクセスできるリソースを減らすには、Dana を対象とするプリンシパル アクセス境界ポリシーを変更または削除する必要があります。

たとえば、プリンシパルが dev-project 内のリソースにアクセスできないように dev-staging-projects-policy を編集できます。この場合、Dana は staging-projectprod-project のリソースにのみアクセスできます。

また、prod-projects-policy を組織のプリンシパル セットにバインドするポリシー バインディングを削除して、このプリンシパル アクセス境界ポリシーを削除することもできます。この場合、Dana は dev-projectstaging-project のリソースにのみアクセスできるようになります。

ただし、これらの変更は Dana にのみ影響するわけではありません。変更したプリンシパル アクセス境界ポリシーとポリシー バインディングの対象となる他のプリンシパルにも影響します。1 つの特定のプリンシパルがアクセスできるリソースを減らす場合は、条件付きポリシー バインディングを使用します。

ポリシーの継承

プリンシパル アクセス境界ポリシーは、Resource Manager リソースではなく、プリンシパル セットに適用されます。そのため、許可ポリシーや拒否ポリシーとは異なり、リソース階層を介して継承されません。

ただし、Resource Manager 親リソース(フォルダと組織)のプリンシパル セットには、常に子孫のリソースのプリンシパル セットが含まれます。たとえば、プリンシパルがプロジェクトのプリンシパル セットに含まれている場合、そのプリンシパルは親フォルダまたは組織のプリンシパル セットにも含まれます。

たとえば、example.com という組織について考えてみましょう。この組織はドメイン example.com に関連付けられており、次の Resource Manager リソースがあります。

example.com のリソース階層

example.com のリソース階層

  • 組織 example.com
  • 組織の子であるプロジェクト project-1
  • 組織の子フォルダ folder-a
  • folder-a の子である 2 つのプロジェクト project-2project-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-1example.com のプリンシパル セットに属しており、これらのプリンシパル セットのいずれかにバインドされたプリンシパル アクセス境界ポリシーの影響を受けます。

  • project-3 のサービス アカウントは、project-3folder-aexample.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 が 0123456789012example.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 外部のリソースにアクセスすることはできません。これらのリソースに対する権限が付与されていてもアクセスすることはできません。

次のステップ