アクセス バインディングを使用してユーザー グループにポリシーを適用する

アクセス バインディングを使用すると、ユーザー グループがアクセスできるアプリケーションとリソースを制御できます。アクセス バインディングは、アクセスレベルとセッション制御をユーザー グループに適用する方法を指定します。すべてのアプリケーションに同じアクセスレベルとセッション制御を適用することも、個々のアプリケーションに特定の動作を定義することもできます。

すべてが正しく設定されていることを確認するには、ポリシーを適用する前にテストします。

アクセス バインディングを使用する場合は、次の動作に注意してください。

  • ユーザー グループに設定できるアクセス バインディングは 1 つだけです。
  • ユーザーが複数のグループに属している場合、いずれかのポリシーで許可されている場合(AND ではなく OR)、そのユーザーにアクセス権が付与されます。
  • セッション制御の場合、最近作成されたアクセス バインディングのみが適用されます。

すべてのアプリに単一の構成を使用する

この方法では、ユーザー グループがアクセスするすべてのアプリケーションに同じアクセスレベルとセッション制御を適用します。

本番環境に実装する前に、ドライランでポリシーをテストするか、少数のテストグループに適用することをおすすめします。

gcloud

アクセス バインディングを作成します。

gcloud access-context-manager cloud-bindings create \
     --group-key GROUP_ID
     --organization ORG_ID
     --level DEFAULT_ACCESS_LEVEL
  [  --session-length=DEFAULT_SESSION_LENGTH                ]
  [  --session-reauth-method=DEFAULT_SESSION_REAUTH_METHOD  ]

次のように置き換えます。

  • GROUP_ID: グループ ID。グループ ID を利用できない場合は、グループ リソースの get メソッドを呼び出すことで取得できます。
  • ORG_ID: 組織 ID。
  • DEFAULT_ACCESS_LEVEL: 省略可能なアクセスレベル名。形式は accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME です。POLICY_ID はアクセス ポリシー ID に、ACCESS_LEVEL_NAME はアクセスレベル名に置き換えます。
  • DEFAULT_SESSION_LENGTH: ISO 8601 の長さ形式で指定するオプションのセッション時間(30 分の場合は 30m、2 時間の場合は 2h など)。
  • DEFAULT_SESSION_REAUTH_METHOD: ユーザーに本人確認の再確認を求めるオプションの方法。次のいずれかである必要があります。
    • LOGIN: 標準ログインを適用します。これには、MFA や Workspace で定義されたその他の要素を含めることができます。
    • PASSWORD: 他の要素が定義されている場合でも、パスワードのみを必須にします。パスワードが外部 IdP を使用して管理されている場合、ユーザーは IdP にリダイレクトされます。IdP セッションが有効な場合、ユーザーは暗黙的に再認証されます。IdP が公開されていない場合は、ユーザーは IdP 経由でログインする必要があります。
    • SECURITY_KEY: ハードウェア セキュリティ キーを必須にします。

API

  1. JSON 本文を作成します。

    {
      "groupKey": "GROUP_ID",
      "accessLevels": [
        "DEFAULT_ACCESS_LEVEL"
      ],
      // optional:
      "sessionSettings": {
        "sessionLength": "DEFAULT_SESSION_LENGTH",
        "sessionReauthMethod": "DEFAULT_SESSION_REAUTH_METHOD"
      }
    }
    

    次のように置き換えます。

    • GROUP_ID: グループ ID。グループ ID を利用できない場合は、グループ リソースの get メソッドを呼び出すことで取得できます。
    • DEFAULT_ACCESS_LEVEL: 省略可能なアクセスレベル名。形式は accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME です。POLICY_ID はアクセス ポリシー ID に、ACCESS_LEVEL_NAME はアクセスレベル名に置き換えます。
    • DEFAULT_SESSION_LENGTH: ISO 8601 の長さ形式で指定するオプションのセッション時間(30 分の場合は 30m、2 時間の場合は 2h など)。
    • DEFAULT_SESSION_REAUTH_METHOD: ユーザーに本人確認の再確認を求めるオプションの方法。次のいずれかである必要があります。
      • LOGIN: 標準ログインを適用します。これには、MFA や Workspace で定義されたその他の要素を含めることができます。
      • PASSWORD: 他の要素が定義されている場合でも、パスワードのみを必須にします。パスワードが外部 IdP を使用して管理されている場合、ユーザーは IdP にリダイレクトされます。IdP セッションが有効な場合、ユーザーは暗黙的に再認証されます。IdP が公開されていない場合は、ユーザーは IdP 経由でログインする必要があります。
      • SECURITY_KEY: ハードウェア セキュリティ キーを必須にします。
  2. POST リクエストを送信します。

    POST https://accesscontextmanager.googleapis.com/v1/organizations/ORG_ID/gcpUserAccessBindings
    

    ORG_ID は、Cloud Access Binding Admin ロールの作成に使用した組織の ID です。access-context-manager/organization プロパティが設定されていない場合は、オプションの --organization フラグの ORG_ID を、Cloud Access Binding 管理者ロールの作成時に使用した組織の ID に置き換えます。

