IAP で保護されたリソースのアクセスレベルの作成と適用

このページでは、Access Context Manager を使用してアクセスレベルを作成し、Identity-Aware Proxy(IAP) で保護されるリソースに適用する方法について説明します。

概要

アクセスレベルは、発生源に基づいてリクエストに割り当てられた属性のセットです。デバイスタイプ、IP アドレス、ユーザー ID などの情報を使用して、付与するアクセスレベルを指定できます。たとえば、企業ネットワーク内からの接続には「High_Trust」レベルを、承認されたオペレーティング システムを実行している外部デバイスには「Medium_Trust」信頼を割り当てることが可能です。

Endpoint Verification を設定すると、アクセスレベルによってデバイス情報が収集、参照されます。Endpoint Verification は、企業リソースにアクセスするすべての企業のデバイスと個人のデバイスのインベントリを作成します。

アクセスレベルは、IAP で保護されたリソースに Identity and Access Management(IAM)条件として追加すると適用されます。 IAP では、ネットワーク レベルのファイアウォールを使用する代わりに、きめ細かなリソースレベルのアクセス制御モデルを適用できます。たとえば、「Medium_Trust」には多くのリソースが利用可能ですが、より機密性の高い特定のリソースには「High_Trust」レベルが必要であると指定できます。

詳細については、Access Context Manager の概要をご覧ください。

始める前に

事前に次の作業を行う必要があります。

  • IAP でリソースを保護する
  • エンドポイントの確認を設定するこれは、ストレージ暗号化ステータスなどのユーザー デバイス情報に基づいてリソースへのアクセスを制限する場合にのみ必要です。
  • プロジェクトで次のロールが付与されていることを確認します。

    • Access Context Manager 管理者
    • Access Context Manager 編集者

アクセスレベルの作成

次のプロセスでアクセスレベルを作成します。

この例では、内部監査者グループがプロジェクトの Google Cloud Observability にアクセスできるよう、アクセスレベルを作成するとします。監査者用のすべてのデバイスには、203.0.113.0 から 203.0.113.127 の範囲にあるサブネット上の IP が割り当てられています。また、それらのデバイスが確実に暗号化されるようにもしたいとします。監査者が使用しているデバイス以外は、そのサブネットに割り当てられません。

コンソール

  1. Google Cloud コンソールで [Access Context Manager] ページに移動します。

    [Access Context Manager] ページに移動

  2. プロンプトが表示されたら、組織を選択します。

  3. [Access Context Manager] ページの上部にある [新規] をクリックします。

  4. [新しいアクセスレベル] パネルの [条件] セクションで、[属性を追加]、[デバイス ポリシー] の順にクリックします。

  5. [ストレージの暗号化] プルダウンをクリックし、[暗号化あり] を選択します。このルールは、従業員のデバイスでエンドポイントの確認を設定した後にのみ機能します。

  6. [属性を追加] を再度クリックして、[IP サブネットワーク] を選択します。

  7. [IP サブネットワーク] ボックスに、CIDR ブロックとしてフォーマットされた 1 つ以上の IPv4 または IPv6 の範囲を入力します。

    この例では、アクセス権を監査者だけに制限するために、[IP サブネットワーク] ボックスに「203.0.113.0/25」と入力します。

  8. [保存] をクリックします。

gcloud

  1. CIDRブロックとしてフォーマットされた 1 つ以上の IPv4 または IPv6 の範囲が含まれるアクセスレベルの .yaml ファイルを作成します。

    この例では、アクセス権を監査者だけに制限するために、.yaml ファイルに次のように入力します。

    - ipSubnetworks:
        - 203.0.113.0/25
    - devicePolicy:
        allowedEncryptionStatuses
          - ENCRYPTED
    

    アクセスレベル属性と YAML 形式のリストについては、アクセスレベル属性をご覧ください。考えられるすべての属性を含む包括的な YAML ファイルについては、こちらのアクセスレベル YAML ファイルの例をご覧ください。

    devicePolicy ルールは、従業員のデバイスでエンドポイントの確認が設定された場合にのみ機能します。

  2. ファイルを保存します。この例では、ファイルの名前は CONDITIONS.yamlCONDITIONS.yaml です。

  3. アクセスレベルを作成します。

    gcloud access-context-manager levels create NAME \
       --title TITLE \
       --basic-level-spec CONDITIONS.yaml \
       --policy=POLICY_NAME

    ここで

    • NAME はアクセスレベルの一意の名前です。先頭は英字にしてください。その後には英字、数字、アンダースコアのみ使用できます。

    • TITLE は人が読める形式のタイトルです。タイトルはポリシーに固有のものでなければなりません。

    • POLICY_NAME は組織のアクセス ポリシーの名前です。

    次のような出力が表示されます。

    Create request issued for: NAME
    Waiting for operation [accessPolicies/POLICY_NAME/accessLevels/NAME/create/1521594488380943] to complete...done.
    Created level NAME.
    

