解决Azure策略要求SQL Server使用客户托管密钥加密的Bicep脚本报错
解决Azure SQL Server Bicep部署的客户托管密钥加密合规问题
问题根源分析
- 首次部署失败:Azure策略要求SQL Server创建完成时必须已配置客户托管密钥加密,你先创建SQL Server再单独添加
encryptionProtector资源的方式,会导致策略在SQL Server初始化完成时就触发检查,此时加密配置尚未生效,因此触发违规报错。 - 添加
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
相关产品推荐
相关产品推荐