成功すると、JSON オブジェクトの表現が返されます。問題がある場合は、エラー メッセージが表示されます。

特定のアプリケーションの構成を定義する

この方法では、異なるアクセスレベルとセッション制御を異なるアプリケーションに適用できます。特定の構成がないアプリケーションにデフォルトのルールを設定することもできます。このメソッドは、次のような場合に便利です。

  • 特定のアプリケーションにのみポリシーを適用する。
  • 一般的なポリシーを作成し、一部のアプリケーションを除外する。

gcloud

  1. scopedAccessSettings リスト内のスコープ エントリのリストを含む YAML 形式のバインディング ファイルを作成します。特定のアクセスレベルにマッピングするアプリケーションごとに、clientScope エントリを含めます。

    scopedAccessSettings:
    - scope:
        clientScope:
          restrictedClientApplication:
            clientId: CLIENT_ID
      activeSettings:
        accessLevels:
        - ACCESS_LEVEL_A
        sessionSettings:
        - sessionLength: SESSION_LENGTH
          sessionReauthMethod: SESSION_REAUTH_METHOD
          sessionLengthEnabled: true
    - scope:
        clientScope:
          restrictedClientApplication:
            #
            # because this app is specified by `name`,
            # it won't work with sessionSettings.
            #
            # if you add sessionSettings, make sure to
            # replace the `name` key with `clientId`,
            # and use the OAuth client ID as the value.
            #
            name: CLIENT_NAME
      activeSettings:
        accessLevels:
        - ACCESS_LEVEL_B
    

    次のように置き換えます。

    • CLIENT_ID: OAuth クライアント ID。アプリケーションに sessionSettings が含まれている場合は、clientId を使用する必要があります。
    • ACCESS_LEVEL_A: アクセスレベルの名前(accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME の形式)。
    • SESSION_LENGTH: ISO 8601 の長さ形式で指定したセッション時間(30 分の場合は 30m、2 時間の場合は 2h など)。
    • SESSION_REAUTH_METHOD: ユーザーに本人確認の再確認を求めるオプションのメソッド。次のいずれかである必要があります。

      • LOGIN: 標準ログインを適用します。これには、MFA や Workspace で定義されたその他の要素を含めることができます。
      • PASSWORD: 他の要素が定義されている場合でも、パスワードのみを必須にします。外部 IdP を使用してパスワードが管理されている場合、ユーザーは IdP にリダイレクトされます。IdP セッションがアクティブな場合、ユーザーは暗黙的に再認証されます。IdP が公開されていない場合は、ユーザーは IdP からログインする必要があります。
      • SECURITY_KEY: ハードウェア セキュリティ キーを必須にします。
    • CLIENT_NAME: クライアント名。アプリケーションに sessionSettings が含まれている場合、クライアント名を使用できません。代わりに、OAuth クライアント ID を使用してください。

    • ACCESS_LEVEL_B: アクセスレベルの名前(accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME の形式)。

    YAML ファイルで定義されていないアプリケーションにデフォルトのアクセスレベルを設定するには、--level 引数を使用します。YAML ファイルは、アプリケーション固有の設定(scopedAccessSettings)のみをサポートします。

  2. アクセス バインディングを作成します。

    gcloud access-context-manager cloud-bindings create
        --organization ORG_ID
        --group-key GROUP_ID
        --binding-file BINDING_FILE_PATH
      [  --level DEFAULT_ACCESS_LEVEL ]
      [  --session-length=DEFAULT_SESSION_LENGTH                ]
      [  --session-reauth-method=DEFAULT_SESSION_REAUTH_METHOD  ]
    

    次のように置き換えます。

    • ORG_ID: 組織 ID。
    • GROUP_ID: グループ ID。グループ ID を利用できない場合は、グループ リソースの get メソッドを呼び出すことで取得できます。
    • BINDING_FILE_PATH: アクセス バインディング スキームを含む YAML ファイルのパス。バインディング ファイルは scopedAccessSettings のみをサポートします。
    • DEFAULT_ACCESS_LEVEL: 省略可能なアクセスレベル名。形式は accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME です。POLICY_ID はアクセス ポリシー ID に、ACCESS_LEVEL_NAME はアクセスレベル名に置き換えます。
    • DEFAULT_SESSION_LENGTH: ISO 8601 の長さ形式で指定するオプションのセッション時間(30 分の場合は 30m、2 時間の場合は 2h など)。
    • DEFAULT_SESSION_REAUTH_METHOD: ユーザーに本人確認の再確認を求めるオプションの方法。次のいずれかである必要があります。
      • LOGIN: 標準ログインを適用します。これには、MFA や Workspace で定義されたその他の要素を含めることができます。
      • PASSWORD: 他の要素が定義されている場合でも、パスワードのみを必須にします。パスワードが外部 IdP を使用して管理されている場合、ユーザーは IdP にリダイレクトされます。IdP セッションが有効な場合、ユーザーは暗黙的に再認証されます。IdP が公開されていない場合は、ユーザーは IdP 経由でログインする必要があります。
      • SECURITY_KEY: ハードウェア セキュリティ キーを必須にします。