API

  1. CIDR ブロックとしてフォーマットされた 1 つ以上の IPv4 または IPv6 の範囲と、暗号化されたストレージを必要とするデバイス ポリシーが含まれる AccessLevel リソースを作成するリクエスト本文を作成します。

    この例では、アクセス権を監査者だけに制限するために、リクエスト本文に次のように入力します。

    {
     "name": "NAME",
     "title": "TITLE",
     "basic": {
       "conditions": [
         {
           "ipSubnetworks": [
             "203.0.113.0/25"
           ]
         },
         {
         "devicePolicy": [
           "allowedEncryptionStatuses": [
             "ENCRYPTED"
           ]
         ]
         }
       ]
     }
    }

    ここで

    • NAME はアクセスレベルの一意の名前です。先頭は英字にしてください。その後には英字、数字、アンダースコアのみ使用できます。

    • TITLE は人が読める形式のタイトルです。タイトルはポリシーに固有のものでなければなりません。

  2. accessLevels.create を呼び出してアクセスレベルを作成します。

    POST https://accesscontextmanager.googleapis.com/v1/accessPolicies/POLICY_NAME/accessLevels

    ここで

    • POLICY_NAME は組織のアクセス ポリシーの名前です。

アクセスレベルの適用

IAP で保護されたリソースには、IAP ロールをリソースにバインドする IAM ポリシーがあります。

IAM 条件付きバインディングを IAM ポリシーに追加すると、リクエスト属性に基づいてリソースに対するアクセスがさらに制限されます。リクエスト属性には、次のようなものがあります。

  • アクセスレベル
  • URL ホスト / パス
  • 日時

IAM 条件付きバインディングで指定された request.hostrequest.path に比較されるリクエスト値は一致している必要があります。たとえば /internal admin で始まるパスへのアクセスを制限した場合、/internal%20admin に移動すると、この制限を回避できます。詳細については、ホスト名とパスの条件の使用をご覧ください。

次の手順では、IAM ポリシーを更新して IAP で保護されたリソースにアクセスレベルを追加する方法を示しています。

Console

  1. IAP 管理ページに移動します。

    IAP 管理ページに移動

  2. IAM の権限を更新するリソースの横にあるチェックボックスをオンにします。

  3. 右側の情報パネルで [プリンシパルを追加] をクリックします。

  4. [新しいプリンシパル] ボックスに、ロールの割り当て先にするプリンシパルを入力します。

  5. [ロールを選択] プルダウン リストで、[IAP で保護されたウェブアプリ ユーザー] ロールを選択します。

  6. 既存のアクセスレベルを指定するには、[アクセスレベル] プルダウン リストから選択します。[IAP で保護されたウェブアプリ ユーザー] のロールを選択する必要があります。また、既存のアクセスレベルを表示する組織レベルの権限が必要です。

    1 つのリソースに複数のアクセスレベルを適用すると、選択したアクセスレベルの少なくとも 1 つで指定されている条件をユーザーが満たしていれば、そのユーザーにこのリソースへのアクセス権が付与されます(リスト内のアクセスレベルの論理和(OR)です)。複数のアクセスレベル内の条件を満たしているユーザーにのみアクセス権を付与するには(アクセスレベルの論理積(AND))、複数のアクセスレベルから成るアクセスレベルを作成します。

  7. プリンシパルにロールを追加する場合は、[別のロールを追加] をクリックします。

  8. ロールの追加が完了したら、[保存] をクリックします。

gcloud

現時点では、gcloud CLI を使用して、プロジェクト レベルの条件付きバインディングの設定のみ行えます。

条件付きバインディングを設定するには、次の手順でプロジェクトの policy.yaml ファイルを編集します。

  1. 次の gcloud コマンドを使用して、アプリの IAM ポリシーを開きます。

    gcloud projects get-iam-policy PROJECT_ID > policy.yaml
  2. policy.yaml ファイルを編集して、次のものを指定します。

    • IAM 条件を適用するユーザーとグループ。
    • リソースにアクセス権を付与する iap.httpsResourceAccessor ロール。
    • アクセスレベル付き IAM 条件。

    次の条件により、ACCESS_LEVEL_NAME アクセスレベルの要件を満たし、リソースの URL パスが / で始まる場合、ユーザーとグループにアクセス権が付与されます。

    ...
    - members:
    - group:EXAMPLE_GROUP@GOOGLE.COM
    - user:EXAMPLE_USER@GOOGLE.COM
    role: roles/iap.httpsResourceAccessor
    condition:
        expression: "accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")
        title: CONDITION_TITLE
    ...
  3. set-iam-policy コマンドを実行して、ポリシーをアプリにバインドします。 gcloud projects set-iam-policy PROJECT_ID policy.yaml

API

