ファイアウォールによるアクセスの制御

ファイアウォールは、App Engine アプリにアイデンティティに依存しないアクセス制御を提供します。App Engine ファイアウォールでは、IP アドレスとサブネットの範囲を許可または制限するルールを 1,000 個まで定義できます。

ファイアウォールを構成するには、優先度値、アクセスを許可または拒否する IP アドレスの範囲、および説明(省略可)を指定したルールを定義します。

アプリを安全に構成し、適切なアクセスのレベルを設定するには、アプリケーション セキュリティアクセス制御をご確認ください。

ファイアウォール ルールの構築

App Engine ファイアウォールは、指定した IP アドレスまたはアドレスの範囲からのアプリへのアクセスを許可または拒否するルールの順序付きリストで構成されます。このルールは、App Engine アプリケーションのすべてのリソースに適用されます。

ファイアウォール ルールは重要度別に並べられます。この重要度は、各ルールの優先度で数値として定義します。ルールの優先度値は、ファイアウォール内の他のルールとの相対的な重要度を定義します。したがって、各ルールに指定する値は一意でなければなりません。ルールの優先度値は 1 から 2147483647 で、値が小さいほど重要度が高くなります。

各ファイアウォールには default ルールが自動的に作成されます。このルールの優先度は 2147483647 に設定され、アプリの IP 範囲全体に適用されます。default ルールは、常にファイアウォール内で最後に評価され、すべての IP アドレスからのリクエストに適用されます。

ファイアウォールでは、最も優先度が高いルールが最初に評価されます。ファイアウォール内の残りのルールは、そのリクエストの IP 範囲と一致するルールが見つかるまで順番に評価されます。一致するルールが見つかると、接続が許可または拒否され、ファイアウォール内の残りのルールはすべてスキップされます。リクエストに一致する手動定義のルールがファイアウォール内にない場合、default ルールが評価されます。

たとえば、優先度が 1 のルールを作成すると、このルールが常に最初に評価されます。受信したリクエストが優先度 1 のルールと一致すると、このルールのみが評価され、ファイアウォール内の残りのルールはすべてスキップされます。default ルールも評価されません。

下のファイアウォールの例は、ルールの優先度がファイアウォールの動作にどのように影響するかを示しています。

始める前に

アプリにファイアウォールを作成するには、以下のいずれかの App Engine IAM 役割が必要です。これらの役割には、ファイアウォール ルールの作成または変更に必要な権限が含まれています。

  • App Engine 管理者
  • 編集者
  • オーナー

gcloud ツールまたは Admin API を使用する場合は、ツールをインストールして設定する必要があります。

キャッシュされたコンテンツへのアクセスの防止

App Engine ファイアウォールは、コンテンツ キャッシュ メカニズム(ウェブプロキシやブラウザなど)の背後に設置されます。コンテンツがキャッシュに保存されると、期限切れになるまでコンテンツは特定の URL から提供され、新しいファイアウォール ルールを作成してもそのコンテンツにはアクセスできます。

キャッシュに保存されたコンテンツのデフォルトの有効期限は 10 分です。有効期限の設定については、静的キャッシュの有効期限をご覧ください。

コンテンツがキャッシュに保存されないようにするには、Cache-ControlExpires の HTTP レスポンス ヘッダーを使用します。キャッシュの制御方法など、HTTP ヘッダーの詳細については、キャッシュの回避をご覧ください。

静的コンテンツの場合は、HTTP レスポンス ヘッダーを構成するようにスタンダード環境アプリを構成できます。アプリの構成ファイルに HTTP レスポンス ヘッダーを構成する方法については、リクエストの処理方法app.yaml リファレンスをご覧ください。

サービスからのリクエストを許可する

