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

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

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

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

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

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

仕様

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

接続ロギング上限

VM インスタンスごとにログに記録できる接続の最大数は、そのインスタンスのマシンタイプに依存します。接続ロギング上限は、5 秒間にログに記録できる最大接続数として表現されます。

インスタンスのマシンタイプ 5 秒間に記録できる最大接続数
f1-micro 100 接続
g1-small 250 接続
1~8 個の vCPU を備えたマシンタイプ vCPU あたり 500 接続
8 個を超える vCPU を使用するマシンタイプ 4,000(500×8)接続

ロギングの例

ロギングが有効化された状態のファイアウォール ルールがトラフィックに適用されるたびに、ログエントリが生成されます。パケットフローによっては複数のログエントリが生成されることもありますが、所定の 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-a にあり、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=tcp
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-a
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-a にあり、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=tcp
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-a
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=tcp
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-a
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=tcp
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 インスタンスからのトラフィックに適用されるたびに、Stackdriver Logging 内にログエントリが作成されます。

ファイアウォール ルールは、次の表にある形式に従います。

Logging の LogEntry JSON ペイロードのフィールドには、次の形式のメッセージが格納されます。

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

IpConnection

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

RuleDetails

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

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 文字列 外部エンドポイントの都市

次のステップ