Module 5 : Gouvernance Azure

Management Groups

Les Management Groups permettent d'organiser les subscriptions :


+----------------------------------------------------------+
|                    HIERARCHIE GOUVERNANCE                 |
+----------------------------------------------------------+
|                                                           |
|   Root Management Group                                   |
|       |                                                   |
|       +-- MG-DataLab                                    |
|           |                                               |
|           +-- MG-Production                              |
|           |       +-- Subscription Prod                  |
|           |                                               |
|           +-- MG-Development                             |
|                   +-- Subscription Dev                   |
|                   +-- Subscription Test                  |
|                                                           |
+----------------------------------------------------------+
            
# Créer un Management Group (PowerShell)
az account management-group create --name MG-DataLab --display-name "DataLab Root"

# Créer des sous-groupes
az account management-group create --name MG-Production --parent MG-DataLab --display-name "Production Workloads"

az account management-group create --name MG-Development --parent MG-DataLab --display-name "Development Workloads"

# Déplacer une subscription dans un MG
az account management-group subscription add --name MG-Development --subscription "DataLab-Dev"
Version Bash (cliquez pour afficher)
# Créer un Management Group
az account management-group create \
    --name MG-DataLab \
    --display-name "DataLab Root"

# Créer des sous-groupes
az account management-group create \
    --name MG-Production \
    --parent MG-DataLab \
    --display-name "Production Workloads"

az account management-group create \
    --name MG-Development \
    --parent MG-DataLab \
    --display-name "Development Workloads"

# Déplacer une subscription dans un MG
az account management-group subscription add \
    --name MG-Development \
    --subscription "DataLab-Dev"

Azure Policy

Azure Policy permet d'appliquer des règles de conformite :
  • Audit : Signale les non-conformites
  • Deny : Empêche la création de ressources non conformes
  • DeployIfNotExists : Déploie automatiquement des configurations
  • Modify : Modifie les ressources existantes

Politiques essentielles

# Lister les définitions de politique intégrées
az policy définition list --query "[?policyType=='BuiltIn'].{Name:displayName, ID:name}" --output table

# Politiques recommandées pour DataLab :
# - "Allowed locations" : Limiter les régions
# - "Require tag on resources" : Obliger les tags
# - "Storage accounts should restrict network access"
# - "Audit VMs that do not use managed disks"

Exemple : Obliger les tags

# Définir une politique custom pour obliger le tag "Project"
{
  "mode": "Indexed",
  "policyRule": {
    "if": {
      "field": "tags['Project']",
      "exists": "false"
    },
    "then": {
      "effect": "deny"
    }
  }
}

# Créer la définition (PowerShell)
az policy définition create --name "require-project-tag" --display-name "Require Project tag" --description "Toute ressource doit avoir un tag Project" --rules @policy-require-tag.json --mode Indexed

# Assigner la politique au Resource Group
az policy assignment create --name "require-project-tag-folab" --policy "require-project-tag" --scope "/subscriptions/{sub-id}/resourceGroups/rg-folab-dev"
Version Bash (cliquez pour afficher)
# Créer la définition
az policy définition create \
    --name "require-project-tag" \
    --display-name "Require Project tag" \
    --description "Toute ressource doit avoir un tag Project" \
    --rules @policy-require-tag.json \
    --mode Indexed

# Assigner la politique au Resource Group
az policy assignment create \
    --name "require-project-tag-folab" \
    --policy "require-project-tag" \
    --scope "/subscriptions/{sub-id}/resourceGroups/rg-folab-dev"

Initiatives (Policy Sets) (PowerShell)

# Les Initiatives regroupent plusieurs politiques
# Exemple : Initiative de sécurité Azure

az policy set-définition list --query "[?policyType=='BuiltIn'].{Name:displayName}" --output table | Select-Object -First 20

# Initiatives recommandées :
# - "Azure Security Benchmark"
# - "CIS Microsoft Azure Foundations Benchmark"
# - "ISO 27001:2013"
Version Bash (cliquez pour afficher)
# Les Initiatives regroupent plusieurs politiques
# Exemple : Initiative de sécurité Azure

az policy set-définition list \
    --query "[?policyType=='BuiltIn'].{Name:displayName}" \
    --output table | head -20

