認証情報アクセス境界の概要

このページでは、有効期間が短い認証情報で使用できる Identity and Access Management(IAM)権限の範囲を縮小または制限するために使用可能な認証情報アクセス境界について説明します。

認証情報アクセス境界を使用して、サービス アカウントを表しながら、サービス アカウントよりも権限が少ない OAuth 2.0 アクセス トークンを生成できます。たとえば、あるお客様が、管理している Cloud Storage データにアクセスする必要がある場合、次のようにします。

  1. 所有するすべての Cloud Storage バケットにアクセスできるサービス アカウントを作成します。
  2. 作成したサービス アカウントに OAuth 2.0 アクセス トークンを生成します。
  3. お客様のデータを含むバケットに対するアクセスのみを許可する認証情報アクセス境界を適用します。

認証情報アクセス境界の仕組み

権限の範囲を限定するには、各リソースで使用できる権限の上限と、有効期間が短い認証情報でアクセスできるリソースを指定する認証情報アクセス境界を定義します。その後、有効期間が短い認証情報を作成し、認証情報アクセス境界を遵守する新しい認証情報に交換できます。

プリンシパルにセッションごとに異なる権限セットを割り当てる必要がある場合は、サービス アカウントを多数作成して各サービス アカウントに異なるロールセットを付与するよりも、認証情報アクセス境界を使用する方が効率的な場合があります。

認証情報アクセス境界のコンポーネント

認証情報アクセス境界は、アクセス境界ルールのリストを含むオブジェクトです。各ルールには次の情報が含まれます。

  • ルールが適用されるリソース
  • そのリソースで使用できる権限の上限
  • 省略可: 権限をさらに制限する条件。条件には次のものが含まれます。
    • true または false で評価される条件式。true と評価された場合にアクセスが許可され、そうでない場合はアクセスが拒否されます。
    • 省略可: 条件を識別するためのタイトル。
    • 省略可: 条件についての詳しい説明。

認証情報アクセス境界を有効期間の短い認証情報に適用すると、認証情報は認証情報アクセス境界内のリソースにのみアクセスできます。他のリソースでは権限は使用できません。

認証情報アクセス境界には、最大 10 個のアクセス境界ルールを含めることができます。有効期間の短い認証情報ごとに適用できる認証情報アクセス境界は 1 つのみです。

JSON オブジェクトとして表現される場合、認証情報アクセス境界には次のフィールドが含まれます。

フィールド
accessBoundary

object

認証情報アクセス境界のラッパー。

accessBoundary.accessBoundaryRules[]

object

有効期間の短い認証情報に適用されるアクセス境界ルールのリスト。

accessBoundary.accessBoundaryRules[].availablePermissions[]

string

リソースに対して使用可能な権限の上限を定義するリスト。

接頭辞 inRole: の付いた各値は、IAM の事前定義ロールまたはカスタムロールの識別子です。例: inRole:roles/storage.objectViewer。こうしたロールに含まれる権限のみが使用できます。

accessBoundary.accessBoundaryRules[].availableResource

string

ルールが適用される Cloud Storage バケットの完全なリソース名。形式 //storage.googleapis.com/projects/_/buckets/bucket-name を使用します。

accessBoundary.accessBoundaryRules[].availabilityCondition

object

省略可。特定の Cloud Storage オブジェクトに対する権限の利用を制限する条件。

このフィールドは、Cloud Storage バケット内のすべてのオブジェクトではなく特定のオブジェクトに対して権限を使用可能にする場合に使用します。

accessBoundary.accessBoundaryRules[].availabilityCondition.expression

string

権限を使用できる Cloud Storage オブジェクトを指定する条件式

条件式で特定のオブジェクトを参照する方法については、resource.name 属性api.getAttribute("storage.googleapis.com/objectListPrefix") 属性をご覧ください。

accessBoundary.accessBoundaryRules[].availabilityCondition.title

string

省略可。条件の目的を示す短い文字列。

accessBoundary.accessBoundaryRules[].availabilityCondition.description

string

省略可。条件の目的に関する詳細。

JSON 形式の例については、このページの認証情報アクセス境界の例をご覧ください。

認証情報アクセス境界の例

以降のセクションでは、一般的なユースケースの認証情報アクセス境界の例を示します。OAuth 2.0 アクセス トークンをスコープが限定されたトークンと交換する場合は、認証情報アクセス境界を使用します。

バケットの権限を制限する

