Azure Firewall Policy – Créer une Network Rule Collection via Azure CLI

Quand Terraform autorise ce que le portail refuse

Si tu gères ton infrastructure Azure avec Terraform, tu as peut-être découvert un problème frustrant : des rule collections dont le nom contient des espaces — créées via ARM templates ou azapi_resource — sont impossibles à modifier via le portail Azure, qui refuse ces noms à la validation. La solution ? Azure CLI, qui dialogue directement avec l’API REST sans ces restrictions.

Synopsis : Lorsque des règles Azure Firewall Policy sont créées via Terraform ou ARM templates avec des noms contenant des espaces, le portail Azure refuse catégoriquement de les modifier ou d’en créer de nouvelles dans le même groupe. Cet article explique comment contourner cette limitation en utilisant Azure CLI en bash pour créer et gérer des Network Rule Collections, sans jamais toucher au portail.

Prérequis

Avant de commencer, assure-toi d’avoir :

  • Azure CLI installé et à jour (az --version)
  • L’extension azure-firewall (installée automatiquement à la première commande az network firewall)
  • Les droits suffisants sur la souscription Azure (rôle Network Contributor ou supérieur)
  • Le nom exact de ta Firewall Policy, du Rule Collection Group et du Resource Group

Comprendre la hiérarchie Azure Firewall Policy

Dans Azure Firewall Policy, la structure est la suivante :

Firewall Policy
  └── Rule Collection Group    (ex: "NetworkRuleCollectionGroup")
        └── Rule Collection    (ex: "Allow Internal Traffic")  ← nom avec espace
              └── Rule         (ex: "Allow DNS")

Le portail Azure bloque à l’étape Rule Collection si le nom contient un espace. L’Azure CLI, lui, transmet le nom directement à l’API REST sans validation restrictive côté client.

Étape 1 — Définir les variables bash

Commence par déclarer tes variables pour éviter les répétitions :

RG="mon-resource-group"
POLICY="ma-firewall-policy"
RCG_NAME="NetworkRuleCollectionGroup"
COLLECTION_NAME="Allow Internal Traffic"   # ← nom avec espace
PRIORITY=1100

Étape 2 — Vérifier que le Rule Collection Group existe

az network firewall policy rule-collection-group show \
  --resource-group "$RG" \
  --policy-name "$POLICY" \
  --name "$RCG_NAME"

Si le groupe n’existe pas encore, crée-le :

az network firewall policy rule-collection-group create \
  --resource-group "$RG" \
  --policy-name "$POLICY" \
  --name "$RCG_NAME" \
  --priority 200

Étape 3 — Créer la Network Rule Collection avec espace

C’est ici le cœur du workaround. La commande add-filter-collection crée une rule collection réseau et y injecte une première règle en même temps :

az network firewall policy rule-collection-group collection add-filter-collection \
  --resource-group "$RG" \
  --policy-name "$POLICY" \
  --rule-collection-group-name "$RCG_NAME" \
  --name "$COLLECTION_NAME" \
  --action Allow \
  --collection-priority $PRIORITY \
  --rule-name "Allow DNS" \
  --rule-type NetworkRule \
  --description "Autoriser la résolution DNS" \
  --source-addresses "10.0.0.0/8" \
  --destination-addresses "8.8.8.8" "8.8.4.4" \
  --destination-ports 53 \
  --ip-protocols UDP TCP

⚠️ Important : add-filter-collection exige qu’au moins une règle soit fournie dès la création de la collection. Il n’est pas possible de créer une collection vide.

Étape 4 — Ajouter des règles supplémentaires

Une fois la collection créée, ajoute d’autres règles avec collection rule add :

az network firewall policy rule-collection-group collection rule add \
  --resource-group "$RG" \
  --policy-name "$POLICY" \
  --rule-collection-group-name "$RCG_NAME" \
  --collection-name "$COLLECTION_NAME" \
  --name "Allow HTTPS" \
  --rule-type NetworkRule \
  --source-addresses "10.0.0.0/8" \
  --destination-addresses "*" \
  --destination-ports 443 \
  --ip-protocols TCP

Étape 5 — Vérifier le résultat

Affiche l’état complet du Rule Collection Group :

az network firewall policy rule-collection-group show \
  --resource-group "$RG" \
  --policy-name "$POLICY" \
  --name "$RCG_NAME" \
  --output table

Ou liste toutes les collections :

az network firewall policy rule-collection-group collection list \
  --resource-group "$RG" \
  --policy-name "$POLICY" \
  --rule-collection-group-name "$RCG_NAME" \
  --output table

Pourquoi ce problème existe-t-il ?

Le provider Terraform azurerm applique une validation côté client plus restrictive que l’API Azure elle-même.

Des configurations créées via ARM templates, azapi_resource, ou une ancienne version du provider peuvent se retrouver dans un état que le portail ne sait plus modifier.

L’Azure CLI, en tant que couche directement au-dessus de l’API REST Azure, ne souffre pas de ces restrictions et reste le meilleur outil de contournement.

Récapitulatif des commandes clés

Action Commande
Créer un Rule Collection Group rule-collection-group create
Créer une collection réseau collection add-filter-collection
Ajouter une règle collection rule add
Lister les collections collection list
Afficher le groupe complet rule-collection-group show

💡 Astuce finale : Si tu veux remettre les pieds dans Terraform après cet ajout manuel, pense à importer la ressource avec terraform import ou à utiliser azapi_resource qui offre bien plus de flexibilité sur les noms que le provider azurerm classique.


...BofBienTrès BienTop ! (Soit le premier à voter)
Loading...

Mathieu

Je suis actuellement ingénieur spécialisé dans le design d'environnements cloud virtualisés. Adepte des technologies de VMware, Nutanix, Citrix et Microsoft je propose à travers ce blog diverses astuces de troubleshooting.

S’abonner
Notification pour
guest

0 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires