ファイアウォール ルールのロギング

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

ファイアウォール ルールに一致する接続をログに記録する必要がある場合、そのファイアウォール ルールに対してファイアウォール ルールロギングを個別に有効化します。ルールの動作(allowdeny)や方向(上り(内向き)、下り(外向き))に関係なく、あらゆるファイアウォール ルールに任意でファイアウォール ルールロギングを有効化できます。

ファイアウォール ルールのロギングでは、Compute Engine 仮想マシン(VM)インスタンス間のトラフィックが記録されます。これには、Google Kubernetes Engine(GKE)クラスタApp Engine フレキシブル環境のインスタンスなど、Compute Engine VM 上に構築された Google Cloud プロダクトが含まれます。

ファイアウォール ルールに対してロギングを有効化すると、そのルールによってトラフィックが許可または拒否されるたびに、Google Cloud が接続レコードと呼ばれるエントリを作成します。これらのレコードは Cloud Logging で表示でき、Cloud Logging のエクスポート先としてサポートされている任意の宛先にログをエクスポートできます。

接続レコードごとに、送信元 IP アドレス、宛先 IP アドレス、プロトコルとポート、日時、およびトラフィックに適用されたファイアウォール ルールへの参照が記録されます。

ファイアウォール ルールのロギングは、VPC ファイアウォール ルールと階層型ファイアウォール ポリシーの両方で使用できます。

ログの表示については、ファイアウォール ルール ロギングを使用するをご覧ください。

仕様

ファイアウォール ルールロギングの仕様は次のとおりです。

ロギングの例

ロギングが有効化されたファイアウォール ルールがトラフィックに適用されるたびに、ログエントリが生成されます。パケットフローによっては複数のログエントリが生成されることもありますが、個別の VM の観点からは、トラフィックに適用されるファイアウォール ルールでロギングが有効化されている場合、生成されるログエントリは最大で 1 つだけです。

次の例で、ファイアウォール ログの仕組みを説明します。

下り(外向き)拒否ルールの例

この例では次のようになります。

  • example-proj プロジェクトに含まれる example-net VPC ネットワーク内の VM インスタンス間のトラフィックが評価されます。
  • 2 つの VM インスタンスは次のとおりです。
    • VM1 は west-subnetus-west1 リージョン)内のゾーン us-west1-a にあり、IP アドレス 10.10.0.99 が割り当てられています。
    • VM2 は east-subnetus-east1 リージョン)内のゾーン us-east1-b にあり、IP アドレス 10.20.0.99 が割り当てられています。
  • ルール A: 下り(外向き)拒否のファイアウォール ルールのターゲットは、ネットワーク内のすべてのインスタンスです。このルールは、宛先を 10.20.0.99(VM2)とするトラフィックに対して TCP ポート 80 に適用されます。
    • このルールについてはロギングが有効化されています。
  • ルール B: 上り(内向き)許可のファイアウォール ルールのターゲットは、ネットワーク内のすべてのインスタンスです。このルールは、送信元を 10.10.0.99(VM1)とするトラフィックに対して TCP ポート 80 に適用されます。
    • このルールについてもロギングが有効化されています。

次の gcloud コマンドを使用して、ファイアウォール ルールを作成できます。

  • ルール A: すべてのインスタンスをターゲットに、10.20.0.99 を宛先とするトラフィックに対して TCP 80 に適用する下り(外向き)拒否ルール。

    gcloud compute firewall-rules create rule-a \
        --network example-net \
        --action deny \
        --direction egress \
        --rules tcp:80 \
        --destination-ranges 10.20.0.99/32 \
        --priority 10 \
        --enable-logging
    
  • ルール B: すべてのインスタンスをターゲットに、10.10.0.99 を送信元とするトラフィックに対して TCP 80 に適用する上り(内向き)許可ルール。

    gcloud compute firewall-rules create rule-b \
        --network example-net \
        --action allow \
        --direction ingress \
        --rules tcp:80 \
        --source-ranges 10.10.0.99/32 \
        --priority 10 \
        --enable-logging
    
VM1 と VM2 間の接続(クリックして拡大)
VM1 と VM2 間の接続(クリックして拡大)

VM1 が VM2 に TCP ポート 80 で接続しようとしているとします。この場合、次のファイアウォール ルールがログに記録されます。

  • VM1 が 10.20.0.99(VM2)への接続を試行すると、VM1 の観点からルール A のログエントリが生成されます。
  • 実際はルール A によってトラフィックがブロックされるため、ルール B が考慮されることはありません。したがって、VM2 の観点からルール B のログエントリが記録されることもありません。

次のようなファイアウォール ログレコードが生成されます。

