プリンシパル アクセス境界ポリシーのユースケースの例

以下では、プリンシパル アクセス境界ポリシーを使用する一般的な状況と、それぞれの状況で作成するポリシーとポリシー バインディングの例を示します。プリンシパル アクセス境界ポリシーを作成してプリンシパル セットにバインドする方法については、プリンシパル アクセス境界ポリシーを作成して 適用するをご覧ください。

組織外のリソースへのユーザー アクセスを禁止する

プリンシパル アクセス境界ポリシーはリソースではなくプリンシパルに関連付けられているため、プリンシパルが所有していないリソースに対するアクセスも禁止できます。たとえば、次のシナリオについて考えてみましょう。

リソースへのアクセスを禁止するプリンシパル アクセス境界ポリシー

リソースへのアクセスを禁止するプリンシパル アクセス境界ポリシー

  • プリンシパル Tal(tal@example.com)は、Google Workspace 組織 example.com のメンバーです。
  • Tal には、別の組織 cymbalgroup.com の Cloud Storage バケットに対するストレージ管理者(roles/storage.admin)ロールが付与されています。このロールには、バケット内のオブジェクトを表示するために必要な storage.objects.get 権限が含まれています。
  • cymbalgroup.com には、Tal が storage.objects.get 権限を使用できないようにする拒否ポリシーはありません。

example.com の管理者は、許可ポリシーと拒否ポリシーを使用して、Tal がこの外部バケット内のオブジェクトを表示できないようにすることはできません。example.com プリンシパルにはバケットの許可ポリシーを編集する権限がないため、Tal のロールを取り消すことはできません。また、cymbalgroup.com に拒否ポリシーを作成する権限もないため、拒否ポリシーを使用して Tal によるバケットへのアクセスを禁止することもできません。

ただし、プリンシパル アクセス境界ポリシーを使用すると、example.com 管理者は、Tal による cymbalgroup.com バケット内のオブジェクトまたは example.com 外の任意のバケット内のオブジェクトの表示を防ぐことができます。

これを行うには、管理者は、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": "4"
  }
}

次に、ポリシー バインディングを作成して、このポリシーを組織 example.com 内のすべてのプリンシパルに適用します。

{
  "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 ドメイン内の ID、example.com 内の Workforce Identity プール、example.com 内のプロジェクト内のサービス アカウントと Workload Identity プールがすべて含まれます。

このポリシーが適用されると、example.com 内のプリンシパルは、リソースに対する権限を持っていても、プリンシパル アクセス境界ポリシーによってブロックされている権限を使用して example.com 外のリソースにアクセスすることはできません。

この場合、プリンシパル アクセス境界ポリシーは適用バージョン 4を使用するため、storage.objects.get権限をブロックできます。その結果、Tal はバケットに対するストレージ管理者ロールが付与されていても、cymbalgroup.com バケット内のオブジェクトを表示できません。

サービス アカウントの資格を 1 つのプロジェクトのリソースに限定する

プリンシパル アクセス境界ポリシーを使用して、プリンシパルのサブセットが組織内のリソースのサブセットにアクセスできるようにすることもできます。

たとえば、プロジェクト番号 901234567890 のプロジェクト example-dev があるとします。example-dev のサービス アカウントが example-dev のリソースにのみアクセスできるようにしたいとします。

これを行うには、まず、プリンシパルが dev-project のリソースにアクセスできるようにする新しいプリンシパル アクセス境界ポリシーを作成します。

{
  "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": "4"
  }
}

このプリンシパル アクセス境界ポリシーは適用バージョン 4 を使用します。つまり、 適用バージョン 4 でサポートされているすべての 権限をブロックできます。

プリンシパル アクセス境界ポリシーを作成したら、ポリシー バインディングを作成して、新しいポリシーを 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-dev 外のリソースにアクセスすることはできません。

さまざまなプリンシパル グループの資格を管理する

同じ組織内で複数のプリンシパル アクセス境界ポリシーを使用して、さまざまなプリンシパルがさまざまなリソースにアクセスできるようにすることができます。複数のプリンシパル アクセス境界ポリシーを使用する場合は、ポリシー バインディングで条件を使用して、各ポリシーが適用されるプリンシパルにのみ適用されるようにします。

たとえば、組織外のリソースへのユーザー アクセスを禁止するで説明したように、ほとんどのプリンシパルが組織内のすべての リソースにアクセスできるようにするとします。ただし、サービス アカウントの資格を 1 つのプロジェクトのリソースに限定するで説明したように、example-dev のサービス アカウントが example-dev のリソースにのみアクセスできるようにしたいとします。

この目標を達成するには、次の操作を行います。

  1. 組織外のリソースへのユーザー アクセスを禁止する の例に沿って、プリンシパルが example.com のリソースにアクセスできるようにするプリンシパル アクセス境界 ポリシーを作成し、組織のプリンシパル セットにバインドします。

  2. サービス アカウントの資格を 1 つのプロジェクトのリソースに限定するの例に沿って、 example-devのサービス アカウントが example-devのリソースにアクセスできるようにするプリンシパル アクセス境界 ポリシーを作成し、 example-devのサービス アカウントにバインドします。

  3. プリンシパルが example.com 内のすべてのリソースにアクセスできるようにするプリンシパル アクセス境界ポリシーから example-dev のサービス アカウントを除外します。これを行うには、そのプリンシパル アクセス境界ポリシーを組織のプリンシパル セットに関連付けるポリシー バインディングに次の条件を追加します。

    "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') && principal.subject != 'example-dev@appspot.gserviceaccount.com' && principal.subject != '901234567890-compute@developer.gserviceaccount.com')"
    }
    

この最後のステップは重要です。最初のプリンシパル アクセス境界ポリシーから example-dev サービス アカウントを除外しないと、そのポリシーによって、他のプリンシパル アクセス境界ポリシーの対象に関係なく、example.com 内のすべてのリソースにアクセスできるようになります。詳細については、 アクセス可能なリソースの定義をご覧ください。

また、最初のプリンシパル アクセス境界ポリシーから除外する前に、新しいプリンシパル アクセス境界ポリシーを作成して example-dev サービス アカウントに接続することも重要です。 この手順を行うと、サービス アカウントには常に少なくとも 1 つのプリンシパル アクセス境界ポリシーが適用されるため、 アカウントがすべての Google Cloudリソースにアクセスできるようになることはありません。プリンシパルがアクセスできるリソースを安全に減らす方法については、プリンシパルがアクセスできるリソースを減らすをご覧ください。

次のステップ