11 — Pièges & Commandes (AZ-500)
À relire avant l'exam : les pièges les plus fréquents + les commandes clés. ⚠️ AZ-500 retiré le 31 août 2026 → remplacé par SC-500 (Cloud and AI Security Engineer).
PARTIE 1 — Pièges récurrents (par thème)
Identity / RBAC / PIM / Conditional Access
- 🚨 Azure custom role (ressources RBAC ARM, gratuit) ≠ Entra custom role (directory, exige P1 + rôle Privileged Role Administrator).
- 🚨 Custom role Azure : un seul bloc permission à la création.
- 🚨 Qui assigne un rôle ? Owner, RBAC Administrator, User Access Administrator — PAS Contributor. UAA peut s'auto-Owner (tout
Microsoft.Authorization) → préférer RBAC Administrator (assignments only). - 🚨 Contributor ne lit pas les secrets KV mais peut s'auto-attribuer une access policy via
vaults/write→ passer KV en RBAC. - 🚨 PIM Eligible (à activer JIT, état recherché, pas de standing access) vs Active (permanent, à limiter). PIM = P2.
- 🚨 Pas d'héritage des settings PIM Sub → RG : configurer à chaque scope.
- 🚨 Break-glass : exclus de PIM, surveillés à part. Assignation PIM impossible < 5 min.
- 🚨 Security Defaults ⇄ Conditional Access mutuellement exclusifs : une seule policy CA (même Off) bloque l'activation de SD.
- 🚨 Legacy auth (IMAP/POP3/SMTP) ne supporte pas MFA → SD/CA les bloquent.
- 🚨 Auth strength (Phishing-resistant/Passwordless) = plus fin que Require MFA, mais incompatible EAM → garder « Require MFA » avec EAM.
- 🚨 Risk-based CA = P2 (ID Protection envoie le signal, CA applique).
Application & Managed Identities / consent
- 🚨 App registration (app object) vs Enterprise application (Service Principal) : supprimer côté Enterprise apps = supprimer le SP, pas l'app object.
- 🚨 Managed Identity = pas d'app object, pas de secret ; marche uniquement vers ressources supportant l'auth Entra ID.
- 🚨 SAMI vs UAMI : supprimer la ressource détruit une System-Assigned MI → role assignments orphelins. User-Assigned = cycle de vie indépendant.
- 🚨 Permission Application vs Delegated :
Files.Read.AllApplication = tout le tenant ; Delegated = ce que le user voit. - 🚨 Admin consent ≠ accès pour tous : si
Assignment required = Yes, seuls les users assignés accèdent. - 🚨 Supprimer une app malveillante ne suffit pas (re-consent possible) → Disable d'abord (
accountEnabled=false). - 🚨
Application.ReadWrite.Allpermet d'ajouter un FIC à n'importe quelle app = backdoor discrète.
Network security (NSG / AVNM / firewall)
- 🚨 NSG stateful : autoriser l'inbound suffit (retour implicite) → pas de règle outbound miroir.
- 🚨 NSG sur GatewaySubnet non supporté (casse VPN/ER gateway).
- 🚨 ASG cross-VNet impossible : source et destination même VNet.
- 🚨 AVNM Security Admin Rules > NSG : un Deny AVNM ne peut pas être surpassé par un Allow NSG. Non appliqué par défaut sur VNets avec SQL MI / Databricks ; pas sur les private endpoints.
- 🚨 IP Forwarding activé sur la NIC du NVA (sinon next hop
VirtualAppliancedroppe), désactivé sur VM ordinaires. - 🚨 UDR mal pensée → routage asymétrique (retour ne repasse pas par le FW) = drops.
- 🚨 Peering ≠ chiffrement (backbone privé MS non chiffré sauf VNet encryption). ExpressRoute private peering non chiffré par défaut.
- 🚨
defaultActionsubtil : Public access = Disabled via template ne met pas forcémentdefaultAction=Deny(portail/CLI le font auto). - 🚨 WAF Front Door inspecte seulement les 128 premiers Ko du body. FD ≠ AGW (rulesets distincts).
- 🚨 IDPS « Alert seul » ne bloque pas → Zero Trust = Alert and deny. URL filtering complet exige TLS inspection.
Private & Public access
- Service Endpoint vs Private Endpoint :
| Service Endpoint | Private Endpoint | |
|---|---|---|
| Niveau | Subnet | Ressource |
| IP privée dans VNet | ❌ | ✅ |
| Accès on-prem (VPN/ER) | ❌ | ✅ |
| Soumis au firewall réseau | oui | jamais |
- 🚨 Service Endpoint Policy (SEP) filtre ce qu'un subnet atteint via SE (
Microsoft.Storageseulement) ; aucun effet via Private Endpoint. - 🚨 Private Endpoint ≠ blocage du public : désactiver le public explicitement (
publicNetworkAccess=Disabled). - 🚨 Zone
privatelink.*= 1 type de service : mélanger plusieurs PE écrase les A-records. DNS Zone Group : max 5 zones, 1 par nom. - 🚨 Résolution publique réussie ≠ accès (confirme juste l'existence du nom).
- 🚨 Empêcher l'activation du public org-wide → Azure Policy (deny).
Compute (Bastion / JIT / AKS / disk encryption)
- 🚨 JIT ≠ Bastion : JIT contrôle quand les ports management s'ouvrent (via NSG, exige Defender for Servers P2) ; Bastion supprime le besoin d'IP publique.
- 🚨 Bastion : subnet exactement
AzureBastionSubnet≥/26. SKU non downgradable. Session recording = Premium. - 🚨 AKS private cluster : pas de conversion d'un cluster public → recréation. Authorized IP ranges s'active sur cluster existant (incompatible API endpoint privé).
- 🚨 AKS
--disable-local-accounts→ rotater les certificats après (révoquer ce qui a fuité). - 🚨 Workload Identity (OIDC) remplace AAD Pod Identity (déprécié).
- 🚨 Defender for Containers : Azure Policy add-on requis pour les recommandations config. Security gating (vuln image) ≠ Gatekeeper (config).
- 🚨 Disk encryption : CMK = Disk Encryption Set. ADE incompatible avec EaH ou SSE+CMK sur la même VM. SSE seul laisse Defender Unhealthy (recommande EaH).
Storage
- 🚨 Account key = accès TOTAL + génération SAS. Rôles ARM (Owner/Contributor) ne donnent pas l'accès data Entra mais incluent
listkeys/action→ récupèrent la clé. - 🚨
AllowSharedKeyAccess = null→ traité commetrue(« non configuré » ≠ « désactivé »). - 🚨 CA sur le storage : désactiver Shared Key d'abord (une account key ignore CA).
- 🚨 Désactiver Shared Key casse Azure Files / Cloud Shell sans RBAC → migrer avant.
- 🚨 User Delegation SAS : permissions = intersection RBAC ∩ token.
- 🚨
AllowBlobPublicAccess=falsen'affecte pas$web(static site toujours public). - 🚨 Immutability / WORM : activer soft delete AVANT ; incompatible PITR ; pas sur NFS/SFTP.
- 🚨 CMK : KV avec soft delete + purge protection obligatoires.
Database (SQL)
- 🚨 Entra admin requis même pour une MI d'app.
CONNECTaccordé par défaut, rien d'autre → accorder aux rôles de base (pas aux users directement). - 🚨 Auditing : la Diagnostic Setting (
SQLSecurityAuditEvents), si supprimée → audit échoue silencieusement. Server + DB audit ensemble = doublons. - 🚨 DDM vs TDE vs Always Encrypted :
| DDM | TDE | Always Encrypted | |
|---|---|---|---|
| Type | Masquage présentation (pas chiffrement) | Chiffrement at-rest | Chiffrement côté client |
| Protège de l'admin DB | ❌ | ❌ | ✅ |
| Transparent app | ✅ | ✅ | ❌ (driver client) |
- 🚨 DDM n'empêche pas l'UPDATE ;
SELECT INTO/export propage la donnée masquée ; incompatible Always Encrypted. - 🚨 TDE : prérequis KV soft-delete + purge protection ; clé révoquée/réseau cassé → base
Inaccessible;masternon chiffrable. - 🚨 Always Encrypted : rotation CEK sans enclave déplace les données hors base (long). Ne remplace pas TDE.
Key Vault & Policy / Governance
- 🚨 KV RBAC (recommandé, control+data plane, héritage, octroi Owner/UAA) vs Access Policies (legacy, data plane, tout
vaults/writepeut s'auto-octroyer).- API 2026-02-01+ : RBAC = défaut des nouveaux vaults. Propagation RBAC ~10 min → « Access denied » trompeur.
- 🚨 Trusted services ≠ tous les services MS : Azure DevOps pas trusted. Bypass trusted persiste même
publicNetworkAccess=Disabled. - 🚨 Soft-delete + purge protection : recover d'un vault ne restaure pas les role assignments RBAC. Purge = permission distincte (Key Vault Purge Operator).
- 🚨 Rotation policy = clés uniquement (secrets/certs = autres mécaniques).
- 🚨 Managed HSM : single-tenant (KV Premium = multitenant). Security domain à sécuriser (quorum ≥3) — sa perte = perte définitive des clés.
- 🚨 Resource locks = plan de gestion uniquement :
ReadOnlyn'empêche pas la lecture/écriture de secrets (data plane). - 🚨 Azure Policy : Compliance state ≠ enforcement.
Modify/DeployIfNotExistsne corrigent que le nouveau → remediation task explicite pour l'existant (utilise la MI de l'assignation).
Defender for Cloud
- 🚨 CSPM (posture, Secure Score, alimenté MCSB) vs CWPP (threat protection/alertes → plan Defender payant).
- 🚨 Deux secure scores : classique (portail Azure, MCSB) vs risk-based (portail Defender, criticité d'actif). Valeurs différentes.
- 🚨 Defender for Servers Plan 1 vs Plan 2 :
| P1 | P2 | |
|---|---|---|
| MDE (EDR) + MDVM core | ✅ | ✅ |
| Premium MDVM | ❌ | ✅ |
| JIT VM access | ❌ | ✅ |
| FIM | ❌ | ✅ (à activer, pas auto) |
| Agentless scanning | ❌ | ✅ |
- 🚨 Compliance réglementaire (hors MCSB) exige ≥ 1 plan Defender payant ; Servers P1 ne l'ouvre pas.
- 🚨 Agentless scanner : le Subscription Owner doit activer Defender CSPM (sinon attack path & security explorer vides).
- 🚨 Sans Azure Arc, machine on-prem avec MDE direct = P1 seulement.
- 🚨 Defender for Cosmos DB = API for NoSQL uniquement.
Sentinel & Monitoring
- 🚨 Defender for Cloud (posture + alertes ressources) vs Sentinel = SIEM/SOAR (corrélation multi-sources, incidents, hunting, playbooks).
- 🚨 Alerte ≠ Incident : seules les règles Scheduled et NRT créent un incident auto. Autres produits → Microsoft incident creation rules.
- 🚨 Fusion / Microsoft security rules disparaissent dès Defender XDR incident integration activée (création prise par XDR).
- 🚨 DCR « générique » + log Security → events dans
Event, pasSecurityEvent. Pour Sentinel : connecteur Windows Security Events via AMA. - 🚨 AMA + ancien Log Analytics agent → double ingestion (double coût). Désactiver le legacy.
- 🚨 Playbooks = Logic Apps (facturation). Reco MS : automation rule à la création appelant le playbook.
Confusions classiques (X vs Y)
| X | Y | |
|---|---|---|
| Custom roles | Azure (ressources, gratuit) | Entra (directory, P1+) |
| PIM | Eligible (JIT, recherché) | Active (permanent, à limiter) |
| Endpoints | Service Endpoint (subnet, pas d'IP privée) | Private Endpoint (ressource, IP privée, on-prem) |
| SQL data protection | DDM (cosmétique) / TDE (at-rest) | Always Encrypted (client-side, vrai chiffrement) |
| AVNM | Security admin rules (Deny non-override) | NSG (override possible) |
| KV access | RBAC (recommandé) | Access policies (legacy, auto-élévation) |
| KV tier | Premium (multitenant) | Managed HSM (single-tenant, security domain) |
| Defender | CSPM (posture/Score) | CWPP (alertes, plan payant) |
| Plateforme | Defender for Cloud (posture+workload) | Sentinel (SIEM/SOAR, incidents) |
| Sentinel | Alerte (détection) | Incident (regroupement, Scheduled/NRT auto) |
| Servers | P1 (MDE/MDVM) | P2 (+JIT/FIM/agentless/compliance) |
Dates de retraite à connaître
| Feature | Date |
|---|---|
| Exam AZ-500 → SC-500 | 31 août 2026 |
| Classic administrators → RBAC | mai 2026 |
| KV control plane API < 2026-02-01 | 27 fév. 2027 |
| Sentinel dans le portail Azure → Defender portal | 31 mars 2027 |
| NSG Flow Logs → VNet Flow Logs | 30 sept 2027 |
| Azure Disk Encryption (ADE) → Encryption at Host | 15 sept 2028 |
PARTIE 2 — Commandes essentielles (CLI az + PowerShell Az)
Préinstallés dans Cloud Shell. Sinon
az login/Connect-AzAccount.
RBAC — assignments, custom roles, élévation
az role assignment create --assignee [email protected] \
--role "Storage Blob Data Reader" \
--scope /subscriptions/<sub>/resourceGroups/myrg/providers/Microsoft.Storage/storageAccounts/mysa
az role definition create --role-definition @customrole.json # UN seul bloc permission
az role definition list --custom-role-only true -o table
# Élever en User Access Administrator au niveau racine (gérer tous les MG/subs)
az rest --method post \
--url "https://management.azure.com/providers/Microsoft.Authorization/elevateAccess?api-version=2016-07-01"
New-AzRoleAssignment -SignInName [email protected] -RoleDefinitionName "Storage Blob Data Reader" -Scope "/subscriptions/<sub>/resourceGroups/myrg"
New-AzRoleDefinition -InputFile customrole.json
Storage — durcissement
# Shared Key off + public off + firewall Deny par défaut
az storage account update -g myrg -n mysa \
--allow-shared-key-access false --allow-blob-public-access false \
--default-action Deny --bypass AzureServices
az storage account network-rule add -g myrg --account-name mysa --vnet-name myvnet --subnet web
az storage account network-rule add -g myrg --account-name mysa --ip-address 203.0.113.5
az storage account keys renew -g myrg -n mysa --key key1
# CMK depuis Key Vault
az storage account update -g myrg -n mysa --encryption-key-source Microsoft.Keyvault \
--encryption-key-vault https://myvault.vault.azure.net --encryption-key-name mykey
# Immutability WORM (activer soft delete d'abord)
az storage container immutability-policy create --account-name mysa -c mycontainer --period 365 -g myrg
Set-AzStorageAccount -ResourceGroupName myrg -Name mysa -AllowSharedKeyAccess $false -AllowBlobPublicAccess $false
Update-AzStorageAccountNetworkRuleSet -ResourceGroupName myrg -Name mysa -DefaultAction Deny -Bypass AzureServices
Key Vault
# RBAC + soft-delete + purge protection
az keyvault create -g myrg -n myvault -l eastus \
--enable-rbac-authorization true --enable-purge-protection true --retention-days 90
az keyvault update -g myrg -n myvault --default-action Deny --bypass AzureServices
az keyvault network-rule add -g myrg -n myvault --ip-address 203.0.113.5
az keyvault key create --vault-name myvault -n mykey --protection software
az keyvault secret set --vault-name myvault -n mysecret --value "S3cr3t"
az keyvault certificate create --vault-name myvault -n mycert --policy "$(az keyvault certificate get-default-policy)"
az keyvault key rotation-policy update --vault-name myvault -n mykey --value rotation-policy.json
az keyvault key backup --vault-name myvault -n mykey --file mykey.backup
az keyvault key restore --vault-name myvault --file mykey.backup
New-AzKeyVault -ResourceGroupName myrg -VaultName myvault -Location eastus -EnableRbacAuthorization -EnablePurgeProtection
Update-AzKeyVaultNetworkRuleSet -VaultName myvault -DefaultAction Deny -Bypass AzureServices
Network — NSG / ASG / Private Endpoint / Service Endpoint
az network nsg create -g myrg -n mynsg
az network asg create -g myrg -n web-asg
az network nsg rule create -g myrg --nsg-name mynsg -n DenyRDP \
--priority 100 --access Deny --protocol Tcp --direction Inbound \
--source-address-prefixes Internet --destination-port-ranges 3389
az network vnet subnet update -g myrg --vnet-name myvnet -n web --network-security-group mynsg
# Service endpoint vers Storage
az network vnet subnet update -g myrg --vnet-name myvnet -n web --service-endpoints Microsoft.Storage
# Private Endpoint + DNS zone group
az network private-dns zone create -g myrg -n privatelink.blob.core.windows.net
az network private-endpoint create -g myrg -n pe-blob --vnet-name myvnet --subnet web \
--private-connection-resource-id <storage-id> --group-id blob --connection-name blobconn
az network private-endpoint dns-zone-group create -g myrg --endpoint-name pe-blob \
-n default --private-dns-zone privatelink.blob.core.windows.net --zone-name blob
SQL — Entra admin, Entra-only, audit, TDE
az sql server ad-admin create -g myrg --server mysqlsrv --display-name "SQL Admins" --object-id <group-id>
az sql server ad-only-auth enable -g myrg --name mysqlsrv # désactive SQL auth
az sql server audit-policy update -g myrg --name mysqlsrv --state Enabled \
--log-analytics-target-state Enabled --log-analytics-workspace-resource-id <law-id>
az sql db tde set -g myrg --server mysqlsrv --database mydb --status Enabled
az sql server tde-key set -g myrg --server mysqlsrv \
--server-key-type AzureKeyVault --kid https://myvault.vault.azure.net/keys/mykey/<ver>
Set-AzSqlServerActiveDirectoryAdministrator -ResourceGroupName myrg -ServerName mysqlsrv -DisplayName "SQL Admins" -ObjectId <group-id>
Enable-AzSqlServerActiveDirectoryOnlyAuthentication -ResourceGroupName myrg -ServerName mysqlsrv
Compute — AKS durci, encryption at host
az aks create -g myrg -n myaks --enable-private-cluster \
--enable-aad --enable-azure-rbac --disable-local-accounts \
--attach-acr myacr --enable-encryption-at-host --generate-ssh-keys
az aks rotate-certs -g myrg -n myaks # après disable-local-accounts
az vm update -g myrg -n myvm --set securityProfile.encryptionAtHost=true # VM désallouée
JIT se gère via Defender for Cloud (Plan 2) — voir Defender / portail.
Defender for Cloud — activer les plans
az security pricing create -n VirtualMachines --tier Standard --subplan P2
az security pricing create -n StorageAccounts --tier Standard
az security pricing create -n KeyVaults --tier Standard
az security pricing create -n SqlServers --tier Standard
az security pricing create -n Containers --tier Standard
az security pricing list -o table
Set-AzSecurityPricing -Name "VirtualMachines" -PricingTier "Standard" -SubPlan "P2"
Azure Policy — definition, assignment, remediation
az policy definition create -n deny-public-storage --rules rules.json --mode Indexed
az policy assignment create -n require-https --policy <policy-id> \
--scope /subscriptions/<sub>/resourceGroups/myrg --mi-system-assigned --location eastus
az policy remediation create -n remed1 --policy-assignment require-https --resource-group myrg
DCR / Sentinel
az monitor data-collection rule create -g myrg -n mydcr -l eastus --rule-file dcr.json
az monitor data-collection rule association create -g myrg -n myassoc --rule-id <dcr-id> --resource <vm-id>
Sentinel se gère surtout via le portail (onboarding workspace, règles analytiques, playbooks), l'extension
az sentinelou Microsoft Graph Security API. Après onboarding Defender portal : automation sur alert trigger.
PARTIE 3 — Quick wins (mémorisation)
Rôles data-plane (≠ rôles ARM control-plane)
Key Vault (RBAC) : Key Vault Administrator (full data) · Secrets User (lire secrets) · Crypto User (sign/wrap/decrypt) · Certificates Officer · Purge Operator (purger, distinct du delete). Owner/Contributor gèrent le vault, pas les secrets en RBAC.
Storage : Storage Blob Data Reader/Contributor/Owner (Owner = + POSIX ACL ADLS) · Queue/Table Data · File Data SMB Share. Owner/Contributor/Storage Account Contributor → listkeys = accès total via account key.
Plans Defender (az security pricing)
- Servers (
VirtualMachines) : P1 = MDE + MDVM core ; P2 = + JIT + FIM + agentless + MDVM premium. - Storage : malware scanning (par Go) + sensitive data detection (à activer).
- Containers / KeyVault / SqlServers / AppServices / CosmosDb (NoSQL only) / Api / Arm.
- Defender CSPM : attack path + security explorer + custom recommendations KQL + agentless (Owner requis).
Ports & service tags
- RDP 3389 / SSH 22 : jamais exposés à
Internet→ JIT / Bastion / AVNM Deny. - SQL 1433, HTTPS 443.
- Service tags :
AzureLoadBalancer(probe, ne pas bloquer),GatewayManager(AGW 65200-65535),Storage.<region>(préférer régionalisé). - IP magique Azure :
168.63.129.16(DNS plateforme + health probe LB).
Réflexes troubleshooting
- « Access denied » KV/RBAC juste après assignation ? → propagation ~10 min.
- CA (MFA) ne s'applique pas au storage ? → désactiver Shared Key d'abord.
- PE résout l'IP publique ? → zone
privatelink.*manquante / non liée. - PE créé mais public encore ouvert ? →
publicNetworkAccess=Disablednon appliqué. - Audit SQL silencieusement KO ? → Diagnostic Setting
SQLSecurityAuditEventssupprimée. - Base SQL
Inaccessible? → clé TDE révoquée / réseau KV cassé. - SAMI : role assignments orphelins ? → ressource supprimée → utiliser UAMI.
- Attack Path / Security Explorer vides ? → Defender CSPM agentless pas activé par un Owner.
- JIT indisponible ? → Defender for Servers Plan 2 requis.