フィールド
connection src_ip=10.10.0.99
src_port=[EPHEMERAL_PORT]
dest_ip=10.20.0.99
dest_port=80
protocol=6
disposition DENIED
rule_details reference = "network:example-net/firewall:rule-a"
priority = 10
action = DENY
destination_range = 10.20.0.99/32
ip_port_info = tcp:80
direction = egress
instance project_id="example-proj"
instance_name=VM1
region=us-west1
zone=us-west1-a
vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=west-subnet
remote_instance project_id="example-proj"
instance_name=VM2
region=us-east1
zone=us-east1-b
remote_vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=east-subnet
remote_location 情報はありません。このフィールドは、宛先が VPC ネットワークの外部である場合にのみ使用されます。

下り(外向き)許可ルール、上り(内向き)許可ルールの例

この例では次のようになります。

  • example-proj プロジェクトに含まれる example-net VPC ネットワーク内の VM インスタンス間のトラフィックが評価されます。
  • 2 つの VM インスタンスは次のとおりです。
    • VM1 は west-subnetus-west1 リージョン)内のゾーン us-west1-a にあり、IP アドレス 10.10.0.99 が割り当てられています。
    • VM2 は east-subnetus-east1 リージョン)内のゾーン us-east1-b にあり、IP アドレス 10.20.0.99 が割り当てられています。
  • ルール A: 下り(外向き)許可のファイアウォール ルールのターゲットは、ネットワーク内のすべてのインスタンスです。このルールは、宛先を 10.20.0.99(VM2)とするトラフィックに対して TCP ポート 80 に適用されます。
    • このルールについてはロギングが有効化されています。
  • ルール B: 上り(内向き)許可のファイアウォール ルールのターゲットは、ネットワーク内のすべてのインスタンスです。このルールは、送信元を 10.10.0.99(VM1)とするトラフィックに対して TCP ポート 80 に適用されます。
    • このルールについてもロギングが有効化されています。

次の gcloud コマンドを使用して、2 つのファイアウォール ルールを作成できます。

  • ルール A: すべてのインスタンスをターゲットに、10.20.0.99(VM2)を宛先とするトラフィックに対して TCP 80 に適用する下り(外向き)許可ルール。

    gcloud compute firewall-rules create rule-a \
        --network example-net \
        --action allow \
        --direction egress \
        --rules tcp:80 \
        --destination-ranges 10.20.0.99/32 \
        --priority 10 \
        --enable-logging
    
  • ルール B: すべてのインスタンスをターゲットに、10.10.0.99(VM1)を送信元とするトラフィックに対して TCP 80 に適用する上り(内向き)許可ルール。

    gcloud compute firewall-rules create rule-b \
        --network example-net \
        --action allow \
        --direction ingress \
        --rules tcp:80 \
        --source-ranges 10.10.0.99/32 \
        --priority 10 \
        --enable-logging
    
VM1 と VM2 間の接続(クリックして拡大)
VM1 と VM2 間の接続(クリックして拡大)

VM1 が VM2 に TCP ポート 80 で接続しようとしているとします。この場合、次のファイアウォール ルールがログに記録されます。

  • VM1 が 10.20.0.99(VM2)に接続すると、VM1 の観点からルール A のログエントリが生成されます。
  • VM2 が 10.10.0.99(VM1)からの受信接続を許可すると、VM2 の観点からルール B のログエントリが生成されます。

次のように、VM1 からのファイアウォール ログレコードが生成されます。

フィールド
connection src_ip=10.10.0.99
src_port=[EPHEMERAL_PORT]
dest_ip=10.20.0.99
dest_port=80
protocol=6
disposition ALLOWED
rule_details reference = "network:example-net/firewall:rule-a"
priority = 10
action = ALLOW
destination_range = 10.20.0.99/32
ip_port_info = tcp:80
direction = egress
instance project_id="example-proj"
instance_name=VM1
region=us-west1
zone=us-west1-a
vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=west-subnet
remote_instance project_id="example-proj"
instance_name=VM2
region=us-east1
zone=us-east1-b
remote_vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=east-subnet
remote_location 情報はありません。このフィールドは、宛先が VPC ネットワークの外部である場合にのみ使用されます。

次のように、VM2 からのファイアウォール ログレコードが生成されます。

フィールド
connection src_ip=10.10.0.99
src_port=[EPHEMERAL_PORT]
dest_ip=10.20.0.99
dest_port=80
protocol=6
disposition ALLOWED
rule_details reference = "network:example-net/firewall:rule-b"
priority = 10
action = ALLOW
source_range = 10.10.0.99/32
ip_port_info = tcp:80
direction = ingress
instance project_id="example-proj"
instance_name=VM2
region=us-east1
zone=us-east1-b
vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=east-subnet
remote_instance project_id="example-proj"
instance_name=VM1
region=us-west1
zone=us-west1-a
remote_vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=west-subnet
remote_location 情報はありません。このフィールドは、宛先が VPC ネットワークの外部である場合にのみ使用されます。