次の例は、シンプルな認証情報アクセス境界を示しています。これは Cloud Storage バケット example-bucket に適用され、ストレージ オブジェクト閲覧者ロール(roles/storage.objectViewer)に含まれる権限の上限を設定します。

{
  "accessBoundary": {
    "accessBoundaryRules": [
      {
        "availablePermissions": [
          "inRole:roles/storage.objectViewer"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket"
      }
    ]
  }
}

複数のバケットの権限を制限する

次の例は、複数のバケットのルールを含む認証情報アクセス境界を示しています。

  • Cloud Storage バケット example-bucket-1: このバケットの場合、ストレージ オブジェクト閲覧者のロール(roles/storage.objectViewer)の権限のみが使用できます。
  • Cloud Storage バケット example-bucket-2: このバケットの場合、ストレージ オブジェクト作成者のロール(roles/storage.objectCreator)の権限のみが使用できます。
{
  "accessBoundary": {
    "accessBoundaryRules": [
      {
        "availablePermissions": [
          "inRole:roles/storage.objectViewer"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket-1"
      },
      {
        "availablePermissions": [
          "inRole:roles/storage.objectCreator"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket-2"
      }
    ]
  }
}

特定のオブジェクトの権限を制限する

IAM Conditions を使用して、プリンシパルがアクセスできる Cloud Storage オブジェクトを指定することもできます。たとえば、名前が customer-a で始まるオブジェクトにアクセスできるようにする条件を追加できます。

{
  "accessBoundary": {
    "accessBoundaryRules": [
      {
        "availablePermissions": [
          "inRole:roles/storage.objectViewer"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket",
        "availabilityCondition": {
          "expression" : "resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a')"
        }
      }
    ]
  }
}

オブジェクトを一覧表示するときに権限を制限する

Cloud Storage バケット内のオブジェクトを一覧表示すると、オブジェクト リソースではなく、バケット リソースでメソッドが呼び出されます。そのため、条件が一覧表示のリクエストに関して評価され、その条件がリソース名を参照する場合、リソース名はバケット内のオブジェクトではなく、バケットを表します。たとえば、example-bucket のオブジェクトを一覧表示する場合、リソース名は projects/_/buckets/example-bucket になります。

この命名規則により、オブジェクトを一覧表示するときに予期しない動作が発生することがあります。たとえば、接頭辞 customer-a/invoices/ を持つ example-bucket のオブジェクトに対する表示権限を許可する認証情報アクセス境界があるとします。この認証情報アクセス境界で、次の条件を試した場合を考えます。

不完全な条件: リソース名のみを確認する条件

resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a/invoices/')

この条件はオブジェクトを読み取りには使用できますが、オブジェクトの一覧表示には使用できません。

  • プリンシパルが接頭辞 customer-a/invoices/ を持つ example-bucket のオブジェクトを読み取ろうとすると、条件は true と評価されます。
  • プリンシパルがその接頭辞を持つオブジェクトを一覧表示しようとすると、条件は false と評価されます。resource.name の値は projects/_/buckets/example-bucket となり、projects/_/buckets/example-bucket/objects/customer-a/invoices/ で始まりません。

この問題を回避するには、条件が storage.googleapis.com/objectListPrefix という名前の API 属性を確認できるよう resource.name.startsWith() を使用します。この属性には、オブジェクトのリストをフィルタするために使用された prefix パラメータの値が含まれています。これにより、prefix パラメータの値を参照する条件を記述できます。

次の例は、条件で API 属性を使用する方法を示しています。これにより、接頭辞 customer-a/invoices/ を持つ example-bucket のオブジェクトの読み取りと一覧表示ができます。

完全な条件: リソース名と、接頭辞を確認する条件

resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a/invoices/')  ||
    api.getAttribute('storage.googleapis.com/objectListPrefix', '')
                     .startsWith('customer-a/invoices/')

この条件は認証情報アクセス境界で使用できます。

{
  "accessBoundary": {
    "accessBoundaryRules": [
      {
        "availablePermissions": [
          "inRole:roles/storage.objectViewer"
        ],
        "availableResource": "//storage.googleapis.com/projects/_/buckets/example-bucket",
        "availabilityCondition": {
          "expression":
            "resource.name.startsWith('projects/_/buckets/example-bucket/objects/customer-a/invoices/') || api.getAttribute('storage.googleapis.com/objectListPrefix', '').startsWith('customer-a/invoices/')"
        }
      }
    ]
  }
}

次のステップ