ルールを作成する場合は、次の点を考慮する必要があります。

  • デフォルトでは、ルールに一致しないリクエストには、アプリへのアクセスが許可されます。特定のルールと一致しないリクエストをすべてブロックするには、default ルールを deny に設定する必要があります。
  • default ルールが deny に設定されていても、タスクキューと Cron トラフィックはファイアウォールによって許可されます。
  • 他の App Engine アプリまたはサービスからのリクエストのアクセスを制御するには、サービス間通信に使用される IP アドレスに対するルールの作成が必要になることがあります。お使いのアプリが App Engine の他のアプリやサービスと通信する場合は、次の IP アドレスからのリクエストの処理方法を検討する必要があります。

    • URL フェッチ サービスからのリクエスト: 0.1.0.40
      • スタンダード環境で受信するリクエスト: 0.1.0.40
      • フレキシブル環境で受信するリクエスト: 0.1.0.4010.0.0.1
    • Blobstore または Cloud Storage からのリクエスト: 0.1.0.30
    • スタンダード環境でのみ受信するリクエスト:
      • アプリのデプロイ リクエスト: 10.1.0.41

    アプリは、スタンダード環境で動作するバックエンド サービス(backend_std)を利用しています。このサービスは、URL フェッチ サービスを使用して backend_flex と通信します。

    リクエストを許可する 2 つのファイアウォール ルールを作成する必要があります。

    • 0.1.0.40 - backend_flexbackend_std からの URL フェッチ リクエストの受信を許可するルール。
    • 10.0.0.1 - backend_flex の URL フェッチ リクエストに対してサービス間通信を許可するルール。

ファイアウォール ルールを作成する

ファイアウォール ルールは、次のいずれかの方法で作成します。追加するルールごとに次の手順を繰り返します。

コンソール

GCP Console の [ファイアウォール ルール] ページでファイアウォール ルールを作成します。

  1. GCP Console で [ファイアウォール ルールの作成] ページに移動します。

    [ファイアウォール ルールの作成] ページに移動

  2. ファイアウォール ルールの詳細を指定します。

    1. [優先度] に、ルールの相対的な重要度を表す整数を入力し、ルールの評価順序を定義します。

      有効な値は 12147483646 です。優先度 1 のルールが最初に評価されます。優先度 2147483647 のルールは最後に評価されます。この値は default ルール用に予約されています。

    2. [一致したときのアクション] で、ルールに一致したリクエストのアクセスを許可するか拒否するかを指定します。ルールに allow を設定すると、リクエストがアプリに転送されます。ルールに deny を設定すると、リクエストには 403 Forbidden エラーが返されます。
    3. [IP 範囲] で、ルールを適用する IP アドレスの範囲を定義します。IP アドレスの範囲は CIDR 表記で定義する必要があります。ここにはサブネット マスクを使用することもでき、IPv4 と IPv6 の両方に対応しています。
    4. (省略可)[説明] に、ルールの説明を 100 文字以内で入力します。
  3. [保存] をクリックして、ルールを作成します。
  4. ルールをテストし、優先度とアクションが期待どおり動作することを確認します。
    1. [IP アドレスをテスト] をクリックします。
    2. 検証する IP アドレスを入力し、[テスト] をクリックします。対応するルールが正しく評価されていることを確認します。
gcloud

次の gcloud app firewall-rules コマンドを実行して、ファイアウォール ルールを作成します。

  1. 次のコマンドを実行して、ファイアウォール ルールを作成します。

    gcloud app firewall-rules create PRIORITY --action ALLOW_OR_DENY --source-range IP_RANGE --description DESCRIPTION
    各項目には次のように値を指定します。
    • PRIORITY には、ルールの重要度とルールの評価順序を定義する、1 から 2147483646 までの整数値を指定します。優先度 1 のルールは最初に評価されます。優先度 2147483647 のルールは最後に評価されます。この値は default ルール用に予約されています。
    • ALLOW_OR_DENY は、ルールに一致したリクエストのアクセスを許可するか拒否するかを指定します。有効な値は allow または deny です。ルールに allow を設定すると、リクエストがアプリに転送されます。ルールに deny を設定すると、リクエストには 403 Forbidden エラーが返されます。
    • IP_RANGE には、ルールを適用する IP アドレスの範囲を定義します。IP 範囲は CIDR 表記で定義する必要があります。ここにはサブネット マスクを使用することもでき、IPv4 と IPv6 の両方に対応しています。
    • DESCRIPTION には、ルールの説明を 100 文字以内で指定します。これは省略可能です。
  2. 次のコマンドを実行してルールをテストし、優先度とアクションが期待どおり動作することを確認します。
    gcloud app firewall-rules test-ip IP_ADDRESS
    IP_ADDRESS は、ファイアウォールでテストする IP アドレスです。
  3. 既存のルールを一覧表示するには、次のコマンドを実行します。
    gcloud app firewall-rules list
  4. 既存のルールを削除するには、次のコマンドを実行します。
    gcloud app firewall-rules delete PRIORITY
    PRIORITY は、削除するルールの優先度値です。
