API キーに制限を追加する

API キーは Google Cloud に対してアプリケーションやウェブサイトを識別します。API キーの制限により、アプリとウェブサイトのみが鍵を使用できるようになります。セキュリティ上の理由から、以下を指定する制限を追加することをおすすめします。

クライアントが制限された API キーを使用して、API キーの制限を満たしていないリクエストを発行した場合、そのリクエストは失敗します。たとえば、API キーが特定のドメインから HTTP リクエストを発行する必要があるのに HTTP リクエストが別のドメインから受信された場合、そのリクエストはエラーで拒否されます。

CreateKey メソッドを使用して API キーを作成するときに制限を追加できます。また、UpdateKey メソッドを使用してキーの作成後に制限を追加することもできます。このページでは、API キーに追加できる制限と、それらの制限の追加方法について説明します。

始める前に

このページでは、oauth2l コマンドライン ツールで curl を使用して、API キーの API にリクエストを送信します。API を試すための詳細については、API キーを使ってみるをご覧ください。

クライアントの制限の追加

クライアントの制限では、API キーを使用できるウェブサイト、IP アドレス、またはアプリを指定します。クライアントの制限は、API を呼び出すクライアントのタイプに基づいて追加します。次のタイプのクライアント制限のいずれかを指定できます。

  • browserKeyRestrictions: キーの使用が許可されている HTTP リファラー(ウェブサイト)。
  • serverKeyRestrictions: 鍵の使用が許可されている発信者の IP アドレス。
  • androidKeyRestrictions: キーの使用が許可されている Android アプリ。
  • iosKeyRestrictions: 鍵の使用が許可されている iOS アプリ。

ブラウザの制限を追加する

次の例は、UpdateKey メソッドを呼び出して、HTTP リファラーを www.example.com に制限する方法を示します。

gcurl https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys/KEY_ID?updateMask=restrictions \
  --request PATCH \
  --data '{
    "restrictions" : {
      "browserKeyRestrictions": {
        "allowedReferrers": "www.example.com"
      }
    }
    "etag": "ETAG"
  }'

operations.get からのレスポンスに "done": true が含まれている場合、response には制限のある最新の Key が含まれます。

次の例は、特定の URL のリストから HTTP リクエストのみを許可する新しい API キーを作成する方法を示しています。

gcurl https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys \
  --request POST \
  --data '{
    "displayName" : "API key with browser restrictions",
    "restrictions" : {
      "browserKeyRestrictions": {
        "allowedReferrers": ["www.example.com", "www.example-2.com"]
      }
    }
  }'

次の表に、シナリオとブラウザの制限の例を示します。

事例 制限事項
サイトのすべての URL を許可する 「allowedReferrers」リストに 2 つの URL を設定する必要があります。
  1. サブドメインなしのドメインの URL、パスのワイルドカード。例:
    example.com/*
  2. 2 番目の URL。サブドメインのワイルドカードとパスのワイルドカードが含まれます。例:
    *.example.com/*
特定の URL を許可する 正確なパスの URL を追加します。例:
www.example.com/path
www.example.com/path/path
1 つのサブドメインまたはネイキッド ドメイン内の任意の URL を許可する ドメイン全体を許可するには、`allowedReferrers` リストに 2 つの URL を設定する必要があります。
  1. 末尾にスラッシュを付けないドメインの URL。例:
    www.example.com
    sub.example.com
    example.com
  2. パスのワイルドカードを含むドメインの 2 番目の URL。 例:
    www.example.com/*
    sub.example.com/*
    example.com/*

サーバーの制限を追加する

呼び出し元の 1 つ以上の IP アドレス(ウェブサーバーや cron ジョブなど)を、API キーの使用を許可することができます。IP アドレスは、次のいずれかの形式で指定できます。

  • IPv4(198.51.100.1
  • IPv6(2001:db8::1
  • CIDR 表記を使用するサブネット(198.51.100.0/242001:db8::/64

次の例は、allowedIps のリストで API キーを作成する方法を示しています。

gcurl https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys  \
  --request POST \
  --data  '{
    "displayName" : "API key with server restrictions with IPv4, IPv6 and CIDR",
    "restrictions" : {
      "serverKeyRestrictions": {
        "allowedIps": ["198.51.100.1","198.51.100.0/24","2001:db8::1","2001:db8::/64"]
      }
    }
  }'

Android の制限の追加

API キーの使用を Android アプリのみに制限できます。API キーの作成時または更新時に、アプリごとにパッケージ名と 20 バイトの SHA-1 フィンガープリントを指定します。

たとえば、keytool ユーティリティを実行し、次のフィンガープリントを作成したとします。

  Certificate fingerprint: SHA1: DA:39:A3:EE:5E:6B:4B:0D:32:55:BF:EF:95:60:18:90:AF:D8:07:09

次の例は、API キーを指紋とパッケージ名とともに androidKeyRestrictions に追加する方法を示しています。

gcurl https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys  \
  --request POST \
  --data  '{
    "displayName" : "API key with Android restrictions",
    "restrictions" : {
      "androidKeyRestrictions": {
        "allowedApplications": [
          {
            "sha1Fingerprint": "DA:39:A3:EE:5E:6B:4B:0D:32:55:BF:EF:95:60:18:90:AF:D8:07:09",
            "packageName": "com.example.my.app"
          }
        ]
      }
    }
  }'

iOS での制限を追加する

キーの作成時または更新時に各アプリのバンドル ID を指定することで、API キーの使用を iOS アプリのみに制限できます。次の例は、API キーを作成するときに iosKeyRestrictions を設定する方法を示しています。

gcurl https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys  \
  --request POST \
  --data  '{
    "displayName" : "API key with iOs restrictions",
    "restrictions" : {
      "iosKeyRestrictions": {
        "allowedBundleIds": ["com.example.my.app1", "com.example.my.app2"]
      }
    }
  }'

API 制限を追加する

API の制限を使用すると、API キーで呼び出す Google Cloud API を指定できます。すべての API キーにクライアントと API の制限を追加することをおすすめします。

API の制限では、1 つ以上のサービスを指定できます。次の例は、新しい API キーの使用を、translate.googleapis.comdatastore.googleapis.com のサービスのみに制限する方法を示しています。

gcurl https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys  \
  --request POST \
  --data '{
    "restrictions": {
      "api_targets": [
        {
          "service": "translate.googleapis.com"
        },
        {
          "service" : "datastore.googleapis.com"
        }
      ]
    },
  }'

Cloud プロジェクトで有効になっているサービスのリストを取得するには、gcloud services list コマンドを使用します。

特定のサービスで使用する API キーを制限するだけでなく、各サービスのメソッドを指定して API キーをさらに制限することもできます。次の例は、以前の鍵を translate.googleapis.com の許可されたメソッドのみに制限する方法を示しています。

gcurl https://apikeys.googleapis.com/v2/projects/PROJECT_NUMBER/locations/global/keys/KEY_ID?updateMask=restrictions  \
  --request PATCH \
  --data '{
    "restrictions": {
      "api_targets": [
        {
          "service": "translate.googleapis.com"
          "methods": [
            "Get*",
            "DetectLanguage"
          ]
        },
        {
          "service" : "datastore.googleapis.com"
        }
      ]
    },
    "etag": "ETAG"
  }'

次のステップ