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

解决Azure策略要求SQL Server使用客户托管密钥加密的Bicep脚本报错

解决Azure SQL Server Bicep部署的客户托管密钥加密合规问题

问题根源分析

  1. 首次部署失败:Azure策略要求SQL Server创建完成时必须已配置客户托管密钥加密,你先创建SQL Server再单独添加encryptionProtector资源的方式,会导致策略在SQL Server初始化完成时就触发检查,此时加密配置尚未生效,因此触发违规报错。
  2. 添加keyId后报错:直接在SQL Server资源中指定keyId时,SQL Server没有访问目标Key Vault的权限,无法验证密钥有效性,导致部署失败。

正确的Bicep配置方案

1. 先配置Key Vault访问权限

SQL Server需要对目标Key Vault拥有get、wrapKey、unwrapKey权限,才能正常使用客户托管密钥。通过Bicep添加访问策略:

// 引用已存在的Key Vault
resource keyVault 'Microsoft.KeyVault/vaults@2023-02-01' existing = {
  name: 'kvinfratestva'
}

// 为SQL Server配置Key Vault访问策略
resource sqlServerKeyVaultAccessPolicy 'Microsoft.KeyVault/vaults/accessPolicies@2023-02-01' = {
  name: 'add'
  parent: keyVault
  properties: {
    accessPolicies: [
      {
        tenantId: subscription().tenantId
        objectId: sqlServer.identity.principalId // 依赖SQL Server的系统分配身份
        permissions: {
          keys: ['get', 'wrapKey', 'unwrapKey']
        }
      }
    ]
  }
}

2. 完整合规的SQL Server部署脚本

需要确保加密保护配置与SQL Server创建的依赖关系正确,同时启用系统分配身份提升安全性:

param location string
param sqlServerName string
param adminUsername string
param adminPassword string
param publicNetworkAccess string = 'Enabled'
param keyVaultName string = 'kvinfratestva'
param keyName string = 'key-pcr-sqlserver'
param keyVersion string = '654aa7c96d51450cassaassa15fce3ff26'

// 引用目标Key Vault
resource keyVault 'Microsoft.KeyVault/vaults@2023-02-01' existing = {
  name: keyVaultName
}

// 创建带系统分配身份的SQL Server
resource sqlServer 'Microsoft.Sql/servers@2021-11-01' = {
  location: location
  name: sqlServerName
  identity: {
    type: 'SystemAssigned'
  }
  properties: {
    administratorLogin: adminUsername
    administratorLoginPassword: adminPassword
    publicNetworkAccess: publicNetworkAccess
  }
}

// 配置Key Vault访问策略(确保权限先于加密配置生效)
resource sqlServerKeyVaultAccessPolicy 'Microsoft.KeyVault/vaults/accessPolicies@2023-02-01' = {
  name: 'add'
  parent: keyVault
  properties: {
    accessPolicies: [
      {
        tenantId: subscription().tenantId
        objectId: sqlServer.identity.principalId
        permissions: {
          keys: ['get', 'wrapKey', 'unwrapKey']
        }
      }
    ]
  }
}

// 配置客户托管密钥加密保护
resource encryptProtectSQLServer 'Microsoft.Sql/servers/encryptionProtector@2021-11-01' =  {
  name: 'current'
  parent: sqlServer
  dependsOn: [sqlServerKeyVaultAccessPolicy]
  properties: {
    autoRotationEnabled: true
    serverKeyName: '${keyVaultName}/${keyName}/${keyVersion}'
    serverKeyType: 'AzureKeyVault'
  }
}

核心注意事项

  • 系统分配身份:启用SQL Server的系统分配身份是推荐方案,避免手动提取对象ID的繁琐,也提升权限管理的安全性。
  • 依赖顺序:通过dependsOn确保Key Vault访问策略先于加密保护资源部署,保证SQL Server拥有权限后再配置加密。
  • 策略检查逻辑:Azure策略会在SQL Server资源创建完成后立即验证加密状态,因此必须保证加密配置与SQL Server的部署流程紧密绑定,不能拆分执行。

额外排查点

如果仍存在部署问题,检查以下内容:

  • Key Vault是否启用了网络限制,若有需允许SQL Server所在虚拟网络或IP访问。
  • 目标密钥是否存在、未禁用,且版本号正确。
  • 部署账户是否同时拥有SQL Server创建权限和Key Vault访问策略管理权限。

内容的提问来源于stack exchange,提问作者Chaka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 00:50:07