Node.js 12が一般提供になりました。

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

リージョン ID

REGION_ID は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国や州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。既存のアプリでは省略可能ですが、まもなく、新しいアプリのすべてにおいて App Engine の URL に REGION_ID.r を含めることが必須となる予定です。

移行がスムーズに行われるように、リージョン ID を使用するよう App Engine を徐々に更新しています。Google Cloud プロジェクトがまだ更新されていない場合、アプリにリージョン ID が表示されません。ID は既存のアプリでは省略可能なため、リージョン ID が既存のアプリで使用可能になったときに、URL の更新や他の変更を行う必要はありません。

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

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

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

HTTPS リクエスト

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

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

  • ヒント: 各リソース間のピリオドを -dot- に置き換えるだけで、HTTP の URL を HTTPS に変換できます。以下に例を示します。
    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 構成リファレンスをご覧ください。

アクセス制御

各 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 またはアプリ用に構成したカスタム ドメインに送信されるすべての HTTP リクエストを受信します。

ネットワークの上り(内向き)制御を使用してトラフィックを制限することで、アプリが特定の送信元からの HTTP リクエストのみを受信するようにできます。

  • すべて: (デフォルト)アプリはインターネットから送信された直接リクエストを含むすべてのトラフィックを受信します。

  • 内部専用: アプリは同じプロジェクト内の VPC ネットワークから送信されたリクエストのみを受信します。

  • 内部負荷分散と Cloud Load Balancing: アプリは Cloud Load Balancing 経由でルーティングされたリクエスト、または同じプロジェクト内の VPC ネットワークから送信されたリクエストのみを受信します。

上り(内向き)制御を設定するには、gcloud app services update コマンドを使用します。

例:

  • 同じプロジェクト内の 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
  • デフォルト サービスの上り(内向き)設定とその他の情報を表示します。

    gcloud app services describe default

Security Scanner

Google Cloud Security Scanner は、App Engine アプリのクロール、開始 URL 範囲内におけるすべてのリンクの追跡、可能な限り多くのユーザー入力とイベント ハンドラの実行を試みることにより脆弱性を検出します。

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

Google Cloud Console からセキュリティ スキャンを実行することで、App Engine アプリの脆弱性を特定できます。Security Scanner の実行について詳しくは、Security Scanner クイックスタートをご覧ください。