インターネット上り(内向き)ルールの例

この例では次のようになります。

  • example-net VPC ネットワークの外部にあるシステムからそのネットワーク内の VM インスタンスへのトラフィックが評価されます。このネットワークは example-proj プロジェクトにあります。
  • インターネット上のシステムには、IP アドレス 203.0.113.114 が割り当てられています。
  • VM1 は west-subnetus-west1 リージョン)内のゾーン us-west1-a にあり、IP アドレス 10.10.0.99 が割り当てられています。
  • ルール C: 上り(内向き)許可のファイアウォール ルールのターゲットは、ネットワーク内のすべてのインスタンスです。このルールは、任意の IP アドレス(0.0.0.0/0)を送信元とするトラフィックに対して TCP ポート 80 に適用されます。
    • このルールについてはロギングが有効化されています。
  • ルール D: 下り(外向き)拒否のファイアウォール ルールのターゲットは、ネットワーク内のすべてのインスタンスです。このルールは、宛先を任意の IP アドレス(0.0.0.0/0)とし、すべてのプロトコルに適用されます。
    • このルールについてもロギングが有効化されています。

次の gcloud コマンドを使用して、ファイアウォール ルールを作成できます。

  • ルール C: すべてのインスタンスをターゲットに、任意の送信元のトラフィックに対して TCP 80 に適用する上り(内向き)許可ルール。

    gcloud compute firewall-rules create rule-c \
        --network example-net \
        --action allow \
        --direction ingress \
        --rules tcp:80 \
        --source-ranges 0.0.0.0/0 \
        --priority 10 \
        --enable-logging
    
  • ルール D: すべてのインスタンスをターゲットに、任意の宛先のトラフィックに対してすべてのプロトコルに適用する下り(外向き)拒否ルール。

    gcloud compute firewall-rules create rule-d \
        --network example-net \
        --action deny \
        --direction egress \
        --rules all \
        --destination-ranges 0.0.0.0/0 \
        --priority 10 \
        --enable-logging
    
インターネットから VM への接続(クリックして拡大)
インターネットから VM への接続(クリックして拡大)

IP アドレス 203.0.113.114 が割り当てられたシステムが、VM1 に TCP ポート 80 で接続しようとしているとします。この場合、次のようになります。

  • VM1 が 203.0.113.114 からのトラフィックを受け入れると、VM1 の観点からルール C のログエントリが生成されます。
  • Google Cloud ファイアウォール ルールはステートフルであるため、VM1 はルール D にかかわらず、受信リクエストに応答できます。受信したリクエストが許可されている場合、確立されたレスポンスを下り(外向き)ルールでブロックすることはできません。
  • ルール D は適用されないため、ルール D が考慮されてログエントリが記録されることはありません。

次のようなファイアウォール ログレコードが生成されます。

フィールド
connection src_ip=203.0.113.114
src_port=[EPHEMERAL_PORT]
dest_ip=10.10.0.99
dest_port=80
protocol=6
disposition ALLOWED
rule_details reference = "network:my-vpc/firewall:rule-c"
priority = 10
action = ALLOW
source_range = 0.0.0.0/0
ip_port_info = tcp:80
direction = ingress
instance project_id="example-proj"
instance_name=VM1
region=us-west1
zone=us-west1-a
vpc project_id="example-proj"
vpc_name=example-net
subnetwork_name=west-subnet
remote_location continent
country
region
city

ファイアウォール ログ形式

仕様に従い、ロギングが有効化されているファイアウォール ルールが VM インスタンスへのトラフィックまたは VM インスタンスからのトラフィックに適用されるたびに、Cloud Logging 内にログエントリが作成されます。ログレコードは、Logging の LogEntry の JSON ペイロード フィールドに含まれます。

ログレコードには、各ログレコードのコアフィールドであるベース フィールドと、詳細情報を追加するメタデータ フィールドが含まれています。メタデータ フィールドを含めるかどうかを制御できます。省略すると、ストレージ費用の節約が可能です。

一部のログフィールドでは、フィールドでもある値がサポートされています。これらのフィールドには、所定のフィールドに複数のデータを含めることができます。たとえば、connection フィールドは IpConnection 形式で、送信元と宛先の IP アドレスとポート、およびプロトコルが 1 つのフィールドに格納されます。これらのフィールドを次の表で説明します。

