Dernière révision : mai 2026
Configurez les services AWS figurant à l'examen DP-300 avec Terraform simple — un bloc à la fois, chacun étant lié à un domaine de l'examen. Le même code fonctionne sur OpenTofu.
À la fin de ce labo, vous aurez provisionné, avec du Terraform simple, une base de données Azure SQL durcie pour la production — un serveur avec authentification Microsoft Entra-seulement, une base de données unique sur le niveau payant le moins cher, l'audit acheminé vers un compte de stockage dédié, Microsoft Defender pour SQL avec des alertes de détection des menaces, et Log Analytics recevant tous les diagnostics du serveur. Ceci est la ligne de base de référence DP-300.
Déposez les extraits dans un unique fichier main.tf, exécutez terraform init, puis terraform apply étape par étape.
>= 1.5 ou OpenTofu >= 1.6.az login) — votre identité connectée devient l'administrateur Entra du serveur SQL à l'Étape 3.enabled = false sur la politique d'alerte de sécurité et la ressource de protection contre les menaces ne sera pas facturée.L'ensemble de la pile coûte environ 5 à 20 $/mois selon que Defender est activé ou non. Détruisez rapidement.
Ouverture Azure standard.
terraform {
required_version = ">= 1.5"
required_providers {
azurerm = { source = "hashicorp/azurerm", version = "~> 4.0" }
random = { source = "hashicorp/random", version = "~> 3.6" }
}
}
provider "azurerm" {
features {}
}
resource "random_id" "suffix" {
byte_length = 3
}
data "azurerm_client_config" "current" {}
locals {
tags = {
Project = "certlabpro-dp-300"
ManagedBy = "terraform"
}
}
resource "azurerm_resource_group" "main" {
name = "certlabpro-dp-300-rg"
location = "eastus"
tags = local.tags
}Le domaine Implémenter un environnement sécurisé du DP-300 teste la séparation entre les données de charge de travail et les données d'audit. Un modèle de production courant : un compte de stockage dédié uniquement aux journaux d'audit, avec une politique de rétention différente (plus longue) et des contrôles d'accès plus stricts que le stockage de la charge de travail elle-même.
Nous provisionnons ici le compte d'audit, définissons une rétention des blobs de 90 jours (ce qui correspond aux exigences de stockage d'audit SQL pour de nombreuses industries réglementées) et verrouillons l'accès public. Le serveur SQL de l'Étape 3 écrira son journal d'audit ici.
resource "azurerm_storage_account" "audit" {
name = "dp300audit${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
account_tier = "Standard"
account_replication_type = "LRS"
account_kind = "StorageV2"
https_traffic_only_enabled = true
min_tls_version = "TLS1_2"
allow_nested_items_to_be_public = false
blob_properties {
delete_retention_policy {
days = 90
}
}
tags = local.tags
}L'authentification Entra-seulement (azuread_authentication_only = true) est la réponse de meilleure pratique de production DP-300 — elle désactive entièrement la connexion administrateur SQL-auth, forçant chaque connexion via Entra ID. L'examen teste ce modèle à plusieurs reprises.
Le bloc d'administration Entra nomme le principal Terraform actuel — ce qui signifie qu'après terraform apply, vous pouvez vous connecter via sqlcmd -G en utilisant votre identité az login, sans aucun mot de passe SQL. La base de données sous-jacente est le plus petit niveau Basique ; passez à Serveur sans serveur à usage général pour les charges de travail de production avec une charge intermittente (mise en pause automatique après inactivité).
resource "azurerm_mssql_server" "main" {
name = "sql-dp300-${random_id.suffix.hex}"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
version = "12.0"
minimum_tls_version = "1.2"
public_network_access_enabled = true
# Entra-only mode: no SQL admin login created.
azuread_administrator {
login_username = "sqladmins"
object_id = data.azurerm_client_config.current.object_id
azuread_authentication_only = true
}
identity {
type = "SystemAssigned"
}
tags = local.tags
}
resource "azurerm_mssql_database" "main" {
name = "app"
server_id = azurerm_mssql_server.main.id
sku_name = "Basic"
max_size_gb = 2
tags = local.tags
}L'audit au niveau du serveur SQL capture chaque commande DBCC, modification de schéma, tentative de connexion et octroi/révocation. Nous le connectons au compte de stockage de l'Étape 2 avec une rétention de 90 jours. L'identité gérée du serveur SQL de l'Étape 3 reçoit le rôle Contributeur aux données des blobs de stockage sur le compte d'audit — le modèle d'authentification basé sur l'identité que le DP-300 préfère aux clés de compte de stockage.
L'audit au niveau du serveur s'applique à chaque base de données sous le serveur. L'examen teste la distinction entre l'audit au niveau du serveur (celui-ci) et l'audit au niveau de la base de données (remplacement par base de données). L'audit au niveau du serveur est la bonne réponse pour les questions du type toutes les bases de données doivent être auditées.
resource "azurerm_role_assignment" "sql_audit_writer" {
scope = azurerm_storage_account.audit.id
role_definition_name = "Storage Blob Data Contributor"
principal_id = azurerm_mssql_server.main.identity[0].principal_id
}
resource "azurerm_mssql_server_extended_auditing_policy" "main" {
server_id = azurerm_mssql_server.main.id
storage_endpoint = azurerm_storage_account.audit.primary_blob_endpoint
retention_in_days = 90
log_monitoring_enabled = true
depends_on = [azurerm_role_assignment.sql_audit_writer]
}Microsoft Defender pour SQL est la réponse du DP-300 pour Surveiller et optimiser la détection des menaces — il analyse les tentatives d'injection SQL, les emplacements de connexion anormaux, les tentatives de force brute et les escalades de privilèges inhabituelles. La ressource de protection avancée contre les menaces est l'activation par serveur ; la politique d'alerte de sécurité configure qui reçoit les e-mails lorsque des menaces sont détectées.
Nous connectons également un espace de travail Log Analytics et y acheminons les diagnostics de la base de données (informations SQL, métriques du magasin de requêtes, erreurs). Avec cette dernière pièce en place, la ligne de base SQL durcie du DP-300 est formée : authentification Entra-seulement, audit du serveur, détection des menaces, observabilité Log Analytics. Chaque question du DP-300 sur Gérer et configurer porte sur l'une de ces primitives.
resource "azurerm_log_analytics_workspace" "main" {
name = "log-dp300"
resource_group_name = azurerm_resource_group.main.name
location = azurerm_resource_group.main.location
sku = "PerGB2018"
retention_in_days = 30
tags = local.tags
}
resource "azurerm_mssql_server_security_alert_policy" "main" {
resource_group_name = azurerm_resource_group.main.name
server_name = azurerm_mssql_server.main.name
state = "Enabled"
email_account_admins = true
email_addresses = ["dba@example.com"] # replace
retention_days = 30
disabled_alerts = [] # all alert types enabled
}
resource "azurerm_monitor_diagnostic_setting" "sql_db" {
name = "diag"
target_resource_id = azurerm_mssql_database.main.id
log_analytics_workspace_id = azurerm_log_analytics_workspace.main.id
enabled_log {
category = "SQLInsights"
}
enabled_log {
category = "AutomaticTuning"
}
enabled_log {
category = "Errors"
}
metric {
category = "AllMetrics"
enabled = true
}
}terraform destroy supprime tout. Remarques :
terraform destroy arrête la facturation de ~15 $/mois/serveur.Le DP-300 couvre plus de surfaces SQL-sur-Azure que ce labo ne peut contenir — Azure SQL Managed Instance (forme de provisionnement distincte, facturation mensuelle), SQL Server sur machines virtuelles Azure (IaaS), Azure Database pour PostgreSQL Flexible Server, Azure Database pour MySQL Flexible Server, MariaDB (en cours de dépréciation), pools élastiques, groupes de géo-réplication / basculement, chiffrement transparent des bases de données avec des clés gérées par le client, Always Encrypted (au niveau des colonnes), masquage dynamique des données, sécurité au niveau des lignes, et toute la surface d'optimisation des performances du Query Store.
Nous nous en tenons à la base de données Azure SQL durcie unique car c'est le scénario DP-300 le plus courant et le substrat que toutes les autres variantes (MI, géo-réplication, groupes de basculement) étendent. Une fois que vous pouvez provisionner un serveur + une base de données avec l'authentification Entra-seulement + l'audit + Defender + Log Analytics en une seule fois, les variantes suivent la même forme avec des types de ressources différents.
Pour une couverture service par service, consultez les sections Parcourir, Guide et Editorial de cette page de certification.