“Pour des raisons légales, je ne veux pas que mes données sortent d’Europe”, voilà une problèmatique récurrente dans les architectures IaaS Azure : contrôler où vont mes données/flux, autoriser les flux sortants vers tel ou tel datacenter, interdire le reste.
Jusqu’à maintenant, deux réponses étaient possibles :

  • Mettre en place un NVA (Palo Alto, CheckPoint, etc…), router tous les flux du vnet vers ce nva qui fera le contrôle d’accès
  • Créer un Network Security Group et y ajouter une règle par plage d’IP des datacenters Azure.

 

Les deux solutions se scriptent facilement en utilisant le fichier d’IP d’Azure, mais ont toutes les deux des inconvénients :

  • Les NVA ont un coût non négligeable de mis en oeuvre, maintenance, et de run (coût de la solution)
  • Le nombre maximal de règles sur un NSG est de 400. Or, au jour d’aujourd’hui, il y’a 425 plages d’IP pour West Europe… on dépasse donc la limite

Face à ces contraintes, de nombreux utilisateurs ont demandé la mise en place de “tags” afin de simplifier la gestion des NSGs et permettre le contrôle de flux vers les datacenter Azure.

C’est désormais chose presque faite : pendant Ignite le 26 Septembre, Microsoft a annoncé quelques nouveautés sur les réseaux virtuels, dont les Network Security Group Augmented Rules.
En quoi les augmented rules simplifient notre problèmatique ?

Jusqu’à maintenant, une règle NSG ne pouvait contenir qu’une seule IP, ou plage, de destination ou source. Les NSGs Augmented Rules éliminent cette limitation, et permettent désormais de créer une seule et unique règle pour plusieurs plages d’IP source ou destination :


(source de l’image : Microsoft, blog Azure)

Ce n’est pas aussi simple à utiliser que des tags, mais nous pourrons répondre à notre problèmatique facilement avec un peu de PowerShell et d’Azure Automation. Le code est une adaptation d’un article TechNet (ici).
Première étape, on active les Augmented Rules sur notre souscription Azure :

Login-AzureRmAccount
Select-AzureRmSubscription -SubscriptionId <moniddesouscription>
Register-AzureRmProviderFeature -FeatureName "AllowAccessRuleExtendedProperties" -ProviderNamespace "Microsoft.Network"


Une fois la feature active (ce qui peut prendre du temps), on peut créer un Runbook Azure Automation qui mettra à jour nos NSGs à la fréquence voulue. Voici les étapes principales de ce runbook.

  • Téléchargement des plages IP des DataCenter Azure et filtrage sur les regions que l’on souhaite :
# Get list of regions & public IP ranges
$downloadUri = "https://www.microsoft.com/en-us/download/confirmation.aspx?id=41653"
$downloadPage = Invoke-WebRequest -Uri $downloadUri -UseBasicParsing
$xmlFileUri = ($downloadPage.RawContent.Split('"') -like "https://*PublicIps*")[0]
$response = Invoke-WebRequest -Uri $xmlFileUri -UseBasicParsing
$xmlResponse = [System.Text.Encoding]::UTF8.GetString($response.Content)
 
# Get allowed regions from variables & filter xml response
$allowedRegions = (Get-AutomationVariable -Name "AllowOutbound_Regions" -ErrorAction Stop).Split(',')
$regions = $xmlResponse.AzurePublicIpAddresses.Region | Where-Object { $_.Name -in $allowedRegions }
  • Récupération des NSGs à mettre à jour, ajout des règles outbound vers les DC Azure
$networkSecurityGroups = Get-AzureRmNetworkSecurityGroug
foreach($nsg in $networkSecurityGroups) {
# Find & remove existing Azure DC Rules
$azureRules = $nsg.SecurityRules | Where-Object { $_.Name -like "Allow_Outbound_Azure_*" }
foreach($azureRule in $azureRules){  $nsg.SecurityRules.Remove($azureRule) }
$rulePriority = 100
foreach($region in $regions) {
$name = "Allow_Outbound_Azure_" + $region.Name
$rule = New-AzureRmNetworkSecurityRuleConfig -Name $name `
-Access Allow `
-Protocol * `
-Direction Outbound `
-Priority $rulePriority `
-SourceAddressPrefix VirtualNetwork `
-SourcePortRange * `
-DestinationAddressPrefix $region.IpRange.Subnet `
-DestinationPortRange *

$nsg.SecurityRules.Add($rule)
$rulePriority = $rulePriority + 10
}

Et enfin, on sauvegarde le NSG :

Set-AzureRmNetworkSecurityGroup -NetworkSecurityGroup $nsg }


 

Le code est prêt, reste à configurer Azure Automation en créant le runbook, le scheduling (tous les jours à 3h du matin par exemple), et ajouter la variable “AllowOutbound_Regions” avec pour valeur europewest,europenorth.
Vous pouvez trouver le code complet du Runbook sur Github ici.

 

En une feature, Microsoft a répondu à un problème récurrent chez nombre de nos clients. Nous aurions préféré l’usage de tags, mais en mettant un peu les mains dans le camboui il est aisé de faire ses “custom tags”, soit dans notre cas n’autoriser l’outbound que sur certains DC.