フィールド 説明 フィールド タイプ: 基本またはオプションのメタデータ
connection IpConnection
送信元 IP アドレス、宛先 IP アドレス、送信元ポート、宛先ポート、この接続の IP プロトコルを記述する 5 タプル。
基本
disposition string
接続が ALLOWEDDENIED かを示します。
基本
rule_details RuleDetails
この接続に適用されたルールの詳細。
rule.reference フィールド 基本
その他のルールの詳細フィールド メタデータ
instance InstanceDetails
VM インスタンスの詳細。共有 VPC 構成の場合、project_id はサービス プロジェクトの詳細に対応します。
メタデータ
vpc VpcDetails
VPC ネットワークの詳細。共有 VPC 構成の場合、project_id はホスト プロジェクトの詳細に対応します。
メタデータ
remote_instance InstanceDetails
接続のリモート エンドポイントが Compute Engine にある VM の場合、このフィールドには VM インスタンスの詳細が入力されます。
メタデータ
remote_vpc VpcDetails
接続のリモート エンドポイントが VPC ネットワーク内にある VM の場合、このフィールドにはネットワークの詳細が入力されます。
メタデータ
remote_location GeographicDetails
接続のリモート エンドポイントが VPC ネットワークの外部にある場合、このフィールドには使用可能なロケーション メタデータが入ります。
メタデータ

IpConnection

フィールド タイプ 説明
src_ip 文字列 送信元 IP アドレス。送信元が Compute Engine VM の場合、src_ip はプライマリ内部 IP アドレスか、VM のネットワーク インターフェースのエイリアス IP 範囲のアドレスです。外部 IP アドレスは示されません。VM に対して TCP ダンプを実行した場合と同じように、Logging では VM がパケット ヘッダーで確認する VM の IP が示されます。
src_port 整数 送信元ポート
dest_ip 文字列 宛先 IP アドレス。宛先が Google Cloud VM の場合、dest_ip はプライマリ内部 IP アドレスか、VM のネットワーク インターフェースのエイリアス IP 範囲のアドレスです。外部 IP アドレスは、接続に使用されていても表示されません。
dest_port 整数 宛先ポート
protocol 整数 接続の IP プロトコル

RuleDetails

フィールド タイプ 説明
reference 文字列 ファイアウォール ルールへの参照。形式:
"network:{network name}/firewall:{firewall_name}"
priority 整数 ファイアウォール ルールの優先順位。
action 文字列 ALLOW または DENY
source_range[ ] 文字列 ファイアウォール ルールが適用される送信元範囲のリスト。
destination_range[ ] 文字列 ファイアウォール ルールが適用される宛先範囲のリスト。
ip_port_info[ ] IpPortDetails ルールが適用される IP プロトコルと該当するポート範囲のリスト。
direction 文字列 ファイアウォール ルールが適用される方向。
source_tag[ ] 文字列 ファイアウォール ルールが適用されるすべてのソースタグのリスト。
target_tag[ ] 文字列 ファイアウォール ルールが適用されるすべてのターゲットタグのリスト。
source_service_account[ ] 文字列 ファイアウォール ルールが適用されるすべてのソースサービス アカウントのリスト。
target_service_account[ ] 文字列 ファイアウォール ルールが適用されるすべてのターゲット サービス アカウントのリスト。
source_region_code[ ] 文字列 ファイアウォール ルールが適用されるすべての送信元ドメイン名のリスト。
destination_region_code[ ] 文字列 ファイアウォール ルールが適用されるすべての宛先ドメイン名のリスト。
source_fqdn[ ] 文字列 ファイアウォール ルールが適用されるすべての送信元の国コードのリスト。
destination_fqdn[ ] 文字列 ファイアウォール ルールが適用されるすべての宛先の国コードのリスト。

IpPortDetails

フィールド タイプ 説明
ip_protocol 文字列 ファイアウォール ルールが適用される IP プロトコル。すべてのプロトコルに適用される場合は「ALL」となります。
port_range[ ] 文字列 ルールが適用されるポート範囲のリスト。例: 8080-9090

InstanceDetails

フィールド タイプ 説明
project_id 文字列 VM を含むプロジェクトの ID
vm_name 文字列 VM のインスタンス名
region 文字列 VM のリージョン
zone 文字列 VM のゾーン

VpcDetails

フィールド タイプ 説明
project_id 文字列 ネットワークを含むプロジェクトの ID
vpc_name 文字列 VM が動作しているネットワーク
subnetwork_name 文字列 VM が動作しているサブネット

GeographicDetails

フィールド タイプ 説明
continent 文字列 外部エンドポイントの大陸
country 文字列 外部エンドポイントの国
region 文字列 外部エンドポイントのリージョン
city 文字列 外部エンドポイントの都市

次のステップ