アプリのセキュリティの概要

リージョン ID

REGION_ID は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国や州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。2020 年 2 月以降に作成されたアプリの場合、REGION_ID.r は App Engine の URL に含まれています。この日付より前に作成されたアプリの場合、URL のリージョン ID は省略可能です。

詳しくは、リージョン ID をご覧ください。

セキュリティは Google Cloud の中核機能ですが、App Engine アプリの保護や脆弱性の特定には、他にも行うべきことがいくつかあります。

以下の機能を使用して、App Engine アプリのセキュリティを確保します。Google セキュリティ モデルと Google Cloud プロジェクトを保護する手順の詳細については、Google Cloud Platform のセキュリティをご覧ください。

HTTPS リクエスト

App Engine アプリに安全にアクセスするには HTTPS リクエストを使用します。アプリの構成に応じて、次のオプションがあります。

appspot.com のドメイン
  • Google Cloud プロジェクトの default サービスに HTTPS リクエストを送信するには、https の URL 接頭辞を使用します。次に例を示します。
    https://PROJECT_ID.REGION_ID.r.appspot.com
  • App Engine アプリで特定のリソースを対象とするには、-dot- 構文を使用して対象とする各リソースを区切ります。次に例を示します。
    https://VERSION-dot-SERVICE-dot-PROJECT_ID.REGION_ID.r.appspot.com

  • HTTP URL を HTTPS URL に変換するには、各リソース間のピリオドを -dot- に置き換えます。次に例を示します。
    http://SERVICE_ID.PROJECT_ID.REGION_ID.r.appspot.com
    https://SERVICE_ID-dot-PROJECT_ID.REGION_ID.r.appspot.com

HTTPS URL と対象とするリソースの詳細については、リクエストのルーティング方法をご覧ください。

カスタム ドメイン

カスタム ドメインで HTTPS リクエストを送信する場合は、App Engine によってプロビジョニングされたマネージド SSL 証明書を使用します。詳細については、SSL によるカスタム ドメインの保護をご覧ください。

アプリハンドラ

アプリのハンドラで強制的に HTTPS を使用する場合は、app.yaml 内の各ハンドラに対して secure: always 要素を指定できます。次に例を示します。

handlers:
- url: /.*
  script: auto
  secure: always
  redirect_http_response_code: 301

secure: always を使用すると、すべての HTTP トラフィックが同じパスの HTTPS URL にリダイレクトされます。詳細については、app.yaml 構成リファレンスをご覧ください。

アクセス制御

各 Google Cloud プロジェクトで、App Engine など、プロジェクト内のサービスにアクセスできるユーザーを決定するアクセス制御を設定します。アカウントごとに異なるロールを割り当てて、各アカウントにアプリをサポートするために必要な権限のみを付与できます。詳細については、アクセス制御の設定をご覧ください。

App Engine ファイアウォール

App Engine ファイアウォールでは、指定した範囲の IP アドレスからのリクエストを許可または拒否する一連のルールを使用して、App Engine アプリへのアクセスを制御できます。ファイアウォールでブロックされたトラフィックまたは帯域幅に対しては課金されません。ファイアウォールを作成すると、次のことを行うことができます。

特定のネットワーク内のトラフィックのみを許可する
特定のネットワークの特定の IP アドレス範囲にのみアプリへのアクセスを許可します。たとえば、アプリのテスト段階で、会社のプライベート ネットワーク内の IP アドレス範囲のみを許可するルールを作成します。その後アプリのリリース プロセスが一般公開に向けて進む過程でファイアウォール ルールを随時作成、変更し、社内または外部の特定の組織にのみアプリへのアクセスを許可できます。
特定のサービスからのトラフィックのみを許可する
App Engine アプリに対するすべてのトラフィックが特定のサービス経由でプロキシ送信されるように設定します。たとえば、サードパーティのウェブ アプリケーション ファイアウォール(WAF)を使用してアプリに対するリクエストをプロキシ処理する場合、WAF から転送されてきたリクエスト以外をすべて拒否するようなファイアウォール ルールを作成できます。
不正な IP アドレスをブロックする
Google Cloud には攻撃を防ぐさまざまなメカニズムが用意されています。App Engine ファイアウォールを使用すると、悪意のある行動を示す IP アドレスからアプリに向けられたトラフィックをブロックできます。サービス拒否攻撃などの不正行為からアプリを保護することもできます。IP アドレスまたはサブネットワークを拒否リストに追加すると、それらのアドレスやサブネットワークからルーティングされたリクエストを App Engine アプリに到達する前に拒否できます。

