能否在服务器级配置SQL Azure Vulnerability Assessment?或提供批量脚本?
关于SQL Azure漏洞评估扫描的批量配置方案
我完全懂你面对100个数据库逐个配置时的崩溃——重复操作不仅费时间,还容易因为手滑出错。先直接给你明确的结论:目前SQL Azure还不支持在服务器级别统一配置漏洞评估(Vulnerability Assessment)的定期扫描、存储账户和报告接收人,所有相关配置都是数据库级别的。不过别担心,我们可以用批量脚本解决这个问题,下面是优先推荐的SQL脚本方案,以及补充的PowerShell选项:
批量配置的SQL脚本(优先推荐)
这个脚本需要在SQL服务器的master数据库中运行,它会自动遍历所有在线的用户数据库,批量完成漏洞评估的存储配置、报告接收人设置和定期扫描计划。
-- 切换到master数据库执行 USE master; GO -- 👇根据你的实际需求修改以下参数 DECLARE @StorageSasUri NVARCHAR(1000) = '你的存储账户SAS URI'; -- 需具备写入权限的SAS地址 DECLARE @ScanFrequency NVARCHAR(50) = 'Weekly'; -- 可选值:Daily / Weekly DECLARE @EmailRecipients NVARCHAR(1000) = 'user1@example.com;user2@example.com'; -- 多邮箱用分号分隔 DECLARE @ScanDayOfWeek NVARCHAR(20) = 'Sunday'; -- 仅Weekly模式需要,可选:Monday~Sunday DECLARE @ScanTime NVARCHAR(5) = '02:00'; -- 扫描执行时间,格式HH:MM DECLARE @RunScanImmediately BIT = 1; -- 1=配置后立即扫一次,0=不立即执行 -- 遍历所有在线用户数据库(排除系统库) DECLARE @DbName NVARCHAR(128); DECLARE db_cursor CURSOR FOR SELECT name FROM sys.databases WHERE database_id > 4 AND state_desc = 'ONLINE'; OPEN db_cursor; FETCH NEXT FROM db_cursor INTO @DbName; WHILE @@FETCH_STATUS = 0 BEGIN -- 动态生成当前数据库的配置SQL DECLARE @ConfigSql NVARCHAR(MAX); SET @ConfigSql = N'USE ' + QUOTENAME(@DbName) + N'; -- 配置存储账户访问(如果存储是公网可访问,0.0.0.0允许所有IP;私有存储需调整IP范围) EXEC sp_set_database_firewall_rule @name = N''VA_Storage_Access'', @start_ip_address = ''0.0.0.0'', @end_ip_address = ''0.0.0.0''; -- 设置漏洞评估的存储和接收人 EXEC sp_set_vulnerability_assessment_settings @storage_account_sas_key = ''' + @StorageSasUri + N''', @recipient_emails = ''' + @EmailRecipients + N'''; -- 配置定期扫描计划'; -- 根据扫描频率添加不同的参数 IF @ScanFrequency = 'Weekly' BEGIN SET @ConfigSql = @ConfigSql + N' EXEC sp_add_vulnerability_assessment_scan_schedule @scan_frequency = ''' + @ScanFrequency + N''', @day_of_week = ''' + @ScanDayOfWeek + N''', @time_of_day = ''' + @ScanTime + N''';'; END ELSE BEGIN SET @ConfigSql = @ConfigSql + N' EXEC sp_add_vulnerability_assessment_scan_schedule @scan_frequency = ''' + @ScanFrequency + N''', @time_of_day = ''' + @ScanTime + N''';'; END -- 若需要立即执行扫描,追加扫描命令 IF @RunScanImmediately = 1 BEGIN SET @ConfigSql = @ConfigSql + N' EXEC sp_run_vulnerability_assessment_scan;'; END -- 执行当前数据库的配置SQL EXEC sp_executesql @ConfigSql; PRINT '✅ 已完成数据库 [' + @DbName + '] 的漏洞评估配置'; FETCH NEXT FROM db_cursor INTO @DbName; END CLOSE db_cursor; DEALLOCATE db_cursor; GO
脚本注意事项
- 运行账户需要服务器级CONTROL SERVER权限,或每个用户数据库的
ALTER ANY SECURITY POLICY和CONTROL权限。 - 存储账户的SAS URI必须具备
Write权限,若使用私有存储,需提前配置SQL服务器与存储账户的网络连通(如VNet集成、专用端点)。 - 防火墙规则部分:如果你的存储账户限制了IP访问,需要把
0.0.0.0替换为存储账户的实际IP范围。
补充:PowerShell批量配置方案
如果需要更灵活的自动化(比如结合Azure DevOps定时运行),可以用Az.Sql模块实现:
# 安装Az.Sql模块(首次运行需执行) # Install-Module -Name Az.Sql -Force -AllowClobber # 登录Azure账户 Connect-AzAccount # 👇修改为你的资源信息 $resourceGroupName = "你的资源组名称" $serverName = "你的SQL服务器名称" $storageSasUri = "你的存储账户SAS URI" $scanFrequency = "Weekly" # Daily/Weekly $emailRecipients = "user1@example.com;user2@example.com" $scanDay = "Sunday" $scanTime = "02:00" # 获取所有在线用户数据库 $databases = Get-AzSqlDatabase -ResourceGroupName $resourceGroupName -ServerName $serverName | Where-Object { $_.DatabaseName -notin @("master", "model", "msdb", "tempdb") -and $_.Status -eq "Online" } foreach ($db in $databases) { # 配置漏洞评估基础设置 Set-AzSqlDatabaseVulnerabilityAssessmentSetting -ResourceGroupName $resourceGroupName ` -ServerName $serverName ` -DatabaseName $db.DatabaseName ` -StorageAccountSasUri $storageSasUri ` -RecipientEmail $emailRecipients.Split(';') # 配置定期扫描计划 Add-AzSqlDatabaseVulnerabilityAssessmentScanSchedule -ResourceGroupName $resourceGroupName ` -ServerName $serverName ` -DatabaseName $db.DatabaseName ` -ScanFrequency $scanFrequency ` -DayOfWeek $scanDay ` -Time $scanTime Write-Host "✅ 已完成数据库 $($db.DatabaseName) 的配置" }
最后想说的
虽然目前没有服务器级的统一配置入口,但用上述批量脚本可以把原本几小时的手动操作压缩到几分钟完成,还能避免人为错误。如果后续Azure更新了服务器级配置功能,官方会在更新日志里同步,你可以多关注一下。
内容的提问来源于stack exchange,提问作者JKennedy
相关产品推荐
相关产品推荐

