OAuth クライアントの共有方法

このページでは、OAuth クライアントを組織内の他のアプリと共有する方法について説明します。

概要

OAuth クライアントをプロジェクト間で共有すると、組織内のすべてのアプリ向けに新しい OAuth クライアントを手動で作成する必要がなくなります。1 つの OAuth クライアントを手動で作成したら、それをプログラムで複数のアプリに割り当てることができます。

OAuth クライアントの共有は、Identity-Aware Proxy(IAP)を有効にしたいが [認証情報] ページにアクセスできないエージェントと OAuth クライアントを共有するためにも使用されます。

OAuth クライアントの共有は、アプリケーションがブラウザフローで Google が管理する OAuth クライアントを使用していて、アプリケーションへのプログラムによるアクセスを有効にする場合にも使用されます。

準備

OAuth クライアントの作成の手順を実行して新しい OAuth クライアントを作成するか、既存の OAuth クライアントを使用します。

プログラムからのアクセス

このセクションでは、OAuth クライアントのプログラムによるアプリケーションへのアクセスを有効にする手順について説明します。

  1. プログラムによるアクセスのために、OAuth クライアントを許可リストに登録します。

    アプリケーションへのプログラムによるアクセスを提供する、組織所有の OAuth クライアント ID のリストを許可リストに登録できます。

    組織レベル、プロジェクト レベル、フォルダレベルで、リソースとサービスに対する OAuth クライアントを許可リストに登録できます。

    gcloud

    1. 次のコマンドを実行して SETTING_FILE ファイルを準備します。 必要に応じて値を更新します。

        cat << EOF > SETTING_FILE
          access_settings:
            oauth_settings:
              programmatic_clients: ["clientId1", "clientId2", ..]
        EOF
      
    2. gcloud iap settings set コマンドを使用して、OAuth クライアントを必要なレベルで許可リストに登録します。

      gcloud iap settings set SETTING_FILE [--organization=ORGANIZATION --folder=FOLDER --project=/PROJECT --resource-type=RESOURCE_TYPE --service=SERVICE --version=VERSION
      

      コマンドの例:

      組織内のリソースで OAuth クライアント ID を許可リストに登録するには、次のコマンドを実行します。

        gcloud iap settings set SETTING_FILE --organization=ORGANIZATION
        

      フォルダ内のリソースの OAuth クライアント ID を許可リストに登録するには、次のコマンドを実行します。

        gcloud iap settings set SETTING_FILE --folder=FOLDER
        

      プロジェクト内のすべてのウェブタイプ リソースで OAuth クライアント ID を許可リストに登録するには、次のコマンドを実行します。

        gcloud iap settings set SETTING_FILE --project=PROJECT --resource-type=iap_web
        

      プロジェクト内の App Engine サービスで OAuth クライアント ID を許可リストに登録するには、次のコマンドを実行します。

        gcloud iap settings set SETTING_FILE --project=PROJECT --resource-type=app-engine --service=SERVICE
        

      以下を置き換えます。

      • FOLDER: フォルダ ID。
      • ORGANIZATION: 組織 ID。
      • PROJECT: プロジェクト ID。
      • RESOURCE_TYPE: IAP リソースタイプ。app-engineiap_webcomputeorganization、またはfolder にする必要があります。
      • SERVICE: サービス名。resource-typecompute または app-engine の場合、これは省略可能です。
      • VERSION: バージョン名。これは compute に適用されず、resource-typeapp-engine の場合は省略可能です。

    API

    1. 次のコマンドを実行して iap_settings.json ファイルを準備します。必要に応じて値を更新します。

      cat << EOF > iap_settings.json
      {
        "access_settings": {
            "oauth_settings": {
                programmatic_clients: ["clientId1", "clientId2", ..]
              }
          }
      }
      EOF
      
    2. gcloud iap settings get コマンドを実行してリソース名を取得します。出力から名前フィールドをコピーします。
      次のステップで名前が必要になります。

      gcloud iap settings get [--organization=ORGANIZATION --folder=FOLDER --project=PROJECT --resource-type=RESOURCE_TYPE --service=SERVICE --version=VERSION]
      
    3. 次のコマンドの RESOURCE_NAME は、前のステップで取得した名前に置き換えます。IapSettings が更新されます。

      curl -X PATCH \
      -H "Authorization: Bearer $(gcloud auth print-access-token)" \
      -H "Accept: application/json" \
      -H "Content-Type: application/json" \
      -d @iap_settings.json \
      "https://iap.googleapis.com/v1/RESOURCE_NAME:iapSettings?updateMask=iapSettings.accessSettings.oauthSettings.programmaticClients"
      
  2. 許可リストに登録している OAuth クライアント ID のいずれかを使用して、アプリケーションにログインします。プログラムによる認証をご覧ください。

ブラウザによるアクセス

IAP で Google Cloud コンソールを使用してクライアント ID とシークレットを使用できるようにするには、次の手順を行います。

リスク

アプリ間でクライアントを共有すると便利ですが、リスクも伴います。このセクションでは、クライアントを共有する際の潜在的なリスクとその軽減方法について概説します。

単一障害点

1 つの OAuth クライアントを多くのアプリで使用すると、単一障害点が発生します。クライアントが誤って削除または変更されると、そのクライアントを使用するすべてのアプリが影響を受けます。

これを軽減するために、共有クライアントの重要なユースケースを満たす場合にのみクライアントを共有してください。

クライアント シークレットの漏洩

クライアントを共有するには、クライアント シークレットを人やスクリプトと共有する必要があります。これにより、クライアント シークレットが漏洩するリスクが高まります。IAP は、アプリから作成されたトークンと漏洩したクライアント シークレットから作成されたトークンを区別できません。

IAP リソースへのアクセスは Cloud Audit Logging で監視できます。クライアント シークレットが漏洩した可能性があると思われる場合は、[認証情報] ページでシークレットをリセットしてください。

このリスクを軽減するため、クライアント シークレットはパスワードと同様に保護してください。クライアント シークレットの共有を制限し、平文で保存しないようにします。

承認済みユーザーのなりすまし

クライアント シークレットが漏洩した場合、悪意のあるアプリがそのドメインに IAP 認証済みブラウザの Cookie を設定して、承認済みユーザーになりすます可能性があります。この Cookie が使用されると、IAP は漏洩したクライアント シークレットを共有するすべてのアプリでなりすましたユーザーを認証します。

このリスクを軽減するために、承認済みユーザーも共有しているリソース間でクライアントを共有しないでください。なりすましたユーザーが認証されても IAP がアクセスを承認しないようにするには、リソースごとの権限を設定してください。

ユーザー ID の収集

クライアント シークレットが漏洩した場合、悪意のあるアプリがクライアント ID を使用してアプリのユーザーの ID を収集する可能性があります。これはユーザーが悪意のあるアプリにアクセスしたときにトリガーされます。

ユーザーが IAP で保護されたアプリに初めてアクセスすると、自分の ID をアプリと共有するよう求められます。これにより、ユーザーは自分の個人情報を管理できるようになります。ユーザーが自分の ID を共有することに同意すると、Google ログイン システムはその同意を記録します。同じプロジェクト内の任意のクライアント ID からのその後のリクエストでは、IAP はユーザーに ID の再入力を求めません。

自分の ID をアプリと共有することに同意したユーザーが悪意のあるアプリにアクセスすると、同意なしに ID が直ちに共有されてしまいます。