You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在服务器级配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:02:59