ルールの作成とファイアウォールの構成の詳細については、ファイアウォールによるアクセスの制御をご覧ください。

上り(内向き)制御

このセクションでは、上り(内向き)設定を使用して、App Engine アプリへのネットワーク アクセスを制限する方法について説明します。ネットワーク レベルのデフォルトでは、インターネット上のリソースは appspot URL または App Engine で設定されたカスタム ドメインの App Engine アプリにアクセスできます。たとえば、appspot.com の URL の形式は SERVICE_ID.PROJECT_ID.REGION_ID.r.appspot.com です。

このデフォルトを変更するには、上り(内向き)に別の設定を指定します。デフォルトの appspot.com URL を含むすべての上り(内向き)パスは、上り(内向き)設定の対象となります。上り(内向き)はサービスレベルで設定されます。

使用可能な上り(内向き)設定

次の設定を使用できます。

設定 説明
内部 最も厳しい。プロジェクトの VPC ネットワークに接続されている次のようなリソースからのリクエストを許可します。
これらのソースからのリクエストは、appspot.com URL でサービスにアクセスする場合でも、Google ネットワーク内にとどまります。インターネットを含む他のソースからのリクエストは、appspot.com URL またはカスタム ドメインのサービスに到達できません。マルチテナンシー(同じプロジェクト内の複数の信頼ドメイン)はサポートされていません。
内部と Cloud Load Balancing 次のリソースからのリクエストを許可します。
  • より厳しい内部設定によって許可されるリソース
  • 外部アプリケーション ロードバランサ
内部と Cloud Load Balancing の設定を使用して、インターネットから直接ではなく、外部アプリケーション ロードバランサ経由でリクエストを受け入れます。appspot.com URL へのリクエストは外部アプリケーション ロードバランサをバイパスします。この設定により、外部リクエストは appspot.com URL に到達しません。
すべて 最も寛容。インターネットから appspot.com の URL に直接送信されるリクエストを含むすべてのリクエストを許可します。

内部サービスへのアクセス

次のことに注意してください。

  • 共有 VPC からのリクエストの場合、App Engine アプリが共有 VPC ホスト プロジェクトにデプロイされている場合にのみ、トラフィックは内部とみなされます。App Engine アプリが共有 VPC サービス プロジェクトにデプロイされている場合は、アプリ自身のプロジェクトが所有するネットワークからのトラフィックのみが内部とみなされます。他のすべてのトラフィック(他の共有 VPC からのトラフィックを含む)は外部となります。

  • 内部サービスにアクセスする場合は、公開 URL(デフォルトの appspot.com URL または App Engine で設定されたカスタム ドメイン)を使用して、通常どおりに呼び出します。

  • Compute Engine VM インスタンスからのリクエストの場合や、同じプロジェクトの VPC ネットワーク内で実行されている他のリソースからのリクエストの場合、さらなる設定は必要ありません。

  • 他の App Engine サービスからのリクエストの場合や、同じプロジェクトの Cloud Run または Cloud Run functions からのリクエストの場合は、共有 VPC ネットワークへの接続の説明にあるように、サービスまたは関数を VPC ネットワークに接続して、すべての下り(外向き)をコネクタ経由でルーティングします。

  • 同じプロジェクトの VPC ネットワーク内のリソースからのリクエストは、送信元のリソースがパブリック IP アドレスを持っていても、内部に分類されます。

  • Cloud VPN 経由で VPC ネットワークに接続されているオンプレミス リソースからのリクエストは、internal とみなされます。

上り(内向き)設定を表示する

Console

  1. App Engine の [サービス] ページに移動します。

    [サービス] ページに移動

  2. [上り(内向き)] 列を見つけます。サービスごとに、この列の値に上り(内向き)設定が [すべて](デフォルト)、[内部 + ロード バランシング]、[内部] のいずれかとして表示されます。

