CloudWatch Logs Insights を使用してカスタム VPC フローログを分析するにはどうすればよいですか?

最終更新日: 2022 年 4 月 27 日

カスタム VPC フローログを設定しました。Amazon CloudWatch Logs Insights でパターンやトレンドを見つける方法を教えてください。

簡単な説明

CloudWatch Logs Insights を使用して VPC フローログを分析できます。CloudWatch Log Insights は、Amazon が提供する多くのログのフィールドと JSON 形式のログイベントを自動的に検出し、クエリの構築とログの探索を容易にします。デフォルト形式の VPC フローログは、CloudWatch Logs Insights によって自動的に検出されます。

ただし、VPC フローログはカスタム形式でデプロイされます。これにより、自動的には検出されないため、クエリを変更する必要があります。この記事では、ユースケースに合わせてカスタマイズおよび拡張できるクエリの例をいくつかご紹介します。

次のカスタム VPC フローログ形式が使用されます。

${account-id} ${vpc-id} ${subnet-id} ${interface-id} ${instance-id} ${srcaddr} ${srcport} ${dstaddr} ${dstport} ${protocol} ${packets} ${bytes} ${action} ${log-status} ${start} ${end} ${flow-direction} ${traffic-path} ${tcp-flags} ${pkt-srcaddr} ${pkt-src-aws-service} ${pkt-dstaddr} ${pkt-dst-aws-service} ${region} ${az-id} ${sublocation-type} ${sublocation-id}

解決方法

最新の VPC フローログを取得する

ログフィールドは CloudWatch Logs Insights によって自動的に検出されないため、parse キーワードを使用して目的のフィールドを分離する必要があります。このクエリでは、結果はフローログイベントの開始時間でソートされ、最新の 2 つのログエントリに制限されます。

クエリ

#Retrieve latest custom VPC Flow Logs
parse @message "* * * * * * * * * * * * * * * * * * * * * * * * * * *" as account_id, vpc_id, subnet_id, interface_id,instance_id, srcaddr, srcport, dstaddr, dstport, protocol, packets, bytes, action, log_status, start, end, flow_direction, traffic_path, tcp_flags, pkt_srcaddr, pkt_src_aws_service, pkt_dstaddr, pkt_dst_aws_service, region, az_id, sublocation_type, sublocation_id
| sort start desc
| limit 2

結果


account_id  vpc_id   subnet_id  interface_id instance_id srcaddr srcport
123456789012  vpc-0b69ce8d04278ddd  subnet-002bdfe1767d0ddb0 eni-0435cbb62960f230e 172.31.0.104 55125
123456789012  vpc-0b69ce8d04278ddd1  subnet-002bdfe1767d0ddb0 eni-0435cbb62960f230e 91.240.118.81 49422

送信元/送信先 IP アドレスのペアごとにデータ転送を要約する

次に、送信元/送信先 IP アドレスのペアごとにネットワークトラフィックを要約します。この例では、合計統計を使用して bytes フィールドの集計を実行します。これは、ホスト間で転送されたデータの累積合計を計算します。コンテキストを増やすため、flow_direction が含まれています。この集計の結果は、一時的に Data_Transferd フィールドに割り当てられます。次に、結果は Data_Transferted によって降順でソートされ、最も大きい 2 つのペアが返されます。

クエリ

parse @message "* * * * * * * * * * * * * * * * * * * * * * * * * * *" as account_id, vpc_id, subnet_id, interface_id,instance_id, srcaddr, srcport, dstaddr, dstport, protocol, packets, bytes, action, log_status, start, end, flow_direction, traffic_path, tcp_flags, pkt_srcaddr, pkt_src_aws_service, pkt_dstaddr, pkt_dst_aws_service, region, az_id, sublocation_type, sublocation_id
| stats sum(bytes) as Data_Transferred by srcaddr, dstaddr, flow_direction
| sort by Data_Transferred desc
| limit 2

結果

srcaddr dstaddr flow_direction Data_Transferred
172.31.1.247 3.230.172.154 egress 346952038
172.31.0.46 3.230.172.154 egress 343799447

EC2 インスタンス ID によるデータ転送を分析する

カスタム VPC フローログを使用して、Amazon Elastic Compute Cloud (Amazon EC2) インスタンス ID を直接分析できます。前のクエリでは、instance_id フィールドを使用して、最もアクティブな EC2 インスタンスを特定できます。

クエリ

parse @message "* * * * * * * * * * * * * * * * * * * * * * * * * * *" as account_id, vpc_id, subnet_id, interface_id,instance_id, srcaddr, srcport, dstaddr, dstport, protocol, packets, bytes, action, log_status, start, end, flow_direction, traffic_path, tcp_flags, pkt_srcaddr, pkt_src_aws_service, pkt_dstaddr, pkt_dst_aws_service, region, az_id, sublocation_type, sublocation_id
| stats sum(bytes) as Data_Transferred by instance_id
| sort by Data_Transferred desc
| limit 5

結果