--level 引数と --binding-file 引数の連携の仕組み

  • --binding-file のみを使用する場合、ファイル内のアプリにのみポリシーが適用されます。
  • --level のみを使用する場合、アクセスレベルはすべてのアプリに適用されます。
  • 両方を使用する場合は、YAML ファイルのルールが優先されます。--level 値は、ファイルにリストされていないすべてのアプリケーションに適用されます。

セッション管理の操作

  • すべてのアプリにデフォルトのセッション管理を設定するには、--session-length--session-reauth-method を使用します。
  • YAML ファイルでセッション コントロールも定義すると、それらのセッション コントロールが、特定のアプリケーションのデフォルト設定をオーバーライドします。
  • --session-length--session-reauth-method の両方を使用する必要があります。

API

JSON 本文を作成します。

{
  "groupKey": "GROUP_ID",
   //
   // Optional; if specified, all applications that aren't defined in
   // scopedAccessSettings have these access levels applied.
   //
   // If more than one access level is specified, the user is
   // granted access if any one resolves to TRUE (OR logic, not AND).
   //
   // If you omit this key entirely, then no policy enforcement is
   // applied by default.
   //
  "accessLevels": [
    "DEFAULT_ACCESS_LEVEL"
  ],
  "scopedAccessSettings": [
    {
      "scope": {
        "clientScope": {
          "restrictedClientApplication": {
            "clientId": "CLIENT_ID"
          }
        }
      },
      "activeSettings": {
        "accessLevels": [
          "ACCESS_LEVEL_A"
        ],
        "sessionSettings": [
          {
            "sessionLength": "SESSION_LENGTH",
            "sessionReauthMethod": "SESSION_REAUTH_METHOD",
            "sessionLengthEnabled": true
          }
        ]
      }
    },
    {
      "scope": {
        "clientScope": {
          "restrictedClientApplication": {
            "name": "CLIENT_NAME"
          }
        },
        "activeSettings": {
          "accessLevels": [
            "ACCESS_LEVEL_B"
          ]
        }
      }
    }
  ]
}

