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 |