instance_id Data_Transferred
- 1443477306
i-03205758c9203c979 517558754
i-0ae33894105aa500c 324629414
i-01506ab9e9e90749d 198063232
i-0724007fef3cb06f3 54847643

拒否された SSH トラフィックをフィルタリングする

セキュリティグループとネットワークアクセスコントロールリスト (ACL) によって拒否されたトラフィックをよりよく理解するには、拒否する VPC フローログをフィルタリングします。このフィルターをさらに絞り込んで、プロトコルとターゲットポートを含めることができます。SSH トラフィックで拒否されたホストを識別するには、TCP プロトコル (例: プロトコル 6) と送信先ポート 22 のトラフィックを含めるようにフィルターを拡張します。

クエリ

parse @message "* * * * * * * * * * * * * * * * * * * * * * * * * * *" as account_id, vpc_id, subnet_id, interface_id,instance_id, srcaddr, srcport, dstaddr, dstport, protocol, packets, bytes, action, log_status, start, end, flow_direction, traffic_path, tcp_flags, pkt_srcaddr, pkt_src_aws_service, pkt_dstaddr, pkt_dst_aws_service, region, az_id, sublocation_type, sublocation_id
| filter action = "REJECT" and protocol = 6 and dstport = 22
| stats sum(bytes) as SSH_Traffic_Volume by srcaddr
| sort by SSH_Traffic_Volume desc
| limit 2

結果

srcaddr SSH_Traffic_Volume
23.95.222.129 160
179.43.167.74 80

特定の送信元/送信先ペアの HTTP データストリームを分離する

CloudWatch Logs Insights を使用してデータの傾向をさらに調査するには、2 つの IP アドレス間の双方向トラフィックを分離します。このクエリでは、 ["172.31.1.247"," 172.31.11.212"] は、送信元 IP アドレスまたは送信先 IP アドレスとしていずれかの IP アドレスを使用してフローログを返します。HTTP トラフィックを分離するために、フィルターステートメントは VPC フローログイベントをプロトコル 6 (TCP) およびポート 80 と照合します。display キーワードを使用して、使用可能なすべてのフィールドのサブセットを返します。

クエリ

#HTTP Data Stream for Specific Source/Destination Pair
parse @message "* * * * * * * * * * * * * * * * * * * * * * * * * * *" as account_id, vpc_id, subnet_id, interface_id,instance_id, srcaddr, srcport, dstaddr, dstport, protocol, packets, bytes, action, log_status, start, end, flow_direction, traffic_path, tcp_flags, pkt_srcaddr, pkt_src_aws_service, pkt_dstaddr, pkt_dst_aws_service, region, az_id, sublocation_type, sublocation_id
| filter srcaddr in ["172.31.1.247","172.31.11.212"] and dstaddr in ["172.31.1.247","172.31.11.212"] and protocol = 6 and (dstport = 80 or srcport=80)
| display interface_id,srcaddr, srcport, dstaddr, dstport, protocol, bytes, action, log_status, start, end, flow_direction, tcp_flags
| sort by start desc
| limit 2

結果

interface_id srcaddr srcport dstaddr dstport protocol bytes action log_status
eni-0b74120275654905e 172.31.11.212 80 172.31.1.247 29376 6 5160876 ACCEPT OK
eni-0b74120275654905e 172.31.1.247 29376 172.31.11.212 80 6 97380 ACCEPT OK

特定の送信元/送信先ペアの HTTP データストリームを分離する

CloudWatch Logs Insights を使用して、結果を棒グラフまたは円グラフとして視覚化できます。結果に bin () 関数が含まれる場合、クエリ結果はタイムスタンプ付きで返されます。次に、この時系列は、折れ線グラフまたは積み上げ面グラフで視覚化できます。

前のクエリに基づいて、stats sum(bytes) を Data_Trasferred by bin(1m) として使用して、1 分間隔で転送された累積データを計算できます。このビジュアライゼーションを表示するには、CloudWatch Logs Insights コンソールで Logs テーブルと Visualization テーブルを切り替えます。

クエリ

parse @message "* * * * * * * * * * * * * * * * * * * * * * * * * * *" as account_id, vpc_id, subnet_id, interface_id,instance_id, srcaddr, srcport, dstaddr, dstport, protocol, packets, bytes, action, log_status, start, end, flow_direction, traffic_path, tcp_flags, pkt_srcaddr, pkt_src_aws_service, pkt_dstaddr, pkt_dst_aws_service, region, az_id, sublocation_type, sublocation_id
| filter srcaddr in ["172.31.1.247","172.31.11.212"] and dstaddr in ["172.31.1.247","172.31.11.212"] and protocol = 6 and (dstport = 80 or srcport=80)
| stats sum(bytes) as Data_Transferred by bin(1m)

結果

bin(1m) Data_Transferred
2022-04-01 15:23:00.000 17225787
2022-04-01 15:21:00.000 17724499
2022-04-01 15:20:00.000 1125500
2022-04-01 15:19:00.000 101525
2022-04-01 15:18:00.000 81376