gcloud

gcloud CLI を使用してサービスの上り(内向き)設定を表示するには:

gcloud app services describe SERVICE

SERVICE は、実際のサービス名に置き換えます。

たとえば、デフォルト サービスの上り(内向き)設定とその他の情報を表示するには、次のコマンドを実行します。

gcloud app services describe default

上り(内向き)設定を編集する

Console

  1. App Engine の [サービス] ページに移動します。

    [サービス] ページに移動

  2. 編集するサービスを選択します。

  3. [上り(内向き)設定を編集] をクリックします。

  4. メニューから必要な上り(内向き)設定を選択し、[保存] をクリックします。

gcloud

gcloud CLI を使用してサービスの上り(内向き)設定を更新するには:

gcloud app services update SERVICE --ingress=INGRESS

次のように置き換えます。

  • SERVICE: サービスの名前。
  • INGRESS: 適用する上り(内向き)の制御。allinternal-onlyinternal-and-cloud-load-balancing のいずれかです。

次に例を示します。

  • 同じプロジェクト内の Cloud Load Balancing と VPC ネットワークからのトラフィックのみを受け入れるように、App Engine アプリのデフォルト サービスを更新するには、次のコマンドを実行します。

    gcloud app services update default --ingress=internal-and-cloud-load-balancing
  • 同じプロジェクト内の VPC ネットワークからのトラフィックのみを受け入れるように、「internal-requests」という名前のサービスを更新するには、次のコマンドを実行します。

    gcloud app services update internal-requests --ingress=internal-only

下り(外向き)設定

サーバーレス VPC アクセスを使用している場合は、App Engine サービスの下り(外向き)設定を指定できます。

デフォルトでは、内部 IP アドレスと内部 DNS 名へのリクエストのみが、サーバーレス VPC アクセス コネクタ経由で転送されます。app.yaml ファイルで、サービスの下り(外向き)設定を指定できます。

下り(外向き)設定には URL 取得サービスとの互換性がありません。まだ行っていない場合は、ソケットを使用して urlfetch パッケージの明示的な使用を終了し、URL 取得のデフォルトを無効にします。urlfetch ライブラリを使用すると、下り(外向き)設定は無視され、リクエストはサーバーレス VPC アクセス コネクタ経由でルーティングされません。

App Engine サービスの下り(外向き)動作を構成するには:

  1. サービスの app.yaml ファイルの vpc_access_connector フィールドに egress_setting 属性を追加します。

    vpc_access_connector:
      name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR_NAME
      egress_setting: EGRESS_SETTING

    次のように置き換えます。

    • PROJECT_ID は、Google Cloud プロジェクト ID に置き換えます。
    • REGION は、コネクタが存在するリージョンに置き換えます。
    • CONNECTOR_NAME は、コネクタの名前に置き換えます。
    • EGRESS_SETTING は、次のいずれかに置き換えます。
      • private-ranges-only: デフォルト。IP アドレス範囲(RFC 1918RFC 6598)または内部 DNS 名へのリクエストのみが VPC ネットワークに転送されます。その他のリクエストはすべて直接インターネットに転送します。
      • all-traffic: サービスからの送信リクエストをすべて VPC ネットワークに転送します。その後、リクエストは VPC ネットワークのファイアウォール、DNS、ルーティングの各ルールに従って処理されます。すべての送信リクエストを VPC ネットワークに転送すると、サーバーレス VPC アクセス コネクタによって処理される下り(外向き)の量が増加し、料金が発生する可能性があります。
  2. サービスをデプロイします。

    gcloud app deploy
    

Security Scanner

Google Cloud の Web Security Scanner は、App Engine アプリをクロールし、開始 URL の範囲内にあるすべてのリンクを追跡して、できるだけ多くのユーザー入力とイベント ハンドラを実行します。

Security Scanner を使用するには、Google Cloud プロジェクトのオーナーである必要があります。ロールを割り当てる方法の詳細については、アクセス制御の設定をご覧ください。

Google Cloud コンソールからセキュリティ スキャンを実行することで、App Engine アプリの脆弱性を特定できます。Security Scanner の実行方法については、Web Security Scanner の使用をご覧ください。