次のように置き換えます。

  • GROUP_ID: グループ ID。グループ ID を利用できない場合は、グループ リソースの get メソッドを呼び出すことで取得できます。
  • DEFAULT_ACCESS_LEVEL: 省略可能なアクセスレベル名。形式は accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME です。POLICY_ID はアクセス ポリシー ID に、ACCESS_LEVEL_NAME はアクセスレベル名に置き換えます。
  • CLIENT_ID: OAuth クライアント ID。アプリに sessionSettings が含まれている場合は、clientId を使用する必要があります。
  • ACCESS_LEVEL_A: accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME 形式のアクセスレベル名。
  • SESSION_LENGTH: ISO 8601 の長さ形式を使用したセッション時間(30 分の場合は 30m、2 時間の場合は 2h など)。
  • SESSION_REAUTH_METHOD: ユーザーに身元確認の再確認を求めるオプションのメソッド。次のいずれかである必要があります。

    • LOGIN: 標準ログインを適用します。これには、MFA や Workspace で定義されたその他の要素を含めることができます。
    • PASSWORD: 他の要素が定義されている場合でも、パスワードのみを必須にします。外部 IdP を使用してパスワードが管理されている場合、ユーザーは IdP にリダイレクトされます。IdP セッションがアクティブな場合、ユーザーは暗黙的に再認証されます。IdP が公開されていない場合は、ユーザーは IdP からログインする必要があります。
    • SECURITY_KEY: ハードウェア セキュリティ キーを必須にします。
  • CLIENT_NAME: クライアント名。アプリケーションに sessionSettings が含まれている場合、クライアント名は使用できません。代わりに、OAuth クライアント ID を使用してください。

  • ACCESS_LEVEL_B: accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME 形式のアクセスレベル名。

POST リクエストを送信します。

POST https://accesscontextmanager.googleapis.com/v1/organizations/ORG_ID/gcpUserAccessBindings

ORG_ID は、Cloud Access Binding Admin ロールの作成に使用した組織の ID です。access-context-manager/organization プロパティが設定されていない場合は、オプションの --organization フラグの ORG_ID を、Cloud Access Binding 管理者ロールの作成時に使用した組織の ID に置き換えます。

成功すると、JSON オブジェクトの表現が返されます。問題が発生した場合は、エラー メッセージが返されます。

ドライラン アクセスレベルを使用して適用をシミュレートする

ドライラン アクセスレベルを使用すると、アクセス ポリシーを実際に適用せずにテストできます。これにより、ポリシーを公開する前にその影響を把握できます。ドライラン ログを表示して、ポリシーが有効になっていた場合にどうなっていたかを確認できます。

ドライラン モードで使用できるのはアクセスレベルのみです。ドライラン モードではセッション コントロールを使用できません。

ドライラン バインディングを作成する

ドライランのアクセスレベルは、同じバインディングで通常のアクセスレベルとともに定義できます。また、ドライランに別のバインディングを使用することもできます。

gcloud

  1. アクセス設定を構成します。

    scopedAccessSettings:
    - scope:
        clientScope:
          restrictedClientApplication:
            name: CLIENT_NAME
      activeSettings:
        accessLevels:
        - ACCESS_LEVEL_A
      dryRunSettings:
        accessLevels:
        - DRY_RUN_ACCESS_LEVEL_1
    - scope:
        clientScope:
          restrictedClientApplication:
            clientId: CLIENT_ID
        dryRunSettings:
          accessLevels:
          - DRY_RUN_ACCESS_LEVEL_2
    

    次のように置き換えます。

    • CLIENT_NAME: クライアント名。アプリケーションに sessionSettings が含まれている場合、クライアント名は使用できません。代わりに、OAuth クライアント ID を使用してください。
    • ACCESS_LEVEL_A: アクセスレベルの名前(accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME の形式)。
    • DRY_RUN_ACCESS_LEVEL_1: アクセスレベルの名前(accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME の形式)。
    • CLIENT_ID: OAuth クライアント ID。アプリケーションに sessionSettings が含まれている場合は、clientId を使用する必要があります。
    • DRY_RUN_ACCESS_LEVEL_2: アクセスレベルの名前(accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME の形式)。
  2. アクセス バインディングを作成します。

    gcloud access-context-manager cloud-bindings create
      --organization ORG_ID
      --group-key GROUP_ID
      --binding-file BINDING_FILE_PATH
      --dry-run-level DEFAULT_DRY_RUN_ACCESS_LEVEL
    

    次のように置き換えます。

    • ORG_ID: 組織 ID。
    • GROUP_ID: グループ ID。グループ ID を利用できない場合は、グループ リソースの get メソッドを呼び出すことで取得できます。
    • BINDING_FILE_PATH: アクセス バインディング スキームを含む YAML ファイルのパス。バインディング ファイルは scopedAccessSettings のみをサポートします。
    • DEFAULT_DRY_RUN_ACCESS_LEVEL_2: オプションのアクセスレベル名(accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME の形式)。

    このフラグを指定すると、YAML で指定されていない場合、デフォルトで指定されたドライラン アクセスレベルがすべてのアプリケーションに適用されます。