例:
次のサンプルを参考にして、ファイアウォールを作成してください。
  • IPv6 アドレスとサブネット マスクを許可するルールを追加し、そのルールをテストして、他のルールより前に評価されることを確認します。

    gcloud app firewall-rules create 123 --source-range fe80::3636:3bff:fecc:8778/128 --action allow
    gcloud app firewall-rules test-ip fe80::3636:3bff:fecc:8778
  • IPv4 アドレスとサブネット マスクを拒否するルールを追加し、ルールをテストして適切に評価されることを確認します。

    gcloud app firewall-rules create 123456 --source-range "74.125.0.0/16" --action deny
    gcloud app firewall-rules test-ip 74.125.0.8
  • デフォルト ルールを更新してテストし、他のルールと一致しないすべての IP アドレスが制限されることを確認します。

    gcloud app firewall-rules update default --action deny
    gcloud app firewall-rules test-ip 123.456.7.89
API

App Engine アプリのファイアウォール ルールをプログラムで作成するには、Admin API の apps.firewall.ingressRules メソッドを使用します。

ファイアウォール ルールをテストし、優先度とアクションが期待どおりに動作することを確認するには、apps.firewall.ingressRules.list メソッドを使用し、テストする IP アドレスを matchingAddress パラメータに指定します。

ファイアウォールの例

この例では、エンジニアリング チームと社内ネットワークに、開発中のアプリへのアクセスを許可するようにファイアウォールを設定しています。後で変更に対応できるように、ファイアウォール ルールの優先度は余裕をもって設定されています。

優先度 アクション IP 範囲 説明
1000 拒否 192.0.2.1 DoS 攻撃者のアクセスを拒否します。
2000 許可 198.51.100.2 サテライト オフィスのエンジニアにアクセスを許可します。
3000 拒否 198.51.100.0/24 エンジニアが勤務していない建物に対するアクセスをすべて拒否します。
5000 許可 203.0.113.0/24 本館のネットワークに対するアクセスを許可します。
2147483647 拒否 * デフォルトのアクション

ファイアウォールの作成後に、次のリクエストがサンプルアプリに発行されたと仮定して、アプリのレスポンスに注目してください。

  • 198.51.100.2 からのリクエスト: 優先度 2000 のルールと一致するため許可されます。
  • 198.51.100.100 からのリクエスト: 優先度 3000 のルールと一致するため拒否されます。
  • 203.0.113.54 からのリクエスト: 優先度 5000 のルールと一致するため許可されます。
  • 45.123.35.242 からのリクエスト: デフォルト ルールと一致するため拒否されます。

競合するルールの解決

たとえば、この会社のファイアウォール内の 2 つの優先度を入れ替えるとします。優先度 2000 と 3000 のルールを入れ替えると、意図しない動作が発生します。

優先度 アクション IP 範囲 説明
1000 拒否 192.0.2.1 DoS 攻撃者のアクセスを拒否します。
2000 拒否 198.51.100.0/24 エンジニアが勤務していない建物に対するアクセスをすべて拒否します。
3000 許可 198.51.100.2 サテライト オフィスのエンジニアにアクセスを許可します。
5000 許可 203.0.113.0/24 本館のネットワークに対するアクセスを許可します。
2147483647 拒否 * デフォルトのアクション

新しい優先度では、サテライト オフィスのエンジニアにアクセスを許可するルールが評価されないため、サテライト オフィスのエンジニアは会社のアプリにアクセスできなくなります。エンジニアの IP アドレス 198.51.100.2 は、この IP アドレスに対しアクセスを許可するルールの前に、198.51.100.0/24 の範囲内のエンジニア以外のユーザーをすべて拒否するルールと一致します。

これを修正するには、198.51.100.2 に対しアクセスを許可するルールの優先度を、IP 範囲 198.51.100.0/24 のアクセスを拒否するルールよりも高く設定する必要があります。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Java の App Engine スタンダード環境