CloudWatch Logs Insightsを利用し、VPCフローログで送信元/先をIPやCIDRに絞り込み分析してみた

2024.01.10

はじめに

Amazon CloudWatch Logs Insightsを利用して、送信元や送信先を特定のIPアドレスやCIDRに絞り込み、VPCフローログを分析しました。

VPCフローログは、VPC内のネットワークインターフェースを通過するIPトラフィックの情報をキャプチャする機能です。

VPCフローログは、CloudWatch LogsやS3に保存することができ、またKinesis Data Firehoseに送信することも可能です。

VPCフローログの作成と保存方法は、下記を参考にして下さい。

この記事では、サブネットに適用したルートテーブルのルーティング設定のうち、不要なルーティング設定かどうか判断するため、VPCフローログをCloudWatch Logs Insightsで分析する機会がありましたので、具体的なクエリを紹介します。

1つ送信元IPから1つの送信先IP

単一の送信元IPアドレスから単一の送信先IPアドレスへのトラフィックをフローログで分析します。

  • 送信元:10.0.0.0/32
  • 送信先:10.0.2.0/32
実際の環境では、10.0.0.0/32や10.0.2.0/32は、AWS側で予約されたIPアドレスであり、ネットワークアドレスとして機能するため、EC2インスタンスのプライベートIPとしては使用されません。

わかりやすいIPにするための例えとお考え下さい。

CloudWatch Logs Insightsのクエリは下記の通りです。

fields @timestamp, srcAddr, dstAddr, srcPort, dstPort, action, logStatus
| filter srcAddr = "10.0.0.0" and dstAddr = "10.0.2.0"
| sort @timestamp desc

下記は、マネジメントコンソール上の実際のクエリ画面です。

さらに、EC2インスタンスの特定のネットワークインターフェース(ENI)を指定して、分析対象を絞り込むこともできます。

たとえば、以下のクエリでは、特定のENI(eni-xxxxxxxxx-all)に関連するトラフィックのみをフィルタリングしています。

fields @timestamp, srcAddr, dstAddr, srcPort, dstPort, action, logStatus
| filter @logStream =~ /eni-xxxxxxxxx-all/
| filter srcAddr = "10.0.0.0" and dstAddr = "10.0.2.0"
| sort @timestamp desc

複数の送信元IPから複数の送信先IP

複数の送信元IPから複数の送信先IPをフローログで分析します。

  • 送信元:10.0.0.0/32 or 10.0.1.0/32
  • 送信先:10.0.2.0/32 or 10.0.3.0/32

以下のクエリでは、複数の送信元と送信先IPアドレスを指定して、これらの組み合わせに該当するトラフィックをフィルタリングしています。

fields @timestamp, srcAddr, dstAddr, srcPort, dstPort, action, logStatus
| filter srcAddr in ["10.0.0.0","10.0.1.0"] and dstAddr in ["10.0.2.0","10.0.3.0"]
| sort @timestamp desc

in演算子を使用することで、リスト内の任意のIPアドレスに一致する送信元または送信先でフィルタリングすることができます。

これにより、複数の送信元と送信先間の通信を効率的に分析することが可能です。

複数の送信元CIDR範囲から複数の送信先CIDR範囲

送信元の複数のCIDR範囲から送信先の複数のCIDR範囲をフローログで分析します。

  • 送信元:10.0.0.0/24 or 10.0.1.0/24
  • 送信先:10.0.0.0/16
    • 送信先のうち、10.0.0.0/24 ~ 10.0.4.0/24は除く

以下のクエリでは、送信元のCIDR範囲を指定し、送信先の広範な範囲(10.0.0.0/16)から特定のサブネットを除外しています。(10.0.0.0/24 ~ 10.0.4.0/24)

fields @timestamp, srcAddr, dstAddr, srcPort, dstPort, action,logStatus 
| filter (isIpv4InSubnet(srcAddr, "10.0.0.0/24") or isIpv4InSubnet(srcAddr, "10.0.1.0/24")) 
| filter (isIpv4InSubnet(dstAddr, "10.0.0.0/16")) 
| filter not (isIpv4InSubnet(dstAddr, "10.0.0.0/24") or isIpv4InSubnet(dstAddr, "10.0.1.0/24") or isIpv4InSubnet(dstAddr, "10.0.2.0/24"))

isIpv4InSubnet関数を使用することで、で特定のCIDR範囲内に絞り込むことができます。

送信先への通信の有無だけを知りたい場合は、以下のようにdedupコマンドを使用して重複を排除することができます。

fields @timestamp, srcAddr, dstAddr, srcPort, dstPort, action,logStatus 
| filter (isIpv4InSubnet(srcAddr, "10.0.0.0/24") or isIpv4InSubnet(srcAddr, "10.0.1.0/24")) 
| filter (isIpv4InSubnet(dstAddr, "10.0.0.0/16")) 
| filter not (isIpv4InSubnet(dstAddr, "10.0.0.0/24") or isIpv4InSubnet(dstAddr, "10.0.1.0/24") or isIpv4InSubnet(dstAddr, "10.0.2.0/24"))
| dedup dstAddr

このクエリにより、送信先の重複したIPアドレスを排除し、ユニークな宛先への通信だけを抽出することが可能です。

最後に

今回は、CloudWatch Logs Insightsを利用して、送信元や送信先を特定のIPアドレスやCIDRに絞ってVPCフローログを分析する具体的なクエリを紹介しました。

この記事が参考になれば幸いです。

参考