Networking

Azure Network Watcher : migrer les NSG Flow Logs sans perdre la preuve réseau

Un runbook de production pour inventorier les NSG Flow Logs, activer les Virtual Network Flow Logs en parallèle, valider le nouveau schéma KQL puis basculer avec un rollback explicite.

24 août 2026 azurenetwork-watchernsg-flow-logsvnet-flow-logstraffic-analyticskqlobservabilitynetworkingmigrationrunbookrollbackproduction

Les NSG Flow Logs Azure ne peuvent plus être créés et leur retrait est annoncé pour le 30 septembre 2027. Attendre la dernière fenêtre transforme une évolution connue en incident d’observabilité : les fichiers historiques restent soumis à la rétention du compte de stockage, mais les ressources de flow logs et Traffic Analytics associés aux NSG ne constituent plus une cible durable.

Le cas d’usage est une plateforme Azure en hub-and-spoke. Plusieurs NSG Flow Logs alimentent un compte de stockage et un workspace Log Analytics. Des requêtes KQL, alertes et runbooks utilisent encore AzureNetworkAnalytics_CL. L’objectif n’est pas seulement d’activer les Virtual Network Flow Logs. Il faut prouver que le nouveau périmètre couvre les flux utiles, adapter les consommateurs au schéma NTANetAnalytics, puis désactiver l’ancien chemin sans trou de visibilité ni double collecte durable.

Figer le contrat d’observabilité avant la migration

Commencez par les décisions que les logs doivent soutenir. Un inventaire de ressources ne dit pas si l’équipe saura encore expliquer un refus réseau, une sortie inattendue ou un flux inter-VNet après la bascule.

yaml flow-log-migration-contract.yml
scope:
subscriptions: [prod-connectivity, prod-workloads]
regions: [westeurope]
virtual_networks: [vnet-hub-prod, vnet-app-prod]
evidence_to_preserve:
- allowed_and_denied_flows
- source_destination_protocol_port
- nsg_and_rule_when_available
- bytes_packets_and_flow_count
- traffic_analytics_queries
consumers:
- soc-network-workbook
- denied-flow-alert
- incident-network-pack
acceptance:
overlap_hours: 24
max_ingestion_delay_minutes: 70
required_queries_green: 4
rollback:
keep_nsg_flow_logs_enabled_until_acceptance: true
delete_new_flow_log_only_after_evidence_export: true

Le délai accepté doit tenir compte de Traffic Analytics : les blobs sont collectés par intervalles, puis agrégés avant leur arrivée dans Log Analytics. Une absence immédiate dans KQL n’est donc pas une preuve de panne.

Inventorier les flow logs et leurs consommateurs

Listez les ressources existantes, leur cible, leur rétention et l’activation de Traffic Analytics. Relevez aussi les requêtes, workbooks, alertes et exports qui dépendent de l’ancienne table. C’est souvent là que se trouve le vrai risque de migration.

bash 01-inventory-flow-logs.sh
SUBSCRIPTION_ID="00000000-0000-0000-0000-000000000000"
az account set --subscription "$SUBSCRIPTION_ID"

az network watcher flow-log list --location westeurope --query "[].{name:name,enabled:enabled,target:targetResourceId,storage:storageId,analytics:flowAnalyticsConfiguration.networkWatcherFlowAnalyticsConfiguration.enabled,workspace:flowAnalyticsConfiguration.networkWatcherFlowAnalyticsConfiguration.workspaceResourceId,interval:flowAnalyticsConfiguration.networkWatcherFlowAnalyticsConfiguration.trafficAnalyticsInterval}" --output table

Classez ensuite les NSG Flow Logs par VNet, subnet et NIC réellement couverts. Une migration agrégée au niveau VNet simplifie la configuration et évite les doublons, mais elle peut élargir le périmètre par rapport à une collecte limitée à quelques interfaces. Ce changement de couverture doit être assumé, chiffré et documenté avant création.

Utilisez le script de migration fourni par Network Watcher quand les configurations diffèrent ou quand seuls certains subnets et NIC sont journalisés. Azure Policy devient plus pertinente si la cible est homogène et doit s’appliquer à tous les VNets présents et futurs. Dans les deux cas, exécutez d’abord l’analyse et conservez son rapport avec le changement.

Vérifier les prérequis avant la double émission

La nouvelle ressource doit écrire dans un compte de stockage compatible, et Microsoft.Insights doit être enregistré. Vérifiez également les droits de l’identité qui crée le flow log et ceux nécessaires à Traffic Analytics sur le workspace.

bash 02-check-prerequisites.sh
az provider show --namespace Microsoft.Insights --query "registrationState" --output tsv

az storage account show --ids "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rg-observability-prod/providers/Microsoft.Storage/storageAccounts/stflowprod" --query "{name:name,location:primaryLocation,httpsOnly:enableHttpsTrafficOnly,networkDefaultAction:networkRuleSet.defaultAction}" --output yaml

N’ouvrez pas largement le compte de stockage pour faire passer la migration. Si l’écriture échoue, séparez autorisation, réseau du compte et configuration du flow log. Le correctif doit rester ciblé et réversible.

Activer un Virtual Network Flow Log canari

Commencez par un VNet représentatif, avec le même compte de stockage et le même workspace que l’ancien chemin. Gardez le NSG Flow Log actif pendant une fenêtre courte afin de comparer les deux sources.

