WIKI
SC-500 Cloud and AI Security Engineer

05 · Implémenter la sécurité pour les bases de données

36 min de lecture Mis à jour le 21 octobre 2026
Sur cette page

Version : 1.2 · Date : 2026-10-21 · Domaine 2 de l'examen : Stockage sécurisé, bases de données et mise en réseau (25 à 30 %)

En une phrase : une base Azure SQL se protège par couches : le réseau décide qui peut atteindre la passerelle, Microsoft Entra ID décide qui peut se connecter, le chiffrement (TDE, Always Encrypted) et le masquage protègent la donnée elle-même, et l'audit plus Defender for Databases voient et signalent ce qui se passe.

Azure SQL : quatre couches de défense, de l'extérieur vers les données

Ce que l'examen demande#

Repris mot pour mot du guide d'étude SC-500, version anglaise :

# Compétence mesurée (guide officiel, en anglais) Section de ce chapitre
1 Implement platform-level security configurations in Azure SQL 1 à 5
2 Configure database auditing for Azure SQL Database and Azure SQL Managed Instance 6
3 Configure Defender for Databases protection across Azure database services 7

Les compléments de l'ancienne AZ-500 (Cosmos DB, PostgreSQL et MySQL, sauvegardes, SQL Server sur VM) sont en section 8.


1. Les bases à maîtriser#

1.1 La famille Azure SQL#

Azure SQL Database Azure SQL Managed Instance SQL Server on Azure VMs
Modèle PaaS : base (ou elastic pool) sur un logical server PaaS : instance quasi complète de SQL Server IaaS : vous gérez l'OS et SQL Server
Réseau Public endpoint (IP firewall, virtual network rules) et/ou private endpoint Déployée dans votre VNet (sous-réseau dédié) ; public endpoint optionnel (port 3342) Network interface de la VM, NSG
IP firewall du service Oui (serveur et base) Non : on filtre avec le NSG du sous-réseau Non (Windows Firewall, NSG)
Authentification SQL, Microsoft Entra SQL, Microsoft Entra, Windows (Kerberos pour principaux Entra) SQL, Windows, Entra (SQL Server 2022 et plus)
Audit Azure SQL Auditing (serveur ou base) SQL Server Audit (T-SQL : CREATE SERVER AUDIT) SQL Server Audit classique
Plan Defender Defender for Azure SQL Defender for Azure SQL Defender for SQL servers on machines

Le logical server n'est pas une machine : c'est un point d'administration commun (firewall, Microsoft Entra admin, audit, TDE protector) pour un ensemble de bases, joignable à <serveur>.database.windows.net.

1.2 Plan de contrôle et plan de données#

C'est la clé de beaucoup de questions :

Plan de contrôle (gestion) Plan de données (contenu)
Ce qu'on fait Créer le serveur, régler le firewall, l'audit, TDE, Defender Lire, écrire, créer des utilisateurs et des rôles dans la base
Qui autorise Azure RBAC Principaux SQL : connexions, utilisateurs, rôles de base (db_owner, db_datareader…)
Où Azure Resource Manager (portail, CLI, API) Connexion TDS au moteur SQL (port 1433)

Être Owner de l'abonnement ne donne pas le droit de lire les tables : il faut être un principal dans la base (ou le server admin).

1.3 Les rôles Azure intégrés pour SQL et la séparation des tâches#

Rôle Azure Peut Ne peut pas
SQL DB Contributor Gérer les bases Gérer la sécurité du serveur
SQL Server Contributor Gérer les serveurs et les bases, définir le Microsoft Entra admin Activer ou désactiver le Microsoft Entra-only authentication
SQL Managed Instance Contributor Gérer les instances managées Activer ou désactiver le Microsoft Entra-only authentication
SQL Security Manager Gérer les paramètres de sécurité : audit, firewall, masquage, Defender, Microsoft Entra-only Définir ou supprimer le Microsoft Entra admin
Contributor, Owner Tout ce qui précède —

Séparation des tâches voulue par Microsoft : celui qui crée le serveur ou le Microsoft Entra admin ne peut pas désactiver les protections, et celui qui règle la sécurité ne peut pas changer l'administrateur.


2. Sécuriser le réseau#

Trois chemins réseau vers Azure SQL Database

2.1 Les IP firewall rules (SQL Database)#

À la création, le firewall bloque tout accès au public endpoint. On ouvre par des règles :

Règles au niveau du serveur Règles au niveau de la base
Portée Toutes les bases du serveur Une seule base (y compris master)
Stockage Base master Dans la base elle-même (portable avec elle)
Outils Portail, PowerShell, CLI, REST, T-SQL T-SQL uniquement (sp_set_database_firewall_rule)
Limite 256 par serveur 256 par base
Prérequis Owner ou Contributor, SQL Server Contributor ou SQL Security Manager Une première règle serveur doit exister ; CONTROL DATABASE
Recommandation Pour les administrateurs, ou quand beaucoup de bases ont le même besoin À privilégier : meilleure isolation et portabilité

Ordre d'évaluation d'une connexion venant d'Internet :

flowchart TD
    A[Connexion TDS vers monserveur.database.windows.net] --> B{IP dans une règle<br/>au niveau de la base demandée ?}
    B -- Oui --> OK[Connexion autorisée à cette base]
    B -- Non --> C{IP dans une règle<br/>au niveau du serveur ?}
    C -- Oui --> OK2[Connexion autorisée à toutes les bases]
    C -- Non --> KO[Connexion refusée]
    OK --> AUTH[Puis authentification SQL ou Entra]
    OK2 --> AUTH

Points d'examen :

  • « Allow Azure services and resources to access this server » crée la règle 0.0.0.0 - 0.0.0.0 (AllowAllWindowsAzureIps). Elle autorise tous les services Azure, y compris ceux d'autres clients. Elle est sur Non par défaut à la création depuis le portail. Préférer les virtual network rules ou un private endpoint.
  • Une modification du firewall peut mettre jusqu'à 5 minutes à s'appliquer (sauf base contenue sans partenaire de basculement) ; DBCC FLUSHAUTHCACHE force l'actualisation.
  • Le firewall n'authentifie personne : il permet seulement d'essayer de se connecter.
