最后审核时间:2026年5月
使用原生 Terraform 构建 DP-300 考试中的 AWS 服务——每次构建一个代码块,并紧扣考试领域。相同的代码可在 OpenTofu 上运行。
在本实验结束时,您将使用纯 Terraform 预配一个生产级别的 Azure SQL Database — 具有仅限 Microsoft Entra 身份验证的服务器、最便宜的付费层上的单个数据库、将审计信息传输到专用存储帐户、带有威胁检测警报的 Microsoft Defender for SQL 以及接收所有服务器诊断的 Log Analytics。这是 DP-300 的参考基线。
将这些代码片段放入一个 main.tf 文件中,运行 terraform init,然后逐步运行 terraform apply。
>= 1.5 或 OpenTofu >= 1.6。az login) — 您登录的身份将在步骤 3 中成为 SQL Server 的 Entra 管理员。enabled = false 设置为禁用,这样威胁防护资源就不会产生费用。整个堆栈每月约 5-20 美元,具体取决于 Defender 是否启用。请及时销毁资源。
标准的 Azure 开场白。
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
}DP-300 的“实现安全环境”领域测试了工作负载数据和审计数据之间的分离。一种常见的生产模式是:一个专门用于审计日志的存储帐户,其保留策略(更长)和访问控制比工作负载自己的存储更严格。
我们在此处预配审计帐户,设置 90 天的 Blob 保留期(符合许多受监管行业对 SQL 审计存储的要求),并锁定公共访问。步骤 3 中的 SQL Server 将在此处写入其审计日志。
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
}仅限 Entra 身份验证 (azuread_authentication_only = true) 是 DP-300 生产最佳实践的答案 — 它完全禁用了 SQL 身份验证管理员登录,强制所有连接通过 Entra ID。考试会反复测试这种模式。
Entra 管理员块指定了当前的 Terraform 主体 — 这意味着在 terraform apply 之后,您可以使用 az login 身份通过 sqlcmd -G 连接,而无需任何 SQL 密码。底层的数据库是最小的 Basic 层;对于具有间歇性负载(空闲后自动暂停)的生产工作负载,请切换到 General Purpose Serverless。
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
}SQL Server 级别的审计会捕获每个 DBCC 命令、架构更改、登录尝试以及授予/撤销操作。我们将其连接到步骤 2 中的存储帐户,并设置 90 天的保留期。步骤 3 中的 SQL Server 托管标识被授予对审计帐户的 Storage Blob Data Contributor 权限 — DP-300 倾向于这种基于身份的身份验证模式,而非基于存储帐户密钥的模式。
服务器级别审计适用于服务器下的所有数据库。考试会测试服务器级别审计(此处所示)和数据库级别审计(每个数据库覆盖)之间的区别。对于“所有数据库都必须进行审计”的问题,服务器级别审计是正确的答案。
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 for SQL 是 DP-300 监视和优化领域中用于威胁检测的解决方案 — 它会扫描 SQL 注入尝试、异常登录位置、暴力破解探测和异常权限提升。高级威胁防护资源是按服务器启用的;安全警报策略配置了当检测到威胁时谁会收到电子邮件通知。
我们还连接了一个 Log Analytics 工作区,并将数据库诊断信息(SQL insights、查询存储指标、错误)传输到其中。有了最后这一部分,DP-300 强化的 SQL 基线就形成了:仅限 Entra 身份验证、服务器审计、威胁检测、Log Analytics 可观察性。DP-300 的每个“管理和配置”问题都围绕这些基本要素之一展开。
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 会销毁所有内容。注意事项:
terraform destroy 禁用它将停止每月约 15 美元/服务器的费用。DP-300 涵盖了本实验无法容纳的更多 Azure 上的 SQL 服务 — Azure SQL Managed Instance(独立的预配形式,按月计费)、Azure VM 上的 SQL Server (IaaS)、Azure Database for PostgreSQL 灵活服务器、Azure Database for MySQL 灵活服务器、MariaDB(已弃用)、弹性池、异地复制/故障转移组、使用客户管理密钥的透明数据加密、Always Encrypted(列级)、动态数据屏蔽、行级安全性以及整个查询存储性能调优界面。
我们坚持使用单个强化 Azure SQL Database,因为它是 DP-300 最常见的场景,也是所有其他变体(MI、异地复制、故障转移组)的基础。一旦您能够一次性预配一个具有仅限 Entra 身份验证 + 审计 + Defender + Log Analytics 功能的服务器 + 数据库,其他变体将遵循相同的形式,只是资源类型不同。
有关按服务划分的覆盖范围,请参阅此认证页面的 浏览、手册 和 Editorial 部分。