Azure环境下通过Terraform实现SQL服务器及指定数据库的审计配置咨询
实现Azure SQL数据库级审计配置
嗨Jason!你已经把服务器级审计配置得很扎实了,要给服务器上的两个数据库加上数据库级审计,其实和你配置master库的逻辑是相通的,咱们只需要针对每个目标数据库单独配置诊断日志设置和数据库级扩展审计策略就行,具体步骤如下:
1. 为单个数据库配置诊断日志(收集审计事件)
和服务器级审计指向/master数据库不同,数据库级审计需要将诊断设置绑定到具体的数据库资源ID上。假设你已经定义了两个SQL数据库的Terraform资源,比如:
resource "azurerm_mssql_database" "db1" { name = "MyFirstDB" server_id = azurerm_mssql_server.main.id sku_name = "GP_Gen5_2" # 其他数据库配置... } resource "azurerm_mssql_database" "db2" { name = "MySecondDB" server_id = azurerm_mssql_server.main.id sku_name = "GP_Gen5_2" # 其他数据库配置... }
接下来,为每个数据库创建独立的诊断设置,开启SQLSecurityAuditEvents日志收集:
# 第一个数据库的诊断设置 resource "azurerm_monitor_diagnostic_setting" "db1_audit" { name = "Diagnostic Settings - DB1 Audit" target_resource_id = azurerm_mssql_database.db1.id log_analytics_workspace_id = azurerm_log_analytics_workspace.main.id log { category = "SQLSecurityAuditEvents" enabled = true retention_policy { enabled = false } } # 如果你不需要收集数据库指标,可以去掉这个metric块 metric { category = "AllMetrics" retention_policy { enabled = false } } lifecycle { ignore_changes = [log, metric] } } # 第二个数据库的诊断设置 resource "azurerm_monitor_diagnostic_setting" "db2_audit" { name = "Diagnostic Settings - DB2 Audit" target_resource_id = azurerm_mssql_database.db2.id log_analytics_workspace_id = azurerm_log_analytics_workspace.main.id log { category = "SQLSecurityAuditEvents" enabled = true retention_policy { enabled = false } } metric { category = "AllMetrics" retention_policy { enabled = false } } lifecycle { ignore_changes = [log, metric] } }
2. 配置数据库级扩展审计策略
除了诊断日志,还需要为每个数据库启用数据库级扩展审计策略,对应Terraform的azurerm_mssql_database_extended_auditing_policy资源(注意是数据库级,不是服务器级的那个):
# 第一个数据库的扩展审计策略 resource "azurerm_mssql_database_extended_auditing_policy" "db1" { database_id = azurerm_mssql_database.db1.id log_monitoring_enabled = true # 如果你需要将审计日志同时存储到存储账户,可以添加storage_account_id参数 # storage_account_id = azurerm_storage_account.audit.id } # 第二个数据库的扩展审计策略 resource "azurerm_mssql_database_extended_auditing_policy" "db2" { database_id = azurerm_mssql_database.db2.id log_monitoring_enabled = true }
优化:用循环简化批量配置
如果你的数据库数量较多,或者未来可能新增数据库,推荐用for_each来批量创建资源,避免重复代码。比如先定义数据库名称列表:
locals { sql_databases = ["MyFirstDB", "MySecondDB"] } # 批量创建数据库 resource "azurerm_mssql_database" "all" { for_each = toset(local.sql_databases) name = each.value server_id = azurerm_mssql_server.main.id sku_name = "GP_Gen5_2" # 其他数据库配置... } # 批量创建数据库诊断设置 resource "azurerm_monitor_diagnostic_setting" "db_audits" { for_each = azurerm_mssql_database.all name = "Diagnostic Settings - ${each.key} Audit" target_resource_id = each.value.id log_analytics_workspace_id = azurerm_log_analytics_workspace.main.id log { category = "SQLSecurityAuditEvents" enabled = true retention_policy { enabled = false } } metric { category = "AllMetrics" retention_policy { enabled = false } } lifecycle { ignore_changes = [log, metric] } } # 批量创建数据库扩展审计策略 resource "azurerm_mssql_database_extended_auditing_policy" "all" { for_each = azurerm_mssql_database.all database_id = each.value.id log_monitoring_enabled = true }
这样配置完成后,你的SQL服务器级审计(已配置)和两个数据库的数据库级审计都会同时生效,所有审计事件都会被收集到指定的Log Analytics工作区里,满足你“同时查看服务器与数据库均已开启审计”的需求。
内容的提问来源于stack exchange,提问作者Jason_Hough
相关产品推荐
相关产品推荐