# Initiatives recommandées :
# - "Azure Security Benchmark"
# - "CIS Microsoft Azure Foundations Benchmark"
# - "ISO 27001:2013"

Resource Locks (PowerShell)

Proteger les ressources critiques contre la suppression accidentelle :

# Créer un lock "CanNotDelete"
az lock create --name "protect-storage" --lock-type CanNotDelete --resource-group rg-folab-dev --resource-name stfolabdev001 --resource-type Microsoft.Storage/storageAccounts

# Créer un lock "ReadOnly" (empêche toute modification)
az lock create --name "readonly-prod" --lock-type ReadOnly --resource-group rg-folab-prod

# Lister les locks
az lock list --resource-group rg-folab-dev --output table

# Supprimer un lock (nécessaire avant de supprimer la ressource)
az lock delete --name "protect-storage" --resource-group rg-folab-dev
Version Bash (cliquez pour afficher)
# Créer un lock "CanNotDelete"
az lock create \
    --name "protect-storage" \
    --lock-type CanNotDelete \
    --resource-group rg-folab-dev \
    --resource-name stfolabdev001 \
    --resource-type Microsoft.Storage/storageAccounts

# Créer un lock "ReadOnly" (empêche toute modification)
az lock create \
    --name "readonly-prod" \
    --lock-type ReadOnly \
    --resource-group rg-folab-prod

# Lister les locks
az lock list --resource-group rg-folab-dev --output table

# Supprimer un lock (nécessaire avant de supprimer la ressource)
az lock delete \
    --name "protect-storage" \
    --resource-group rg-folab-dev

Tags et conventions

Tags obligatoires chez DataLab :
ProjectNom du projet (FOLAB, ESG, etc.)
EnvironmentDev, Test, Prod
CostCenterCentre de cout
OwnerEmail du responsable
CreatedDateDate de création
# Appliquer des tags a un Resource Group (PowerShell)
az group update --name rg-folab-dev --tags Project=FOLAB Environment=Dev CostCenter=DataEng Owner=team@mycompany.com

# Appliquer des tags a toutes les ressources d'un RG
$ids = az resource list --resource-group rg-folab-dev --query "[].id" -o tsv
foreach ($id in $ids) {
    az tag update --resource-id $id --operation merge --tags Project=FOLAB Environment=Dev
}

# Rechercher des ressources par tag
az resource list --tag Project=FOLAB --output table
Version Bash (cliquez pour afficher)
# Appliquer des tags a un Resource Group
az group update \
    --name rg-folab-dev \
    --tags Project=FOLAB Environment=Dev CostCenter=DataEng Owner=team@mycompany.com

# Appliquer des tags a toutes les ressources d'un RG
az resource list --resource-group rg-folab-dev --query "[].id" -o tsv | \
while read id; do
    az tag update --resource-id "$id" --operation merge \
        --tags Project=FOLAB Environment=Dev
done

# Rechercher des ressources par tag
az resource list --tag Project=FOLAB --output table

Azure Blueprints

Les Blueprints permettent de déployer des environnements standardisés :


Blueprint "DataLab-DataPlatform" contient :
+----------------------------------------------------------+
| - Resource Group: rg-{project}-{env}                     |
| - VNet avec subnets standard                             |
| - Storage Account ADLS Gen2                              |
| - Key Vault                                              |
| - Policies de sécurité                                   |
| - RBAC pré-configuré                                     |
+----------------------------------------------------------+

# Les Blueprints sont gérés via le Portal ou ARM/Bicep
# Ils garantissent la cohérence entre environnements
            

Conformite et rapports (PowerShell)

# Voir l'état de conformite
az policy state list --resource-group rg-folab-dev --query "[?complianceState=='NonCompliant'].{Policy:policyDefinitionName, Resource:resourceId}"

# Exporter un rapport de conformite
az policy state summarize --resource-group rg-folab-dev --output json > compliance-report.json
Version Bash (cliquez pour afficher)
# Voir l'état de conformite
az policy state list \
    --resource-group rg-folab-dev \
    --query "[?complianceState=='NonCompliant'].{Policy:policyDefinitionName, Resource:resourceId}"

# Exporter un rapport de conformite
az policy state summarize \
    --resource-group rg-folab-dev \
    --output json > compliance-report.json