アクセスレベルの作成と適用

このページでは、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 オペレーション スイートにアクセスできるアクセスレベルを作成するとします。監査者用のすべてのデバイスには、203.0.113.0 から 203.0.113.127 の範囲にあるサブネット上の IP が割り当てられています。また、ユーザーのデバイスが確実に暗号化されるようにする必要があります。監査者が使用しているデバイス以外は、そのサブネットに割り当てられません。

Console

  1. Cloud Console で [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.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 で保護されたリソースにアクセスレベルを追加する方法を示しています。

コンソール

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

    IAP 管理ページに移動

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

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

  4. [新しいメンバー] ボックスに、ロールを割り当てるメンバーを入力します。

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

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

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

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

gcloud

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

条件付きバインディングを設定するには、次の手順でプロジェクトの 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 を操作する前に、次の操作を行います。

  1. アプリがデプロイされているプロジェクトで、サービス アカウントを作成します。
  2. gcloud auth activate-service-account を使用して、新しいサービス アカウントを認証します。
  3. 新しいサービス アカウントの JSON 認証情報ファイルをダウンロードします。

    1. [サービス アカウント] ページに移動します。
      [サービス アカウント] ページに移動

    2. サービス アカウントのメールアドレスをクリックします。

    3. [編集] をクリックします。

    4. [鍵を作成] をクリックします。

    5. キーのタイプとして JSON を選択します。

    6. [作成] をクリックします。表示された確認ウィンドウを閉じて、新しいキーを作成します。

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

    export PROJECT_NUM=PROJECT_NUMBER
    export IAP_BASE_URL=https://iap.googleapis.com/v1beta1/projects/${PROJECT_NUMBER}/iap_web
    # Replace with the path to your local service account's downloaded JSON file
    export JSON_CREDS=EXAMPLE.IAM.GSERVICEACCOUNT.COM.JSON
    # Replace POLICY_FILE.JSON with the name of JSON file to use for
    setIamPolicy export JSON_NEW_POLICY=POLICY_FILE.JSON
    

  5. 次のコマンドを実行し、Oauth2l を使用してサービス アカウント認証情報の JSON ファイルを OAuth アクセス トークンに変換します。

    oauth2l header --json ${JSON_CREDS} cloud-platform

  6. 上のコマンドを初めて実行した場合、プロンプトが表示されたら次の操作を行います。

    1. 表示されたリンクをクリックしてコードをコピーし、確認コードを取得します。
    2. アプリのプロンプトに確認コードを貼り付けます。
    3. 返された署名なしトークンをコピーします。
    4. 返された署名なしトークンが割り当てられた変数をエクスポートします。
      export CLOUD_OAUTH_TOKEN=AUTHORIZATION_BEARER_TOKEN
  7. このコマンドを以前に実行している場合、次の変数をエクスポートします。

    export CLOUD_OAUTH_TOKEN ="$(oauth2l header --json ${JSON_CREDS} cloud-platform)"

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 "${CLOUD_OAUTH_TOKEN}" ${GAE_BASE_URL}/:getIamPolicy \
         -d ''
    

  3. IAM 条件バインディングを IAM ポリシーの JSON ファイルに追加します。次の例は、iap.httpsResourceAccessor ロールを 2 人のユーザーにバインドし、コンテキストアウェア アクセスで保護されたリソースへのアクセスを許可する編集済みの 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 "${CLOUD_OAUTH_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 "${CLOUD_OAUTH_TOKEN}" ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:getIamPolicy \
         -d ''

  3. IAM 条件バインディングを IAM ポリシーの JSON ファイルに追加します。次の例は、iap.httpsResourceAccessor ロールを 2 人のユーザーにバインドし、コンテキストアウェア アクセスで保護されたリソースへのアクセスを許可する編集済みの 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 "$(oauth2l header --json ${JSON_CREDS} cloud-platform)" \
         ${IAP_BASE_URL}/compute/services/${BACKEND_SERVICE_NAME}:setIamPolicy \
         -d @${JSON_NEW_POLICY}