ファイアウォール ルール ロギングを使用する

ファイアウォール ルール ロギングを使用すると、ファイアウォール ルールの効果を監査、検証、分析できます。たとえば、トラフィックを拒否するように設計されたファイアウォール ルールが意図したとおりに機能しているかどうかを判別できます。ファイアウォール ルール ロギングは、特定のファイアウォール ルールによって影響を受ける接続数を判別する必要がある場合にも役立ちます。

このページでは、Virtual Private Cloud ファイアウォール ルールのロギングを有効または無効にする方法について説明します。ファイアウォール ポリシー ルールのロギングの手順については、階層型ファイアウォール ポリシーとルールの使用をご覧ください。

また、生成されたログを表示する方法についても説明します。記録される内容、ロギングの例、ログ形式の詳細については、ファイアウォール ルール ロギングをご覧ください。

ファイアウォール ルールのロギングを有効にすると、ファイアウォール インサイトからその分析情報と推奨事項を表示できます。詳細については、Network Intelligence Center のドキュメントのファイアウォール インサイトをご覧ください。

権限

ファイアウォール ルールの変更や、ログへのアクセスを行うには、IAM プリンシパルに次のいずれかのロールが割り当てられている必要があります。

タスク 必要なロール
ファイアウォール ルールの作成、削除、または更新 プロジェクトのオーナーまたは編集者あるいはセキュリティ管理者
ログの表示 プロジェクトのオーナー、編集者、閲覧者またはログ閲覧者
Logging IAM のロールと権限の詳細については、Logging アクセス制御ガイドをご覧ください。

ファイアウォール ルール ロギングを有効または無効にする

ファイアウォール ルールを作成する際に、ファイアウォール ルール ロギングを有効にするかどうかを選択できます。詳細については、ファイアウォール ルールを作成するをご覧ください。

既存のファイアウォール ルールに対してファイアウォール ルール ロギングを有効または無効にする場合は、以下の操作を行います。ロギングを有効にする際には、メタデータ フィールドを含めるかどうかを制御できます。省略すると、ストレージ費用の節約が可能です。

ファイアウォール ルール ロギングを有効にする

コンソール

  1. Google Cloud コンソールで [ファイアウォール ポリシー] ページに移動します。

    [ファイアウォール ポリシー] に移動

  2. [ログ] 列で、各ファイアウォール ルールのファイアウォール ロギングがオンかオフかを確認します。

  3. 1 つ以上のファイアウォール ルールのロギングを有効にするには、更新するルールの横にあるチェックボックスをオンにします。

  4. [VPC ファイアウォール ルール] アクションバーで [ログを構成] をクリックします。

  5. [ログを構成] ダイアログで [オン] を選択します。

  6. メタデータ フィールドを省略するには、[ログの詳細を表示する] を開いて [メタデータを含める] チェックボックスをオフにします。

  7. [構成を保存] をクリックします。

gcloud

gcloud compute firewall-rules update RULE_NAME \
    --enable-logging \
    --logging-metadata=LOGGING_METADATA

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

  • RULE_NAME: ファイアウォール ルールの名前。
  • LOGGING_METADATA: ファイアウォール ルール ロギングについて、ファイアウォール ルールのログにメタデータ フィールドを含めるかどうかを指定します。このフィールドは、ロギングが有効になっている場合にのみ構成できます。値は exclude-all または include-all にする必要があります。デフォルトでは、メタデータ フィールドが含まれます。

詳細については、SDK リファレンス ドキュメントをご覧ください。

Terraform

Terraform リソースを使用して、ロギングを有効にしたファイアウォール ルールを作成できます。

resource "google_compute_firewall" "rules" {
  project     = var.project_id # Replace this with your project ID in quotes
  name        = "my-firewall-rule"
  network     = "default"
  description = "Creates firewall rule targeting tagged instances"

  log_config {
    metadata = "INCLUDE_ALL_METADATA"
  }

  allow {
    protocol = "tcp"
    ports    = ["80", "8080", "1000-2000"]
  }
  target_tags = ["web"]
}

Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

API

既存のファイアウォール ルールに対してロギングを有効にします。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/RULE_NAME
{
  "name": "RULE_NAME,
  "logConfig": {
    "enable": true,
    "metadata": LOGGING_METADATA
  }
}

