API キーに制限を追加する

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

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

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

始める前に

このページでは、curl と Google Cloud CLI を使用して API Keys 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 を許可する allowedReferers リストに 2 つの URL を設定する必要があります。
  1. サブドメインを付けないドメインの URL、およびパスのワイルドカードを含む URL。例:
    example.com/*
  2. サブドメインのワイルドカードとパスのワイルドカードを含む 2 つ目の URL。例:
    *.example.com/*
特定の URL を許可する 正確なパスの URL を追加してください。例:
www.example.com/path
www.example.com/path/path
1 つのサブドメインまたはネイキッド ドメイン内の任意の URL を許可する ドメイン全体を許可するには、「allowedReferers」リストに 2 つの URL を設定する必要があります。
  1. 末尾にスラッシュを付けないドメインの URL。例:
    www.example.com
    sub.example.com
    example.com
  2. パスにワイルドカードを含めた、ドメインの 2 つ目の URL。例:
    www.example.com/*
    sub.example.com/*
    example.com/*

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

API キーの使用を許可する呼び出し元(ウェブサーバーや cron ジョブなど)の IP アドレスを 1 つ以上指定できます。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

次の例は、フィンガープリントとパッケージ名を使用して androidKeyRestrictions に API キーを作成する方法を示しています。

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 キーを使用した呼び出しを許可する API を指定できます。 Google Cloud すべての 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"
        }
      ]
    },
  }'

Google 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"
  }'

次のステップ