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

所要時間5分
0

カスタム 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_idinstance_idsrcaddrsrcport
123456789012 vpc-0b69ce8d04278ddd subnet-002bdfe1767d0ddb0eni-0435cbb62960f230e172.31.0.10455125
123456789012 vpc-0b69ce8d04278ddd1 subnet-002bdfe1767d0ddb0eni-0435cbb62960f230e91.240.118.8149422

送信元/送信先 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

結果

srcaddrdstaddrflow_directionData_Transferred
172.31.1.2473.230.172.154egress346952038
172.31.0.463.230.172.154egress343799447

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_idData_Transferred
-1443477306
i-03205758c9203c979517558754
i-0ae33894105aa500c324629414
i-01506ab9e9e90749d198063232
i-0724007fef3cb06f354847643

拒否された 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

結果

srcaddrSSH_Traffic_Volume
23.95.222.129160
179.43.167.7480

特定の送信元/送信先ペアの 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_idsrcaddrsrcportdstaddrdstportprotocolbytesactionlog_status
eni-0b74120275654905e172.31.11.21280172.31.1.2472937665160876ACCEPTOK
eni-0b74120275654905e172.31.1.24729376172.31.11.21280697380ACCEPTOK

特定の送信元/送信先ペアの 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.00017225787
2022-04-01 15:21:00.00017724499
2022-04-01 15:20:00.0001125500
2022-04-01 15:19:00.000101525
2022-04-01 15:18:00.00081376

関連情報

サポートされるログと検出されるフィールド

CloudWatch Logs Insights を使用したログデータの分析

CloudWatch Logs Insights クエリコマンド

チュートリアル: 時系列ビジュアライゼーションを生成するクエリを実行する

AWS公式
AWS公式更新しました 2年前