プレースホルダを有効な値に置き換えます。

  • PROJECT_ID: ファイアウォール ルールが配置されているプロジェクトの ID。
  • RULE_NAME: ファイアウォール ルールの名前。
  • LOGGING_METADATA: ファイアウォール ルール ロギングについて、ファイアウォール ルールのログにメタデータ フィールドを含めるかどうかを指定します。このフィールドは、ロギングが有効になっている場合にのみ構成できます。値は exclude-all または include-all にする必要があります。デフォルトでは、メタデータ フィールドが含まれます。

詳細については、firewalls.patch メソッドをご覧ください。

ファイアウォール ルール ロギングを無効にする

コンソール

  1. Google Cloud コンソールで [ファイアウォール ポリシー] ページに移動します。

    [ファイアウォール ポリシー] に移動

  2. [ログ] 列で、各ファイアウォール ルールのファイアウォール ロギングがオンかオフかを確認します。

  3. 1 つ以上のファイアウォール ルールのロギングを無効にするには、更新する各ルールの横にあるチェックボックスをオンにします。

  4. [VPC ファイアウォール ルール] アクションバーで [ログを構成] をクリックします。

  5. [ログを構成] ダイアログで [オフ] を選択し、[構成を保存] をクリックします。

gcloud

gcloud compute firewall-rules update RULE_NAME \
    --no-enable-logging

RULE_NAME の部分は、ファイアウォール ルールの名前に置き換えます。

API

既存のファイアウォール ルールに対してファイアウォール ルール ロギングを無効にします。

PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/RULE_NAME
{
  "name": "RULE_NAME,
  "logConfig": {
    "enable": false
  }
}

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

  • PROJECT_ID: ファイアウォール ルールが配置されているプロジェクトの ID。
  • RULE_NAME: ファイアウォール ルールの名前。

詳細については、firewalls.patch メソッドをご覧ください。

ログを表示する

ファイアウォール ルールのログは、VM インスタンスとファイアウォール ルールが含まれるネットワークをホストしているプロジェクト内で作成されます。共有 VPC では、VM インスタンスはサービス プロジェクト内で作成されますが、これらのインスタンスはホスト プロジェクト内にある共有 VPC ネットワークを使用します。ファイアウォール ルールのログは、そのホスト プロジェクト内に保管されます。

ファイアウォール ルールのログを表示するには、Google Cloud コンソールの [ログ エクスプローラ] セクションを使用します。

次のフィルタは、特定のファイアウォール イベントを検索する方法を示しています。

すべてのファイアウォール ログを表示する

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. [リソース] をクリックします。

  3. [リソースの選択] リストで [サブネットワーク] をクリックし、[適用] をクリックします。

  4. [ログ名] をクリックし、リストから [ファイアウォール] を選択します。

  5. [適用] をクリックします。

または

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. [クエリ] をクリックします。

  3. [クエリ] ペインにクエリ エディタ フィールドが表示されない場合は、[クエリを表示] をクリックします。

  4. [クエリ] ペインのクエリ エディタ フィールドに次の文字列を貼り付けます。PROJECT_ID は、実際のプロジェクト ID に置き換えます。

    resource.type="gce_subnetwork"
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Ffirewall"
    
  5. [クエリを実行] をクリックします。

特定のサブネットのログを表示する

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. [リソース] をクリックします。

  3. [リソースの選択] リストで、[サブネットワーク] をクリックします。

  4. ログを表示するサブネットワークを選択し、[適用] をクリックします。

  5. [ログ名] をクリックし、リストから [ファイアウォール] を選択します。

  6. [適用] をクリックします。

または

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. [クエリ] をクリックします。

  3. [クエリ] ペインにクエリ エディタ フィールドが表示されない場合は、[クエリを表示] をクリックします。

  4. [クエリ] ペインのクエリ エディタ フィールドに次の文字列を貼り付けます。PROJECT_ID をプロジェクト ID に、SUBNET_NAME をサブネットワークに置き換えます。

    resource.type="gce_subnetwork"
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Ffirewall"
    resource.labels.subnetwork_name="SUBNET_NAME"
    
  5. [クエリを実行] をクリックします。

特定の VM のログを表示する

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. [リソース] をクリックします。

  3. [リソースの選択] リストで、[VM インスタンス] をクリックします。

  4. ログを表示するインスタンスを選択し、[適用] をクリックします。

  5. [ログ名] をクリックし、リストから [ファイアウォール] を選択します。

  6. [適用] をクリックします。