# Règle au niveau du serveur (CLI)
az sql server firewall-rule create --resource-group rg-data-prd --server sql-app-prd \
  -n AdminBureau --start-ip-address 203.0.113.10 --end-ip-address 203.0.113.10
-- Règle au niveau de la base (T-SQL, dans la base concernée)
EXECUTE sp_set_database_firewall_rule @name = N'AppFront',
   @start_ip_address = '198.51.100.20', @end_ip_address = '198.51.100.20';

2.2 Les virtual network rules (service endpoints)#

Une virtual network rule autorise un sous-réseau précis. Elle s'appuie sur un service endpoint de type Microsoft.Sql activé sur le sous-réseau : le trafic reste sur la dorsale Azure et le serveur reconnaît le sous-réseau d'origine.

  • Le portail propose d'activer le service endpoint s'il manque.
  • Le drapeau IgnoreMissingVNetServiceEndpoint permet de créer la règle avant le service endpoint (pour limiter la coupure du sous-réseau pendant l'activation), mais la règle ne protège rien tant que le service endpoint n'est pas actif.
  • Le serveur reste joignable par son public IP : la règle ne fait que filtrer.

Un private endpoint donne au serveur une IP privée dans votre VNet ; on peut alors fermer le public.

Point clé Détail
Private DNS zone privatelink.database.windows.net ; les clients gardent le FQDN <serveur>.database.windows.net
Accès public Pas bloqué automatiquement quand on ajoute un private endpoint : cocher « Deny public network access »
Exfiltration Le private endpoint est lié à une ressource : un initié ne peut pas joindre une autre base de la région (contrairement à une règle NSG sur le service tag Sql.<région>)
Sur site Accessible par VPN ou ExpressRoute (peering privé), sans aucune règle de IP firewall
Approbation L'admin réseau crée le private endpoint, l'admin SQL approuve la connexion (séparation des tâches)

2.4 Public network access, TLS et connection policy#

Onglet Networking du logical server :

Paramètre Valeurs Effet
Public network access Disabled (valeur par défaut selon Microsoft Learn) · Selected networks Disabled : seules les connexions par private endpoint passent (erreur 47073 sinon) et on ne peut plus modifier les firewall rules (erreur 42101). En IaC, ne pas compter sur un défaut : Terraform met public_network_access_enabled = true si on ne le fixe pas
Minimum TLS version 1.2 (défaut : 1.2 et plus), 1.3 TLS 1.0 et 1.1 sont retirés ; une fois une version imposée, impossible de revenir au réglage par défaut ; erreur 47072 si le client est trop ancien
Connection policy Default · Redirect · Proxy Redirect (recommandée) : le client parle directement au nœud, ports 11000 à 11999 en sortie ; Proxy : tout passe par la passerelle sur 1433 ; Default : Redirect depuis Azure, Proxy depuis l'extérieur
Network security perimeter Préversion Frontière logique autour des PaaS (SQL Database seulement, pas Managed Instance)

Chiffrement en transit : le service impose toujours TLS (ForceEncryption = Yes). Côté client : Encrypt=True et TrustServerCertificate=False (ne jamais faire confiance aveuglément au certificat en production), ou le chiffrement strict de TDS 8.0.

2.5 Le réseau de SQL Managed Instance#

SQL Managed Instance : une instance déployée dans votre réseau virtuel

Exigence Détail
Sous-réseau dédié Uniquement des instances managées ; ni GatewaySubnet ni autre ressource
Subnet delegation À Microsoft.Sql/managedInstances
NSG et route table Obligatoires ; le service y ajoute ses règles et routes (préfixe Microsoft.Sql-managedInstances_UseOnly_mi-) par une network intent policy qui refuse les changements non conformes
Taille Au moins 32 adresses IP
VNet-local endpoint Port 1433, filtré par le NSG
Public endpoint Port 3342 (non modifiable), désactivé par défaut ; activation en deux étapes : l'administrateur de l'instance l'active, puis l'administrateur réseau ouvre le NSG
Private endpoint Seul moyen d'avoir une IP fixe ; utile depuis un autre réseau

Le IP firewall de SQL Database ne s'applique pas à Managed Instance : tout passe par le NSG.


3. Authentification et autorisation#

3.1 Authentification SQL ou Microsoft Entra#

SQL authentication Microsoft Entra authentication
Identifiant Nom + mot de passe stockés dans SQL Identité Entra (utilisateur, groupe, principal de service, managed identity)
MFA, Conditional Access Non Oui
Secrets Mots de passe à gérer et faire tourner Aucun avec une managed identity
Administrateur Server admin (créé avec le serveur, membre de db_owner) Microsoft Entra admin (un utilisateur ou, mieux, un groupe)

À retenir :

  • Il faut définir un Microsoft Entra admin pour utiliser l'authentification Entra.
  • Seuls des utilisateurs Entra peuvent créer d'autres utilisateurs Entra ; au départ, c'est le Microsoft Entra admin.
  • Les connexions Entra échouées n'apparaissent pas dans l'audit SQL : elles sont dans les journaux de connexion Entra.
-- Utilisateur de base contenu (sans connexion dans master) pour un groupe, puis une managed identity
CREATE USER [GRP-App-Lecteurs] FROM EXTERNAL PROVIDER;
CREATE USER [app-web-prd] FROM EXTERNAL PROVIDER;          -- nom d'affichage de la managed identity
ALTER ROLE db_datareader ADD MEMBER [GRP-App-Lecteurs];
ALTER ROLE db_datawriter ADD MEMBER [app-web-prd];

Les contained database users sont portables avec la base (geo-replication, déplacement). On peut aussi créer des connexions Entra au niveau serveur (CREATE LOGIN [..] FROM EXTERNAL PROVIDER) puis des utilisateurs FROM LOGIN.

3.2 Microsoft Entra-only authentication#

Elle désactive l'authentification SQL pour tout le serveur ou l'instance (y compris le server admin).

Point Détail
Prérequis Le Microsoft Entra admin doit être défini ; sinon le réglage est grisé et l'API échoue
Comptes SQL existants Ni supprimés ni modifiés, seulement empêchés de se connecter
Qui peut l'activer ou la désactiver Owner, Contributor, SQL Security Manager ; pas SQL Server Contributor ni SQL Managed Instance Contributor
Microsoft Entra admin Impossible de le supprimer tant que l'option est active
Serveur créé directement en « Microsoft Entra-only » Un administrateur CloudSA… est généré avec un mot de passe aléatoire détruit : il ne sert pas de compte de secours
Vérification T-SQL SELECT SERVERPROPERTY('IsExternalAuthenticationOnly') → 1
Limites Elastic jobs, SQL Data Sync, réplication transactionnelle… ne sont pas prises en charge

Azure Policy intégrée : Azure SQL Database should have Microsoft Entra-only authentication enabled (et l'équivalent pour Managed Instance ; noms parfois encore en « Azure Active Directory Only »). Effets : Audit (défaut), Deny, Disabled.

Piège : la stratégie Deny agit à la création. Si quelqu'un désactive l'option ensuite, Azure Policy ne l'empêche pas : le serveur apparaît Non conforme dans le rapport.

az sql server ad-only-auth enable --resource-group rg-data-prd --name sql-app-prd
az sql mi ad-only-auth get --resource-group rg-data-prd --name sqlmi-app-prd

Terraform (fournisseur azurerm, ressource azurerm_mssql_server, arguments vérifiés dans le registre) :

resource "azurerm_mssql_server" "app" {
  name                          = "sql-app-prd"
  resource_group_name           = "rg-data-prd"
  location                      = "francecentral"
  version                       = "12.0"
  minimum_tls_version           = "1.2"
  public_network_access_enabled = false           # accès uniquement par private endpoint
  connection_policy             = "Redirect"

  azuread_administrator {
    login_username              = "GRP-SQL-Admins"
    object_id                   = "<id-objet-du-groupe>"   # datasource (groupe Entra existant)
    azuread_authentication_only = true             # pas d'administrateur SQL ni de mot de passe à gérer
  }

  identity {
    type = "SystemAssigned"                        # identité du serveur : TDE avec clé client, audit vers le stockage
  }
}

3.3 Les autorisations dans la base#

  • Donner les droits à des rôles de base, jamais directement aux utilisateurs ; créer des rôles personnalisés au plus juste.
  • db_owner (et le server admin) : réservé à très peu de personnes.
  • EXECUTE AS pour restreindre le contexte d'exécution d'un module.
  • Managed Instance offre aussi des rôles au niveau serveur (fixes ou personnalisés).
  • Row-Level Security (RLS) : filtre les lignes selon l'utilisateur (5.2).

4. Chiffrer les données#

4.1 Les trois états de la donnée#

État Mécanisme Protège contre
En transit TLS (imposé par le service, 1.2 minimum) Écoute, interception sur le réseau
Au repos TDE (Transparent Data Encryption) Vol des fichiers, des sauvegardes, des disques
En cours d'utilisation Always Encrypted (avec ou sans secure enclave) Les administrateurs et opérateurs à hauts privilèges, les logiciels malveillants sur le serveur

4.2 TDE with service-managed key#

  • Activé par défaut sur toutes les nouvelles bases.
  • Chiffre toute la base (AES) : fichiers de données, journaux et sauvegardes, sans modification de l'application.
  • La clé de chiffrement de la base (DEK) est protégée par un built-in server certificate, géré et renouvelé par Microsoft.

4.3 TDE avec customer-managed key (CMK, BYOK)#

TDE avec customer-managed key

Le TDE protector devient une clé à vous, dans Azure Key Vault (FIPS 140-2 niveau 2) ou Azure Key Vault Managed HSM (FIPS 140-2 niveau 3). Il chiffre la DEK de chaque base du serveur (ou de l'instance) ; on peut aussi définir une CMK au niveau d'une base (SQL Database).

Exigence ou comportement Détail
Identité Server managed identity (système ou utilisateur)
Droits sur le Key Vault Rôle Key Vault Crypto Service Encryption User (modèle RBAC), ou access policy get, wrapKey, unwrapKey
Key Vault Soft delete et purge protection obligatoires (sinon la configuration échoue) ; « Allow trusted Microsoft services » si le firewall est actif (sauf private endpoint)
Clé RSA ou RSA-HSM 2048 ou 3072 bits ; AES 128 à 256 en préversion (SQL Database) ; état activé, date d'expiration future
Bascule service → client En ligne, sans rechiffrer la base : seule la DEK est rechiffrée
Rotation Manuelle ou automatique : nouvelle version détectée et appliquée sous 24 h ; identifiant de clé sans version possible (SQL Database)
Sauvegardes Restent chiffrées avec l'ancien protecteur : conserver toutes les anciennes versions de clé
Perte d'accès En 10 minutes environ, la base refuse les connexions et passe Inaccessible ; erreur 4XX du Key Vault → Inaccessible après 30 min ; panne réseau (5XX) : tampon de 24 h
Retour Accès rendu dans les 30 min : retour automatique dans l'heure ; au-delà, procédure manuelle et perte de certains paramètres de la base
Délai de propagation Un changement de droits sur le Key Vault peut mettre ≈ 10 minutes à s'appliquer
Bonnes pratiques Key Vault dédié à Azure SQL (≤ 500 bases usage général ou ≤ 200 bases critiques par Key Vault), resource lock, alertes sur la perte d'accès (Resource Health, Activity log), journaux AuditEvent
stateDiagram-v2
    [*] --> EnLigne
    EnLigne --> AccesPerdu: clé, droit ou Key Vault supprimé
    AccesPerdu --> Inaccessible: environ 10 min (30 min si erreur 4XX)
    Inaccessible --> EnLigne: accès rendu en moins de 30 min (retour automatique)
    Inaccessible --> Restauration: accès rendu après 30 min
    Restauration: Procédure dans le portail
    Restauration --> EnLigne

Piège : pour révoquer une clé compromise sans perte, on fait d'abord la rotation vers une nouvelle clé, on vérifie que toutes les bases l'utilisent, puis on désactive l'ancienne.

4.4 Always Encrypted#

Always Encrypted : le moteur SQL ne voit jamais les données en clair

Les colonnes sensibles (carte bancaire, numéro de sécurité sociale) sont chiffrées par le pilote côté client. Le moteur SQL ne voit jamais ni la donnée ni les clés : un DBA ou un opérateur cloud ne lit que du chiffré.

Clé Rôle Où
Column encryption key (CEK) Chiffre les données de la colonne Stockée chiffrée dans les métadonnées de la base
Column master key (CMK) Protège (chiffre) les CEK Hors de la base : Azure Key Vault (recommandé), Windows Certificate Store, HSM
Type de chiffrement Opérations possibles Sécurité
Deterministic Égalité (=, IN), jointure d'égalité, GROUP BY, DISTINCT, index ; collation binaire BIN2 pour les chaînes Moins sûr : motifs devinables si peu de valeurs (Oui/Non, Nord/Sud)
Randomized Aucun calcul (sans enclave) Plus sûr
Randomized + secure enclave Comparaisons, BETWEEN, LIKE, ORDER BY, GROUP BY, jointures, in-place encryption Type recommandé avec enclave

Secure enclaves dans SQL Database : VBS (logiciel, toutes les offres, propriété preferredEnclaveType = VBS) ou Intel SGX (série DC). Les CMK compatibles enclave sont dans Key Vault ou le Windows Certificate Store.

sequenceDiagram
    participant App as Application (pilote AE)
    participant SQL as Azure SQL
    participant KV as Key Vault
    App->>SQL: Requête paramétrée
    SQL-->>App: Métadonnées : colonne chiffrée, CEK chiffrée, emplacement de la CMK
    App->>KV: Déchiffrer la CEK avec la CMK
    KV-->>App: CEK en clair (gardée en cache côté client)
    App->>SQL: Paramètres chiffrés avec la CEK
    SQL-->>App: Résultats chiffrés
    Note over App: Le pilote déchiffre les résultats

Un utilisateur qui a le droit SELECT mais pas accès à la CMK récupère le texte chiffré, pas la donnée.


5. Protéger la donnée elle-même#

5.1 Le Dynamic Data Masking (DDM)#

Masque la donnée dans le résultat de la requête, sans la modifier dans la base. Ce n'est pas du chiffrement : la donnée reste en clair dans la base et les administrateurs la voient ; c'est une protection contre l'exposition aux utilisateurs sans privilège.

Fonction Résultat
Par défaut (default()) XXXX pour les chaînes, 0 pour les nombres, 1900-01-01 pour les dates
Carte de crédit XXXX-XXXX-XXXX-1234
E-mail (email()) [email protected]
Nombre aléatoire (random(a, b)) Valeur aléatoire dans la plage
Texte personnalisé (partial(préfixe, "remplissage", suffixe)) Premiers et derniers caractères visibles
Date et heure (datetime("Y")…) Masque l'année, le mois, le jour, l'heure…
  • Les administrateurs (server admin, Microsoft Entra admin, db_owner) voient toujours en clair.
  • GRANT UNMASK au niveau base, schéma, table ou colonne pour un utilisateur ou un rôle.
  • Portail : SQL Database seulement ; Managed Instance : par T-SQL.
  • Rôles Azure qui peuvent configurer : SQL Security Manager, SQL DB Contributor, SQL Server Contributor.
ALTER TABLE Data.Membership ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()');
GRANT UNMASK ON Data.Membership (Email) TO ServiceLead;   -- démasquage au niveau colonne

5.2 La Row-Level Security#

La RLS restreint les lignes selon l'utilisateur qui interroge (appartenance à un groupe, SESSION_CONTEXT) : par exemple un commercial ne voit que ses clients. Le prédicat est une fonction table inline, appliquée par une security policy (CREATE SECURITY POLICY), avec deux types de prédicats :

  • filter predicate : retire silencieusement les lignes des lectures (SELECT, UPDATE, DELETE) ;
  • block predicate : refuse avec une erreur les écritures qui violent la règle (AFTER INSERT, AFTER UPDATE, BEFORE UPDATE, BEFORE DELETE).

Piège : la RLS s'applique aussi à dbo, db_owner et au propriétaire de la table ; ce n'est pas un chiffrement et elle ne protège pas contre un administrateur qui désactive la stratégie (ALTER SECURITY POLICY … WITH (STATE = OFF)).

CREATE SECURITY POLICY Security.SalesFilter
    ADD FILTER PREDICATE Security.fn_securitypredicate(AppUserId) ON dbo.Sales,
    ADD BLOCK PREDICATE  Security.fn_securitypredicate(AppUserId) ON dbo.Sales AFTER INSERT
    WITH (STATE = ON);

5.3 Ledger#

Le ledger apporte une preuve cryptographique que les données n'ont pas été falsifiées (y compris par un DBA).

Point Détail
Tables Modifiables (historique des mises à jour et suppressions) ou en ajout seul (APPEND_ONLY = ON)
Mécanisme Hachage SHA-256 en arbre de Merkle, blocs chaînés
Digests Générés toutes les 30 secondes (s'il y a eu des transactions) et stockés hors de la base : immutable blob storage (conteneur sqldbledgerdigests, identité du serveur avec Storage Blob Data Contributor) ou Azure Confidential Ledger
Vérification Recalcule les hachages et les compare aux digests : toute falsification est détectée (pas empêchée)
Irréversible Une base ledger ne peut pas redevenir une base normale

5.4 Data Discovery & Classification#

Intégrée à SQL Database et Managed Instance :

  • Discovery & recommendations : le moteur repère les colonnes sensibles ;
  • Labeling persistant des colonnes (étiquette + type d'information), stratégie SQL Information Protection (personnalisable dans Defender for Cloud) ou sensitivity labels Microsoft Purview ;
  • Audit de la sensibilité : le champ data_sensitivity_information du journal d'audit indique la sensibilité des données renvoyées par chaque requête.

État au 21/10/2026 : le contrôle d'accès par sensitivity labels Microsoft Purview Information Protection pour Azure SQL est retiré (les stratégies existantes ne sont plus appliquées). La classification et l'audit de sensibilité restent disponibles ; Microsoft encourage Microsoft Purview pour la gouvernance avancée.

5.5 Quelle protection pour quel besoin ?#

Besoin Fonctionnalité
Un disque ou une sauvegarde volés ne doivent rien révéler TDE
Garder la maîtrise et la révocation de la clé TDE avec CMK
Le DBA ou l'hébergeur ne doivent jamais voir les numéros de carte Always Encrypted
Le support doit voir seulement les 4 derniers chiffres Dynamic Data Masking
Chaque agence ne voit que ses lignes Row-Level Security
Prouver à un auditeur qu'aucune ligne n'a été modifiée Ledger
Savoir où sont les données personnelles et qui les lit Classification + audit

6. Azure SQL Auditing#

Azure SQL Auditing : une auditing policy, trois destinations possibles

6.1 SQL Database : auditing policy de serveur ou de base#

  • Server-level auditing policy : s'applique aux bases existantes et futures du serveur, toujours, quels que soient les réglages de la base.
  • Database-level auditing policy : s'ajoute (ne remplace pas) ; la base est alors auditée deux fois.
  • Recommandation Microsoft : audit au niveau serveur seulement, sauf besoin d'une destination, d'une rétention ou d'événements différents pour une base précise. Pour les grosses charges OLTP avec beaucoup de bases, l'audit par base accélère l'exploitation des journaux.
  • Les copies, restaurations et géoréplications ne conservent pas une database-level auditing policy envoyée vers Log Analytics ou Event Hubs.

Audit action groups par défaut (requêtes, procédures stockées, connexions réussies et échouées) : BATCH_COMPLETED_GROUP, SUCCESSFUL_DATABASE_AUTHENTICATION_GROUP, FAILED_DATABASE_AUTHENTICATION_GROUP.

6.2 Les destinations#

Destination Ce qu'il faut savoir
Storage account Fichiers .xel (append blobs) lisibles avec SSMS ou sys.fn_get_audit_file ; authentification par managed identity (recommandée) ou clés d'accès ; rétention 0 = illimitée ; un passage de 0 à N jours ne s'applique qu'aux journaux écrits ensuite ; derrière un firewall ou un VNet : compte StorageV2
Log Analytics Table / catégorie SQLSecurityAuditEvents ; requêtes KQL, Microsoft Sentinel
Event Hubs Diffusion vers un SIEM tiers ou un traitement maison
  • Vers Log Analytics ou Event Hubs, le service crée un diagnostic setting SQLSecurityAuditEvents_… : s'il est supprimé, l'audit échoue silencieusement → créer une alerte sur la suppression des diagnostic settings.
  • Immutable storage possible : l'option « Allow protected append writes » doit être sur Append blobs (ou Block and append blobs) ; la rétention de l'immutability policy doit être plus courte que la rétention de l'audit SQL.
  • Si les Outbound networking restrictions du serveur sont actives, autoriser le FQDN du storage account d'audit.
  • Limites : champs statement et data_sensitivity_information tronqués à 4 000 caractères ; les tables temporaires de tempdb ne sont pas auditées ; en charge extrême, des événements peuvent manquer.
  • Lire les journaux d'audit exige VIEW DATABASE SECURITY AUDIT dans la base.
# Audit de serveur vers Log Analytics (CLI)
az sql server audit-policy update --resource-group rg-data-prd --name sql-app-prd --state Enabled \
  --log-analytics-target-state Enabled \
  --log-analytics-workspace-resource-id /subscriptions/<sub>/resourceGroups/rg-sec-prd/providers/Microsoft.OperationalInsights/workspaces/law-sec-prd
# Terraform : audit de serveur vers Azure Monitor (le paramètre de diagnostic de la base master est créé à part)
resource "azurerm_mssql_server_extended_auditing_policy" "app" {
  server_id              = azurerm_mssql_server.app.id
  log_monitoring_enabled = true
}
// Activité auditée des dernières 24 h, par action, adresse IP cliente et connexion
AzureDiagnostics
| where Category == "SQLSecurityAuditEvents" and TimeGenerated > ago(24h)
| summarize Evenements = count() by action_name_s, client_ip_s, server_principal_name_s
| order by Evenements desc

// Échecs de connexion SQL (groupe FAILED_DATABASE_AUTHENTICATION_GROUP)
AzureDiagnostics
| where Category == "SQLSecurityAuditEvents" and action_name_s == "DATABASE AUTHENTICATION FAILED"
| summarize Echecs = count() by client_ip_s, server_principal_name_s, bin(TimeGenerated, 1h)

6.3 Auditing of Microsoft support operations#

Trace ce que font les ingénieurs du support Microsoft quand ils accèdent à votre serveur pendant une demande de support.

  • SQL Database : bascule « Enable Auditing of Microsoft support operations » sur la page Audit du serveur ; mêmes destinations ; requête AzureDiagnostics | where Category == "DevOpsOperationsAudit".
  • Managed Instance : créer un audit de serveur séparé avec OPERATOR_AUDIT = ON (cocher la case sur un audit existant le remplace et ne journalise plus que le support) ; catégorie de diagnostic DevOps operations Audit Logs.

6.4 L'audit de SQL Managed Instance#

Managed Instance utilise SQL Server Audit :

-- Vers un conteneur blob : informations d'identification SAS, puis audit, spécification et activation
CREATE CREDENTIAL [https://stauditprd.blob.core.windows.net/sqlaudit]
  WITH IDENTITY = 'SHARED ACCESS SIGNATURE', SECRET = '<jeton SAS sans le ?>';
CREATE SERVER AUDIT [Audit-Prd] TO URL (PATH = 'https://stauditprd.blob.core.windows.net/sqlaudit', RETENTION_DAYS = 90);

-- Ou vers Log Analytics / Event Hubs : paramètre de diagnostic SQLSecurityAuditEvents, puis
CREATE SERVER AUDIT [Audit-Monitor] TO EXTERNAL_MONITOR;

CREATE SERVER AUDIT SPECIFICATION [Spec-Prd] FOR SERVER AUDIT [Audit-Monitor]
  ADD (SUCCESSFUL_LOGIN_GROUP), ADD (FAILED_LOGIN_GROUP), ADD (BATCH_COMPLETED_GROUP) WITH (STATE = ON);
ALTER SERVER AUDIT [Audit-Monitor] WITH (STATE = ON);
  • Le jeton SAS expire : le renouveler sinon l'audit échoue (SSMS crée l'information d'identification automatiquement).
  • RETENTION_DAYS absent = 0 = conservation illimitée.

7. Defender for Databases#

Defender for Databases : quatre plans, une activation

7.1 Les quatre plans#

Dans Defender for Cloud > Environment settings, le plan Databases active d'un coup quatre plans, facturés séparément (bouton Select types pour choisir) :

Plan Ressources protégées Fonctions
Defender for Azure SQL (SqlServers) SQL Database et elastic pools, SQL Managed Instance, Synapse dedicated SQL pools Vulnerability Assessment + Advanced Threat Protection ; facturation par nœud (serveur ou instance)
Defender for SQL servers on machines (SqlServerVirtualMachines) SQL Server sur VM Azure, SQL Server enabled by Azure Arc (sur site, AWS, GCP) Les mêmes ; analyse toutes les 12 h ; extension Defender for SQL et SQL IaaS Agent extension ; compte du service SQL sysadmin
Defender for open-source relational databases (OpenSourceRelationalDatabases) PostgreSQL et Azure Database for MySQL flexible server (tous niveaux), Amazon RDS (Aurora, PostgreSQL, MySQL, MariaDB) ; pas les machines Arc Alertes : force brute (réussie ou non), accès et requêtes anormaux, activité suspecte
Defender for Azure Cosmos DB (CosmosDbs) Cosmos DB API NoSQL seulement (pas Cassandra, MongoDB, Table, Gremlin) Injection SQL, Tor, IP suspectes, extraction de données, identités compromises ; n'accède pas aux données, sans impact de performance

Activation : au niveau abonnement (recommandé : les nouvelles ressources sont protégées automatiquement) ou par ressource (désactiver au niveau abonnement puis activer serveur par serveur : Security > Microsoft Defender for Cloud > Enable Microsoft Defender for SQL). Rôle : SQL Security Manager ou server admin, Owner de l'abonnement pour le plan sur machines (il déploie des stratégies).

az security pricing create -n SqlServers --tier standard
az security pricing create -n OpenSourceRelationalDatabases --tier standard

7.2 SQL Vulnerability Assessment#

Analyse en lecture seule fondée sur les bonnes pratiques Microsoft : configurations, autorisations excessives, données sensibles non protégées, firewall rules. Chaque constat donne une correction (souvent un script). On définit une baseline pour accepter les écarts voulus.

Express configuration (recommandée) Classic configuration
Stockage des résultats Géré par Microsoft (même région que le serveur) Storage account à vous
Étendue Abonnement, serveur Abonnement, serveur, base
Analyse périodique Toujours active Désactivable
Baseline Par lot, effet sans nouvelle analyse Règle par règle, effet après une nouvelle analyse
Droits pour modifier SQL Security Manager (ou Security Admin) SQL Security Manager et Storage Blob Data Reader et Owner du storage account
Exportation CSV, Azure Resource Graph Excel, Azure Resource Graph

Les API classiques de le Vulnerability Assessment et de la protection avancée sont retirées le 16 août 2027 : migrer vers la express configuration. En Terraform : express_vulnerability_assessment_enabled = true sur azurerm_mssql_server.

7.3 Advanced Threat Protection#

Alertes exploitables (détail de l'activité, tactique MITRE ATT&CK, actions recommandées) dans Defender for Cloud, exportables vers Microsoft Sentinel ou un SIEM :

  • injection SQL potentielle (y compris une application qui génère une requête défectueuse) ;
  • force brute (nombreux échecs avec des identifiants différents) ;
  • accès depuis un emplacement, un centre de données ou un principal inhabituel, application potentiellement dangereuse ;
  • activité suspecte, par exemple depuis une machine compromise qui parle à un serveur de commande et contrôle.

Le pilotage global (Secure Score, recommandations, conformité) est au chapitre 10.


8. Compléments AZ-500#

8.1 Azure Cosmos DB#

  • Désactiver l'authentification par clés (disableLocalAuth = true, option Key-based authentication: Disable à la création) : seule Microsoft Entra authentication reste possible.
  • Data plane RBAC propre à Cosmos DB : rôles intégrés Cosmos DB Built-in Data Reader et Cosmos DB Built-in Data Contributor, rôles personnalisés par dataActions (notDataActions non pris en charge) ; ces attributions ne se gèrent pas dans le portail (CLI, PowerShell, Bicep).
  • Réseau : IP firewall, réseaux virtuels, private endpoint (zone privatelink.documents.azure.com).
  • Defender for Azure Cosmos DB : 7.1.
az resource update --resource-group rg-data-prd --name cosmos-app-prd \
  --resource-type "Microsoft.DocumentDB/databaseAccounts" --set properties.disableLocalAuth=true

8.2 Azure Database for PostgreSQL et MySQL flexible server#

Sujet Azure Database for PostgreSQL flexible server (même logique pour MySQL)
Authentification PostgreSQL et Microsoft Entra ou Microsoft Entra-only authentication ; Microsoft Entra admin : utilisateur, groupe, principal de service ou managed identity ; SCRAM pour les comptes locaux
Réseau, choix à la création Accès privé (VNet integration, sous-réseau délégué) ou accès public (IP autorisées) + private endpoint
Piège Pas de private endpoint sur un serveur créé en VNet integration
Entra en accès privé Autoriser la sortie vers le service tag AzureActiveDirectory (NSG, routes)
Chiffrement TLS imposé ; customer-managed key possible
Menaces Defender for open-source relational databases

8.3 Sauvegardes et rétention#

Valeur
Point-in-time restore (PITR) 1 à 35 jours (7 par défaut sur Managed Instance)
Long-term retention (LTR) Sauvegardes complètes hebdomadaires, mensuelles, annuelles, jusqu'à 10 ans
Immutability des LTR (WORM) SQL Database seulement ; protège même contre un administrateur
Backup storage redundancy LRS, ZRS ou GRS (geo-restore dans la région jumelée)
Suppression du logical server Supprime les bases (non récupérables) mais pas les sauvegardes LTR

8.4 SQL Server on Azure VMs#

  • SQL IaaS Agent extension : fait apparaître les recommandations de sécurité sur la ressource SQL virtual machine.
  • Defender for SQL servers on machines pour les vulnérabilités et les menaces.
  • Authentification Entra (SQL Server 2022 et plus) : la managed identity choisie doit avoir le rôle Directory Readers ou les rôles d'application Graph User.Read.All, GroupMember.Read.All, Application.Read.All.
  • Le reste relève de la sécurité des VM : chiffrement de disque, Bastion, JIT (chapitre 08).

9. Labs conseillés#

À faire dans un abonnement de test, avec une base SQL Database du niveau le moins cher (ou serverless).

Lab 1 · Microsoft Entra-only et managed identity

  1. Créer un logical server avec un groupe Entra comme Microsoft Entra admin.
  2. Se connecter avec SSMS ou Azure Data Studio en Microsoft Entra MFA ; créer CREATE USER [<managed identity>] FROM EXTERNAL PROVIDER et lui donner db_datareader.
  3. Activer Microsoft Entra-only ; tenter une connexion avec l'administrateur SQL : refus. SELECT SERVERPROPERTY('IsExternalAuthenticationOnly') renvoie 1.

Lab 2 · Firewall, règle de base et private endpoint

  1. Ajouter une firewall rule serveur pour votre IP ; se connecter.
  2. Dans une base, sp_set_database_firewall_rule pour une autre IP ; vérifier dans sys.database_firewall_rules.
  3. Créer un private endpoint et la zone privatelink.database.windows.net ; depuis une VM du VNet, nslookup <serveur>.database.windows.net renvoie l'IP privée.
  4. Passer Public network access sur Disabled : votre poste reçoit l'erreur 47073, la VM se connecte toujours.

Lab 3 · Masquage, RLS et Always Encrypted

  1. Masquer une colonne Email avec email(), se connecter avec un utilisateur sans UNMASK : valeur masquée.
  2. Créer une stratégie RLS avec filter predicate : chaque utilisateur ne voit que ses lignes, même db_owner.
  3. Chiffrer une colonne avec l'assistant Always Encrypted de SSMS (CMK dans Key Vault) ; la lire sans Column Encryption Setting=Enabled : texte chiffré.

Lab 4 · Audit vers Log Analytics

  1. Activer l'audit au niveau serveur vers un espace Log Analytics.
  2. Provoquer des échecs de connexion (mauvais mot de passe) et quelques requêtes.
  3. Lancer la requête KQL de la section 6.2 : les événements DATABASE AUTHENTICATION FAILED apparaissent après quelques minutes.

Lab 5 · Defender for Azure SQL

  1. Activer Defender for Azure SQL sur le serveur (express configuration de le Vulnerability Assessment).
  2. Lancer une analyse, ouvrir un constat, appliquer le script de correction ou l'ajouter à la baseline.
  3. Observer la recommandation disparaître sans nouvelle analyse (comportement de la express configuration).

10. Les pièges d'examen#

Situation dans la question Réponse attendue Pourquoi
Isoler une base des autres bases du même serveur au niveau réseau Firewall rule au niveau de la base (T-SQL) Une règle serveur ouvre toutes les bases
Créer une firewall rule de base depuis le portail Impossible : T-SQL uniquement —
« Allow Azure services » activé Risque : tous les services Azure, d'autres clients compris Préférer règle VNet ou private endpoint
Private endpoint créé, mais Internet passe encore Cocher Deny public network access Pas bloqué par défaut
Filtrer l'accès à une Managed Instance NSG du sous-réseau Pas de IP firewall sur MI
Port du point public de MI 3342 (point local : 1433) Non modifiable
Interdire l'authentification SQL partout Microsoft Entra-only authentication + Azure Policy Deny à la création La stratégie n'empêche pas une désactivation ultérieure (non conforme)
Un SQL Server Contributor n'arrive pas à activer « Microsoft Entra-only » Normal : il faut SQL Security Manager (ou Contributor, Owner) Séparation des tâches
Le DBA ne doit pas voir les numéros de carte Always Encrypted TDE et DDM ne protègent pas des administrateurs
Recherche LIKE ou tri sur colonne chiffrée Always Encrypted avec secure enclave et chiffrement randomized Le deterministic ne fait que l'égalité
Configurer TDE avec CMK échoue Activer soft delete + purge protection sur le Key Vault Exigence vérifiée par Azure SQL
Clé du Key Vault supprimée par erreur La base devient Inaccessible en ≈ 10 min ; restaurer l'accès en moins de 30 min Retour automatique sinon procédure longue
Restaurer une vieille sauvegarde après rotation de la CMK Conserver les anciennes versions de clé Les sauvegardes gardent leur protecteur
Audit activé au serveur et à la base La base est auditée deux fois Les deux coexistent
Journaux d'audit qui n'arrivent plus dans Log Analytics Diagnostic setting SQLSecurityAuditEvents supprimé : échec silencieux Créer une alerte
Audit vers un stockage derrière firewall Managed identity du serveur + Storage Blob Data Contributor, compte StorageV2 Les clés d'accès sont déconseillées
Échecs de connexion Entra introuvables dans l'audit SQL Les chercher dans les journaux de connexion Entra La passerelle les refuse avant la base
Tracer ce que fait le support Microsoft Auditing of Microsoft support operations Sur MI : audit séparé OPERATOR_AUDIT = ON
Protéger SQL Server sur site Defender for SQL servers on machines via Azure Arc Pas Defender for Azure SQL
Protéger un compte Cosmos DB API MongoDB avec Defender Non pris en charge API NoSQL seulement
Vulnerability Assessment sans storage account Express configuration La classique exige un stockage

11. Scénarios d'entraînement#

1. Une application App Service se connecte à Azure SQL Database avec un compte SQL dont le mot de passe est dans les paramètres de l'application. Le RSSI veut supprimer ce secret et interdire tout compte SQL. Que faire ?

Activer le managed identity d'App Service, définir un groupe Entra comme Microsoft Entra admin du serveur, créer le contained database user CREATE USER [app] FROM EXTERNAL PROVIDER avec les rôles nécessaires, puis activer Microsoft Entra-only authentication (par un SQL Security Manager) et l'imposer à la création des futurs serveurs avec la stratégie Azure Policy en Deny.

2. Le logical server doit n'être joignable que depuis le VNet de production et le site de Lyon (relié par ExpressRoute), sans aucune exposition Internet. Quelle configuration ?

Private endpoint dans le VNet (zone DNS privatelink.database.windows.net reliée et résolue depuis le site), Public network access : Disabled. Pas de règle de IP firewall nécessaire.

3. Une équipe a activé « Allow Azure services and resources to access this server » pour qu'une Function App se connecte. Quel est le risque et quelle alternative ?

La règle 0.0.0.0 laisse passer n'importe quelle ressource Azure, y compris d'autres abonnements et clients. Alternative : VNet integration de la Function App puis virtual network rule (service endpoint Microsoft.Sql) ou private endpoint.

4. La conformité exige que l'entreprise puisse rendre les données illisibles à tout moment, y compris pour Microsoft. Que proposer ?

TDE avec customer-managed key dans un Key Vault (ou Managed HSM) dédié, soft delete et protection contre la purge, server managed identity avec Key Vault Crypto Service Encryption User, rotation automatique. Révoquer l'accès à la clé rend les bases Inaccessibles.

5. Les conseillers du centre d'appels doivent confirmer un client avec les 4 derniers chiffres de sa carte, sans voir le reste. Les développeurs ne doivent rien voir en production. Que faire ?

Dynamic Data Masking : fonction Carte de crédit sur la colonne, aucun UNMASK pour les conseillers ni les développeurs. Si la menace inclut les DBA, ajouter Always Encrypted (le masquage ne les arrête pas).

6. L'équipe sécurité veut tous les événements d'audit de 40 bases dans Microsoft Sentinel, sans double journalisation.

Server-level auditing policy (toutes les bases, y compris les futures) vers Log Analytics (l'espace de travail Sentinel), audit au niveau base désactivé, alerte sur la suppression du diagnostic setting SQLSecurityAuditEvents.

7. Une Managed Instance doit écrire son audit dans un storage account. Quelles étapes ?

Créer un conteneur privé, une SAS (service Blob), puis en T-SQL CREATE CREDENTIAL (URL du conteneur, SAS sans le ?), CREATE SERVER AUDIT … TO URL, une audit specification serveur ou base, et ALTER SERVER AUDIT … WITH (STATE = ON). Renouveler la SAS avant son expiration. (Ou bien TO EXTERNAL_MONITOR avec un diagnostic setting vers Log Analytics.)

8. Le RSSI veut être alerté d'une injection SQL et connaître les droits excessifs sur 200 serveurs Azure SQL et 30 serveurs SQL sur site.

Activer Defender for Azure SQL au niveau abonnement (Vulnerability Assessment en express configuration + protection avancée) et Defender for SQL servers on machines après avoir connecté les serveurs sur site à Azure Arc.

9. Après une rotation manuelle du TDE protector, un administrateur supprime l'ancienne clé du Key Vault. Une restauration à un instant donné d'il y a 10 jours échoue. Pourquoi ?

Les sauvegardes antérieures à la rotation sont chiffrées avec l'ancien protecteur : il fallait conserver toutes les versions de clé. La restaurer depuis le soft delete du Key Vault (d'où l'intérêt de la purge protection).

10. Une application de comptabilité doit prouver aux commissaires aux comptes qu'aucune écriture n'a été modifiée a posteriori, même par un DBA.

Tables ledger (en ajout seul pour le grand livre), automatic digest storage dans un immutable blob storage verrouillé ou Azure Confidential Ledger, et vérification périodique du ledger.


12. Pour aller plus loin (au-delà de l'examen)#

  • Conditional Access : l'authentification Entra vers Azure SQL profite de la MFA et de le Conditional Access (chapitre 01) ; à tester sur les comptes d'administration des bases.
  • Failover groups et geo-replication : les firewall rules au niveau base et les utilisateurs contenus sont stockés dans la base et la suivent ; vérifier la configuration de sécurité du serveur secondaire (règles serveur, connexions, accès à la clé TDE).
  • Outbound networking restrictions du logical server (outbound_network_restriction_enabled) : limite les FQDN que le moteur peut joindre (anti-exfiltration).
  • Microsoft Purview : catalogue, classification et gouvernance des données au-delà de la base.
  • Azure Policy pour SQL : imposer TLS 1.2, l'audit, Defender, l'accès public désactivé (chapitre 03).
  • Hyperscale avec CMK : chaque serveur de pages compte dans la limite par Key Vault (500 au plus), à surveiller quand la base grossit.

13. Fiche à retenir#

  • Plan de contrôle = Azure RBAC ; plan de données = utilisateurs et rôles SQL.
  • SQL Server Contributor définit le Microsoft Entra admin mais pas « Microsoft Entra-only » ; SQL Security Manager l'inverse.
  • Firewall : règles base (T-SQL seulement, prioritaires, portables) et serveur (256 max, master) ; jusqu'à 5 min.
  • 0.0.0.0 « Allow Azure services » = tout Azure, autres clients compris.
  • Règle VNet = service endpoint Microsoft.Sql ; private endpoint = IP privée + Refuser l'accès public à cocher.
  • Connection policy : Redirect (11000-11999) recommandée, Proxy (1433) ; TLS 1.2 minimum.
  • Managed Instance : sous-réseau dédié délégué, NSG + route table obligatoires, point public 3342 désactivé par défaut.
  • Microsoft Entra-only : Microsoft Entra admin obligatoire, comptes SQL bloqués (non supprimés), Policy Deny à la création.
  • CREATE USER [x] FROM EXTERNAL PROVIDER = utilisateur contenu Entra (groupe, managed identity).
  • TDE par défaut ; CMK : identité du serveur, wrapKey/unwrapKey, soft delete + purge, perte d'accès → Inaccessible (≈ 10 min, 30 min pour revenir seul).
  • Always Encrypted : CEK (dans la base, chiffrée) + CMK (hors base) ; deterministic = égalité ; enclave = LIKE, tri, in-place encryption.
  • DDM masque le résultat (pas un chiffrement) ; UNMASK granulaire ; RLS filtre les lignes ; ledger prouve l'intégrité.
  • Auditing : policy serveur (toujours appliquée) recommandée ; base en plus = double ; 3 groupes par défaut ; Stockage / Log Analytics / Event Hubs ; rétention 0 = illimitée.
  • MI : CREATE SERVER AUDIT TO URL (SAS) ou TO EXTERNAL_MONITOR ; support Microsoft : audit séparé OPERATOR_AUDIT = ON.
  • Defender bases de données = 4 plans : Azure SQL, SQL sur machines (VM, Arc), open source (PostgreSQL, MySQL flexible servers, RDS), Cosmos DB (NoSQL seulement).
  • VA express (sans stockage, recommandée) ; API classiques retirées le 16/08/2027.

Références#

Toutes lues le 21/10/2026 sur Microsoft Learn :

Sur cette page
Échap

Tape au moins 2 lettres. Plusieurs mots : tous doivent apparaître.