アプリの policy.json ファイルを編集するには、アプリの種類に応じて以下の手順を行います。IAM API を使用してアクセス ポリシーを管理する方法については、IAP で保護されたリソースへのアクセスの管理をご覧ください。

以下のアプリケーション固有の API 手順を完了する前に、次の変数をエクスポートします。

 export PROJECT_NUM=PROJECT_NUMBER
 export IAP_BASE_URL=https://iap.googleapis.com/v1beta1/projects/${PROJECT_NUMBER}/iap_web
 # Replace POLICY_FILE.JSON with the name of JSON file to use for setIamPolicy
 export JSON_NEW_POLICY=POLICY_FILE.JSON
 

App Engine

  1. 次の App Engine 変数をエクスポートします。

    # The APP_ID is usually the project ID
    export GAE_APP_ID=APP_ID
    export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}

  2. getIamPolicy メソッドを使用して、App Engine アプリの IAM ポリシーを取得します。最後にある空のデータビットを使用して、curl リクエストを GET ではなく POST に変えます。

    curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -d '' ${GAE_BASE_URL}/:getIamPolicy

  3. IAM 条件バインディングを IAM ポリシーの JSON ファイルに追加します。次の例は、iap.httpsResourceAccessor ロールを 2 人のユーザーにバインドし、Chrome Enterprise Premium で保護されたリソースへのアクセスを許可する編集済みの policy.json ファイルを示しています。ACCESS_LEVEL_NAME アクセスレベルの要件を満たし、リソースの URL パスが / で始まる場合にのみリソースへのアクセスを許可する IAM 条件が追加されます。バインディングごとの条件は 1 つのみです。

    policy.json ファイルの例

    {
    "policy": {
      "bindings": [
            {
              "role": "roles/iap.httpsResourceAccessor",
              "members": [
                  "group:EXAMPLE_GROUP@GOOGLE.COM",
                  "user:EXAMPLE_USER@GOOGLE.COM"
              ],
              "condition": {
                "expression": ""accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")",
                "title": "CONDITION_NAME"
              }
            }
        ]
      }
    }

  4. setIamPolicy メソッドを使用して、新しい policy.json ファイルを設定します。

    curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    ${GAE_BASE_URL}:setIamPolicy -d @${JSON_NEW_POLICY}

App Engine のサービスとバージョン

App Engine サービス、すべてのバージョンまたはサービスの特定のバージョンの IAM ポリシーを更新することもできます。この処理を特定のバージョンのサービスに対して行うには:

  1. 次の追加変数をエクスポートします。
    export GAE_SERVICE=SERVICE_NAME
    export GAE_VERSION=VERSION_NAME
  2. エクスポートされた GAE_BASE_URL 変数を更新します。
    export GAE_BASE_URL=${IAP_BASE_URL}/appengine-${GAE_APP_ID}/services/${GAE_SERVICE}/versions/${GAE_VERSION}
  3. 前述の getIamPolicy コマンドと setIamPolicy コマンドを実行して、バージョンの IAM ポリシーを取得して設定します。

GKE と Compute Engine

  1. バックエンド サービスのプロジェクト ID をエクスポートします。

    export BACKEND_SERVICE_NAME=BACKEND_SERVICE_NAME

  2. getIamPolicy メソッドを使用して、Compute Engine アプリの IAM ポリシーを取得します。最後にある空のデータビットを使用して、curl リクエストを GET ではなく POST に変えます。

    curl -i -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:getIamPolicy \
     -d ''

  3. IAM 条件バインディングを IAM ポリシーの JSON ファイルに追加します。次の例は、iap.httpsResourceAccessor ロールを 2 人のユーザーにバインドし、Chrome Enterprise Premium で保護されたリソースへのアクセスを許可する編集済みの policy.json ファイルを示しています。ACCESS_LEVEL_NAME アクセスレベルの要件を満たし、リソースの URL パスが / で始まる場合にのみリソースへのアクセスを許可する IAM 条件が追加されます。バインディングごとの条件は 1 つのみです。


    policy.json ファイルの例

    {
      "policy": {
        "bindings": [
          {
            "role": "roles/iap.httpsResourceAccessor",
            "members": [
              "group":EXAMPLE_GROUP@GOOGLE.COM,
              "user:EXAMPLE_USER@GOOGLE.COM"
            ],
            "condition": {
              "expression": ""accessPolicies/ORGANIZATION_NUMBER/accessLevels/ACCESS_LEVEL_NAME" in request.auth.access_levels && request.path.startsWith("/")",
              "title": "CONDITION_NAME"
            }
          }
        ]
      }
    }

  4. setIamPolicy メソッドを使用して、新しい policy.json ファイルを設定します。

    curl -i -H "Content-Type:application/json" \
         -H "Authorization: Bearer $(gcloud auth print-access-token)" \
         ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:setIamPolicy \
         -d @${JSON_NEW_POLICY}