または

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. [クエリ] をクリックします。

  3. [クエリ] ペインにクエリ エディタ フィールドが表示されない場合は、[クエリを表示] をクリックします。

  4. [クエリ] ペインのクエリ エディタ フィールドに次の文字列を貼り付けます。PROJECT_ID はプロジェクト ID に、INSTANCE_ID はログを表示する VM の ID に置き換えます。

    resource.type="gce_subnetwork"
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Ffirewall"
    jsonPayload.instance.vm_name="INSTANCE_ID"
    
  5. [クエリを実行] をクリックします。

特定の国からの接続のログを表示する

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. [クエリ] をクリックします。

  3. [クエリ] ペインにクエリ エディタ フィールドが表示されない場合は、[クエリを表示] をクリックします。

  4. [クエリ] ペインのクエリ エディタ フィールドに次の文字列を貼り付けます。PROJECT_ID は実際のプロジェクト ID に、COUNTRYISO 3166-1alpha-3 コードに置き換えます。

    resource.type="gce_subnetwork"
    logName="projects/PROJECT_ID/logs/compute.googleapis.com%2Ffirewall"
    jsonPayload.remote_location.country=COUNTRY
    

ログをエクスポートする

ファイアウォール ルールのログをエクスポートするには、シンクの構成と管理をご覧ください。

クエリの例を使用して、エクスポートするログを絞り込むことができます。

相互作用の表

  • VM 間通信の場合、それぞれに適用されているファイアウォール ルールによっては、両方の VM がログレコードを生成することもあります。
  • 最初のパケットがファイアウォールで許可された場合、ログに記録される接続には双方向に流れるパケットが含まれます。
  • 特定の VM への受信接続は、その VM 上に構成されているファイアウォール ルールと照合されます。また、特定の VM からの発信接続は、その VM 上に構成されている下りファイアウォール ルールと照合されます。
  • 「許可してログに記録」するように指定しているファイアウォール ルールに一致して許可された接続は、一度だけログに記録されます。接続が維持されたとしても、ログエントリが 5 秒ごとに繰り返し記録されることはありません。
  • 「拒否してログに記録」するように指定しているファイアウォール ルールに一致して拒否された接続は、その拒否対象の接続でパケットが観測される限り、5 秒ごとに繰り返しログに記録されます。

この表は、単一の VM の観点からのファイアウォールのロギング動作を示しています。

VM1 の上り(内向き)ルール R1 がパケットを照合し、下り(外向き)ルール R2 でもパケットを照合するというシナリオでは、ファイアウォールのロギング動作は次のようになります。

VM1 の上り(内向き)ルール R1(パケットを照合) VM1 の下り(外向き)ルール R2(パケットを照合) 接続方向 アクション ログ
許可してログに記録 許可 上り(内向き) 許可 1 つのログエントリ:
disposition=allow, rule=R1
拒否
許可してログに記録
拒否してログに記録
許可 許可 上り(内向き) 許可 ロギングなし
拒否
許可してログに記録
拒否してログに記録
拒否してログに記録 該当なし 上り(内向き) 拒否 5 秒ごとに 1 つのログエントリ:
disposition=deny, rule=R1
拒否 該当なし 上り(内向き) 拒否 ロギングなし
許可 許可してログに記録 下り 許可 1 つのログエントリ:
disposition=allow, rule=R2
拒否
許可してログに記録
拒否してログに記録
許可 許可 下り 許可 ロギングなし
拒否
許可してログに記録
拒否してログに記録
該当なし 拒否してログに記録 下り 拒否 5 秒ごとに 1 つのログエントリ:
disposition=deny, rule=R2
該当なし 拒否 下り 拒否 ロギングなし

上り(内向き)と下り(外向き)は対称であるので注意してください。

以下に、ファイアウォール ログのセマンティックについて詳しく説明します。

  • 許可してログに記録(ロギングは TCP と UDP でのみサポートされます)

    • ルールが適用される方向で接続が開始されると、1 つのログレコードが作成されます。
    • 接続トラッキングにより、応答トラフィックは許可されます。該当する方向に適用されるファイアウォール ルールに関係なく、応答トラフィックによってロギングが行われることはありません。
    • ファイアウォールにより接続が失効すると(10 分間にわたり非アクティブであるか、TCP RST を受信した場合)、いずれかの方向での別のパケットによってロギングがトリガーされる場合があります。
    • ロギングは 5 タプルに基づきます。TCP フラグはロギング動作に影響を与えません。
  • 拒否してログに記録(ロギングは TCP と UDP でのみサポートされます)

    • パケットはドロップされます(接続は開始されません)。
    • 一意の 5 タプルに対応する各パケットが、失敗した接続試行としてログに記録されます。
    • 引き続きパケットを受信する場合、同じ 5 タプルが 5 分ごとに繰り返しログに記録されます。