API

  1. JSON 本文を作成します。

    {
      "group_key": "GROUP_ID",
       //
       // Optional; if specified, all applications that aren't defined in
       // scopedAccessSettings have these access levels applied.
       //
       // If more than one access level is specified, the user is
       // granted access if any one resolves to TRUE (OR logic, not AND).
       //
       // If you omit this key entirely, then no policy enforcement is
       // be applied by default.
       //
      "access_levels": [
        "DEFAULT_ACCESS_LEVEL"
      ],
       //
       // Optional; if specified, all applications that aren't defined in
       // scopedAccessSettings will have these dry run access levels applied.
       //
      "dry_run_access_levels": [
        "DEFAULT_DRY_RUN_ACCESS_LEVEL"
      ],
      "scoped_access_settings": [
        {
          "scope": {
            "client_scope": {
              "restricted_client_application": {
                "name": "CLIENT_NAME"
              }
            }
          },
          "active_settings": {
            "access_levels": [
              "ACCESS_LEVEL_A"
            ]
          },
          "dry_run_settings": {
            "access_levels": [
              "DRY_RUN_ACCESS_LEVEL_1"
            ]
          }
        },
        {
          "scope": {
            "client_scope": {
              "restricted_client_application": {
                "client_id": "CLIENT_ID"
              }
            }
          },
          "active_settings": {
            "access_levels": [
              "DRY_RUN_ACCESS_LEVEL_2"
            ]
          }
        }
      ]
    }
    

    次のように置き換えます。

    • GROUP_ID: グループ ID。グループ ID を利用できない場合は、グループ リソースの get メソッドを呼び出すことで取得できます。
    • DEFAULT_ACCESS_LEVEL: 省略可能なアクセスレベル名。形式は accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME です。POLICY_ID はアクセス ポリシー ID に、ACCESS_LEVEL_NAME はアクセスレベル名に置き換えます。
    • DEFAULT_DRY_RUN_ACCESS_LEVEL: オプションのアクセスレベル名(accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME の形式)。
    • CLIENT_NAME: クライアント名。アプリケーションに sessionSettings が含まれている場合、クライアント名を使用できません。代わりに、OAuth クライアント ID を使用してください。
    • ACCESS_LEVEL_A: アクセスレベルの名前(accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME の形式)。
    • DRY_RUN_ACCESS_LEVEL_1: accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME 形式のアクセスレベル名。
    • CLIENT_ID: OAuth クライアント ID。アプリケーションに sessionSettings が含まれている場合は、client_id を使用する必要があります。
    • DRY_RUN_ACCESS_LEVEL_2: accessPolicies/POLICY_ID/accessLevels/ACCESS_LEVEL_NAME 形式のアクセスレベル名。
  2. POST リクエストを送信します。

    https://accesscontextmanager.googleapis.com/v1/organizations/ORG_ID/gcpUserAccessBindings
    

    ORG_ID は、Cloud Access Binding Admin ロールの作成に使用した組織の ID です。access-context-manager/organization プロパティが設定されていない場合は、オプションの --organization フラグの ORG_ID を、Cloud Access Binding 管理者ロールの作成時に使用した組織の ID に置き換えます。

    成功すると、JSON オブジェクトの表現が返されます。問題がある場合は、エラー メッセージが表示されます。

ドライランのログを表示する

ドライランを設定したら、ログを確認して、拒否されたアクセス試行を確認できます。

次の表に、クエリを作成して実行し、ログを取得するために使用できるログフィールドを示します。

フィールド名 説明
protoPayload.authenticationInfo.principalEmail アクセスが拒否されたプリンシパルのメール ID。
protoPayload.metadata.deniedApplications アクセスが拒否されたアプリケーションの名前。
protoPayload.metadata.evaluationResult 有効なアクセス ポリシーの評価結果。有効な値は GRANTED または DENIED です。
protoPayload.metadata.appliedAccessLevels アクティブなアクセス ポリシーで必要な適用済みのアクセスレベル。
protoPayload.metadata.appliedDryRunAccessLevels ドライラン アクセス ポリシーで必要な適用済みのアクセスレベル。
protoPayload.metadata.dryRunEvaluationResult ドライラン アクセス ポリシーの評価結果。アクセス ポリシーが適用されたときの意図されたアクションを示します。有効な値は GRANTED または DENIED です。

ログのクエリを作成する方法については、Logging のクエリ言語をご覧ください。