Back to Checks
SQL Server has Microsoft Defender for SQL enabled
sqlserver_microsoft_defender_enabled
Service: sqlserverSeverity: high
OfficialBuilt-inVerified
Categories:loggingforensics-ready
Resource Type:microsoft.sql/servers
Azure SQL Server instances are evaluated for the server-level security alert policy of Microsoft Defender for SQL, expecting the policy state to be Enabled.
Risk
Without Defender for SQL, anomalous logins, SQL injection patterns, and risky configurations may go undetected, enabling data exfiltration (confidentiality), unauthorized changes (integrity), and disruptive queries or ransomware (availability).
Run this check with Prowler
Run in Prowler CloudRun
prowler azure --checks sqlserver_microsoft_defender_enabledRecommendation
Enable Microsoft Defender for SQL across all servers and managed instances, preferably at subscription scope. Apply least privilege, restrict public exposure, and integrate alerts with your SOC. Regularly review vulnerability assessment results and harden findings as part of defense in depth.
Remediation
CLI
az rest --method PUT --url "https://management.azure.com/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/providers/Microsoft.Sql/servers/<SERVER_NAME>/securityAlertPolicies/Default?api-version=2023-08-01-preview" --body '{"properties":{"state":"Enabled"}}'Terraform
resource "azurerm_mssql_server_security_alert_policy" "<example_resource_name>" {
server_id = "<example_resource_id>"
state = "Enabled" # Critical: enables the server's security alert policy (Defender for SQL)
}NativeIaC
param serverName string = '<example_resource_name>'
resource securityAlert 'Microsoft.Sql/servers/securityAlertPolicies@2021-11-01' = {
name: '${serverName}/Default'
properties: {
state: 'Enabled' // Critical: enables the server's security alert policy (Defender for SQL)
}
}Other
1Sign in to the Azure portal > SQL servers > select <SERVER_NAME>
2Under Security, select Microsoft Defender for SQL (or Microsoft Defender for Cloud)
3Toggle to On (Enable) and click Save
Check Code
from prowler.lib.check.models import Check, Check_Report_Azure
from prowler.providers.azure.services.sqlserver.sqlserver_client import sqlserver_client
class sqlserver_microsoft_defender_enabled(Check):
def execute(self) -> Check_Report_Azure:
findings = []
for subscription, sql_servers in sqlserver_client.sql_servers.items():
subscription_name = sqlserver_client.subscriptions.get(
subscription, subscription
)
for sql_server in sql_servers:
if sql_server.security_alert_policies:
report = Check_Report_Azure(
metadata=self.metadata(), resource=sql_server
)
report.subscription = subscription
report.status = "FAIL"
report.status_extended = f"SQL Server {sql_server.name} from subscription {subscription_name} ({subscription}) has microsoft defender disabled."
if sql_server.security_alert_policies.state == "Enabled":
report.status = "PASS"
report.status_extended = f"SQL Server {sql_server.name} from subscription {subscription_name} ({subscription}) has microsoft defender enabled."
findings.append(report)
return findingsReferences
- https://www.azadvertizer.net/azpolicyadvertizer/7fe3b40f-802b-4cdd-8bd4-fd799c948cc2.html
- https://learn.microsoft.com/en-us/azure/azure-sql/database/azure-defender-for-sql?view=azuresql
- https://learn.microsoft.com/en-us/azure/defender-for-cloud/defender-for-sql-usage
- https://www.trendmicro.com/cloudoneconformity-staging/knowledge-base/azure/SecurityCenter/defender-azure-sql.html
- https://learn.microsoft.com/en-us/azure/defender-for-cloud/policy-reference