トラブルシューティング

ログを表示できない

Google Cloud コンソールの [ログ エクスプローラ] セクションでファイアウォール ルールのログを表示できない場合は、次の点を確認してください。

考えられる原因: 十分な権限がありません

プロジェクトに対して、少なくともログ閲覧者のロールを IAM プリンシパルに割り当てるよう、プロジェクト オーナーに依頼します。詳細については、権限をご覧ください。
考えられる原因: レガシーネットワークがサポートされていない
レガシー ネットワークではファイアウォール ルール ロギングを使用できません。サポートされているのは VPC ネットワークのみです。
考えられる原因: プロジェクトが正しいことを確認してください
ファイアウォール ルールのログは、対象のネットワークが含まれるプロジェクトで保管されるため、正しいプロジェクトでログを検索していることを確認してください。共有 VPC では、VM インスタンスはサービス プロジェクト内で作成されますが、これらのインスタンスはホスト プロジェクト内にある共有 VPC ネットワークを使用します。共有 VPC のシナリオでは、ファイアウォール ルールのログはそのホスト プロジェクトに保管されます。

共有 VPC が関係する場合、ファイアウォール ルールのログを表示するには、ホスト プロジェクトに対する適切な権限が必要です。VM インスタンス自体はサービス プロジェクト内にありますが、VM インスタンスのファイアウォール ルールのログはホスト プロジェクト内で保管されます。

ログエントリが見つからない

考えられる原因: 接続が、期待するファイアウォール ルールに一致していない可能性があります

期待するファイアウォール ルールが、インスタンスに適用されるファイアウォール ルールのリストに含まれていることを確認してください。Google Cloud コンソールを使用して該当するインスタンスの詳細を表示し、次に、[VM インスタンスの詳細] ページにある [ネットワーク インターフェース] セクションの [詳細を表示] ボタンをクリックします。VM の [ネットワーク インターフェースの詳細] ページの [ファイアウォールとルートの詳細] セクションで、該当するファイアウォール ルールを調べます。

ファイアウォール ルールが正しく作成されていることを確認するには、VPC ファイアウォール ルールをご覧ください。

VM に対して tcpdump を使用すると、VM がトラフィックを送信または受信している接続のアドレス、ポート、プロトコルが、期待するファイアウォールに一致するかどうかを判別できます。

考えられる原因: 期待するファイアウォール ルールよりも優先順位が高く、ファイアウォール ルールロギングが無効化されているルールが適用されている可能性があります

ファイアウォール ルールは優先順位に従って評価されます。VM インスタンスの観点からは、トラフィックには 1 つのファイアウォール ルールだけが適用されます。

最も高い優先順位で適用されると思われるルールが、実際にはそうでない場合もあります。その場合、それよりも優先順位が高い、ロギングが有効化されていないルールが適用される可能性があります。

トラブルシューティングを行うには、VM に適用される可能性のあるすべてのファイアウォール ルールのロギングを一時的に有効にします。Google Cloud コンソールを使用して該当する VM の詳細を表示し、[VM インスタンスの詳細] ページにある [ネットワーク インターフェース] セクションの [詳細を表示] ボタンをクリックします。VM の [ネットワーク インターフェースの詳細] ページの [ファイアウォールとルートの詳細] セクションで、適用されるファイアウォール ルールを調べ、どのリスト内のカスタムルールを特定します。それらのカスタム ファイアウォール ルールのすべてに対し、一時的にロギングを有効にします。

ロギングを有効化することで、適用されているルールを識別できます。識別した後は、実際にはロギングを必要としないすべてのルールについて、必ずロギングを無効化してください。

ログエントリの一部にメタデータが欠落している

考えられる原因: 構成の伝搬遅延

ファイアウォール ロギングが有効化されているファイアウォール ルールを更新した場合、Google Cloud がその変更を反映し終わるまでに数分かかる場合があります。それまでは、そのルールで更新されたコンポーネントに一致するトラフィックは、ログに記録されません。

次のステップ