bash 03-create-vnet-flow-log-canary.sh
RG_NETWORK="rg-network-prod"
RG_OBS="rg-observability-prod"
VNET="vnet-app-prod"
FLOW_LOG="fl-vnet-app-prod-weu"
STORAGE_ID="/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/$RG_OBS/providers/Microsoft.Storage/storageAccounts/stflowprod"
WORKSPACE_ID="/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/$RG_OBS/providers/Microsoft.OperationalInsights/workspaces/log-prod"

az network watcher flow-log create --location westeurope --resource-group "$RG_NETWORK" --name "$FLOW_LOG" --vnet "$VNET" --storage-account "$STORAGE_ID" --traffic-analytics true --workspace "$WORKSPACE_ID" --interval 10 --enabled true

Ne généralisez pas encore. Lancez des probes contrôlées : un flux autorisé, un refus NSG attendu, un flux intra-VNet et, si le périmètre le justifie, un flux inter-VNet. Notez les timestamps UTC, IP, ports et résultat attendu.

Valider le nouveau schéma KQL

Traffic Analytics utilise NTANetAnalytics pour les Virtual Network Flow Logs, en remplacement de AzureNetworkAnalytics_CL utilisé par les NSG Flow Logs. Une simple substitution de nom de table ne suffit pas : plusieurs colonnes perdent leur suffixe de type et le modèle de couverture change.

kusto 04-vnet-flow-log-canary.kql
let StartTime = ago(2h);
let CanarySources = dynamic(["10.42.3.17", "10.42.3.18"]);
NTANetAnalytics
| where TimeGenerated > StartTime
| where SubType == "FlowLog"
| where SrcIp in (CanarySources) or DestIp in (CanarySources)
| summarize
  Flows = sum(AllowedInFlows + DeniedInFlows + AllowedOutFlows + DeniedOutFlows),
  Bytes = sum(BytesSrcToDest + BytesDestToSrc),
  FirstSeen = min(FlowIntervalStartTime),
  LastSeen = max(FlowIntervalEndTime)
by SrcIp, DestIp, DestPort, L4Protocol, FlowStatus, AclRule
| order by LastSeen desc

Les noms exacts des champs doivent être confirmés dans votre workspace : l’instrumentation, la version et les projections locales peuvent varier. Utilisez d’abord NTANetAnalytics | getschema, puis adaptez les requêtes. La validation doit répondre à quatre questions : les probes apparaissent-elles, les autorisations et refus sont-ils distinguables, les volumes restent-ils plausibles, et le délai d’ingestion respecte-t-il le contrat ?

Pendant le chevauchement, ne comparez pas les nombres ligne par ligne. Les deux solutions n’ont pas le même périmètre ni la même déduplication. Comparez des flux canaris connus et des tendances agrégées sur une fenêtre stable.

Migrer les consommateurs avant de couper la source

Dupliquez chaque requête critique vers NTANetAnalytics, puis faites pointer un workbook ou une alerte canari vers la nouvelle version. Gardez une matrice de validation explicite.

text flow-log-consumer-matrix.txt
Consumer                  Old source                 New source          Status
SOC network workbook       AzureNetworkAnalytics_CL    NTANetAnalytics     validated
Denied flow alert          AzureNetworkAnalytics_CL    NTANetAnalytics     shadow
Incident network pack      AzureNetworkAnalytics_CL    NTANetAnalytics     validated
Monthly traffic export     storage NSG path            storage VNet path   pending

Cutover blocked while any critical consumer is pending.

Pour une alerte, exécutez d’abord la nouvelle requête en mode fantôme : même fenêtre, mêmes cas canaris, aucune notification d’astreinte. Comparez faux négatifs, bruit et délai, puis changez la source de l’alerte dans une modification séparée de la désactivation des anciens logs.

Décider la bascule et préparer le rollback

La bascule est autorisée quand les ressources VNet Flow Logs sont saines, que les blobs arrivent, que les requêtes critiques sont validées et que la couverture élargie ne crée pas un coût ou une exposition de données non acceptés. Désactivez alors les NSG Flow Logs sans les supprimer immédiatement.

yaml flow-log-cutover-decision.yml
decision: cutover
evidence:
vnet_flow_log_enabled: true
raw_blobs_present: true
traffic_analytics_delay_minutes: 34
canary_flows_found: 4/4
critical_consumers_validated: 3/3
storage_cost_reviewed: true
change:
disable_nsg_flow_logs: true
delete_nsg_flow_logs: false
validation_after_change:
- rerun four canary flows
- confirm NTANetAnalytics ingestion
- confirm workbook and shadow alert results
rollback_if:
- a canary flow is absent after the accepted delay
- a critical query cannot explain a known denial
- ingestion or storage authorization fails
rollback_action:
- re-enable the previous NSG flow logs
- keep the VNet flow log for diagnosis
- restore consumers to their previous queries

Supprimez les anciennes ressources seulement après une période d’observation et une sauvegarde des preuves de migration. Leur suppression ne supprime pas les données déjà présentes dans le compte de stockage ; leur cycle de vie reste gouverné par la rétention configurée.

Conclusion

Migrer les NSG Flow Logs ne se résume pas à créer une ressource Network Watcher. Le vrai changement porte sur le périmètre de collecte, le schéma Traffic Analytics et tous les outils qui transforment un flux en décision d’exploitation.

La bonne sortie est vérifiable : inventaire complet, canari en double émission, requêtes NTANetAnalytics validées, consommateurs migrés, anciens logs désactivés puis supprimés plus tard. Si une preuve critique manque, réactivez l’ancien chemin et corrigez le nouveau sans ouvrir une règle NSG pour compenser un problème d’observabilité.