Comment analyser les journaux de flux VPC personnalisés à l'aide de CloudWatch Logs Insights ?

Dernière mise à jour : 27/04/2022

J'ai configuré des journaux de flux VPC personnalisés. Comment puis-je découvrir des modèles et des tendances avec Amazon CloudWatch Logs Insights ?

Brève description

Vous pouvez utiliser CloudWatch Logs Insights pour analyser les journaux de flux VPC. CloudWatch Log Insights découvre automatiquement les champs dans de nombreux journaux fournis par Amazon, ainsi que les événements de journaux au format JSON, afin de faciliter la construction de requêtes et l'exploration des journaux. Les journaux de flux VPC qui sont au format par défaut sont automatiquement découverts par CloudWatch Logs Insights.

Toutefois, les journaux de flux VPC sont déployés dans un format personnalisé. De ce fait, ils ne sont pas découverts automatiquement, vous devez donc modifier les requêtes. Cet article fournit plusieurs exemples de requêtes que vous pouvez personnaliser et étendre en fonction de vos cas d'utilisation.

Ce format de journaux de flux VPC personnalisé est utilisé :

${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}

Solution

Récupérer les derniers journaux de flux VPC

Comme les champs de journaux ne sont pas automatiquement découverts par CloudWatch Logs Insights, vous devez utiliser le mot clé parse pour isoler les champs souhaités. Dans cette requête, les résultats sont triés en fonction de l'heure de début des événements du journal de flux et limités aux deux entrées de journaux les plus récentes.

Requête

#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

Résultats


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

Résumez les transferts de données par paires d'adresses IP source/de destination

Résumez ensuite le trafic réseau par paires d'adresses IP source/de destination. Dans cet exemple, la statistique de somme est utilisée pour effectuer une agrégation sur le champ octets. Cela permet de calculer le total cumulé des données transférées entre les hôtes. Pour plus de contexte, flow_direction (direction du flux) est incluse. Les résultats de cette agrégation sont ensuite affectés temporairement au champ Data_Transferred. Ensuite, les résultats sont triés par Data_Transferred dans l'ordre décroissant, et les deux plus grandes paires sont renvoyées.

Requête

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

Résultats

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

Analyser les transferts de données par ID d'instance EC2

Vous pouvez utiliser les journaux de flux VPC personnalisés pour analyser directement un ID d'instance Amazon Elastic Compute Cloud (Amazon EC2). En reprenant la requête précédente, vous pouvez maintenant déterminer les instances EC2 les plus actives à l'aide du champ instance_id.

Requête

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

Résultats

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

Filtre pour le trafic SSH rejeté

Pour mieux comprendre le trafic refusé par votre groupe de sécurité et vos listes de contrôle d'accès réseau (ACL), filtrez les journaux de flux VPC rejetés. Vous pouvez affiner davantage ce filtre pour inclure le protocole et le port cible. Pour identifier les hôtes rejetés sur le trafic SSH, étendez le filtre pour inclure le protocole TCP (par exemple, le protocole 6) et le trafic avec un port de destination de 22.

Requête

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

Résultats

srcaddr SSH_Traffic_Volume
23.95.222.129 160
179.43.167.74 80

Isoler le flux de données HTTP pour une paire source/destination spécifique

Pour étudier plus en détail les tendances de vos données à l'aide de CloudWatch Logs Insights, isolez le trafic bidirectionnel entre deux adresses IP. Dans cette requête, ["172.31.1.247","172.31.11.212"] renvoie les journaux de flux en utilisant l'adresse IP comme adresse IP source ou de destination. Pour isoler le trafic HTTP, les instructions de filtre font correspondre les événements du journal de flux VPC avec le protocole 6 (TCP) et le port 80. Utilisez le mot-clé display pour renvoyer un sous-ensemble de tous les champs disponibles.

Requête

#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

Résultats

interface_id srcaddr srcport dstaddr dstport Protocole octets action log_status
eni-0b74120275654905e 172.31.11.212 80 172.31.1.247 29376 6 5160876 ACCEPTER OK
eni-0b74120275654905e 172.31.1.247 29376 172.31.11.212 80 6 97380 ACCEPTER OK

Isoler le flux de données HTTP pour une paire source/destination spécifique

Vous pouvez utiliser CloudWatch Logs Insights pour visualiser les résultats sous forme de graphique à barres ou à secteurs. Si les résultats incluent la fonction bin(), les résultats de la requête sont renvoyés avec un horodatage. Cette série temporelle peut ensuite être visualisée à l'aide d'un graphique linéaire ou en zones empilées.

Sur la base de la requête précédente, vous pouvez utiliser la somme des statistiques (octets) comme Data_Transferred by bin(1m) pour calculer les données cumulées transférées sur des intervalles d'une minute. Pour afficher cette visualisation, basculez entre les tableaux Logs (Journaux) et Visualization (Visualisation) dans la console CloudWatch Logs Insights.

Requête

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)

Résultats

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