首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ARM/Bicep在Azure SQL server中配置加密保护

使用ARM/Bicep在Azure SQL server中配置加密保护
EN

Stack Overflow用户
提问于 2022-10-27 13:11:32
回答 1查看 54关注 0票数 0

我正在尝试构建ARM和Bicep模板,以便在Azure SQL server (和数据库)上启用BYOK/CMK/TDE。

我面临的挑战是模板期望将KeyVault Key 版本作为输入传递进来。我真的很想避免这种情况,因为版本最终可能会改变,而且它不是我想要作为输入参数来维护的值。

到目前为止,我尝试的是为SQL创建这2种资源:

代码语言:javascript
复制
Microsoft.Sql/servers/keys@2022-05-01-preview
Microsoft.Sql/servers/encryptionProtector@2022-05-01-preview

encryptionProtector看起来非常简单,它只使用服务器/密钥资源。这就是我被困的地方。

它需要KV键版本的“名称”字段,我希望它能够从Microsoft.KeyVault/vaults/ key现有资源中获得。但是,它只有以下属性:

代码语言:javascript
复制
keyVaultKey.properties.keyUriWithVersion

我的下一个选择是解析该值,例如:

代码语言:javascript
复制
var sqlServerKeyName = '${keyVaultName}_${keyVaultKeyName}_${last(split(keyVaultKey.properties.keyUriWithVersion, '/'))}'

但这导致了警告:

在分配"Microsoft.Sql/servers/keys“类型的"name”属性时使用他的表达式,该类型需要在部署开始时计算的值。您所引用的变量在开始时无法计算("keyVaultKeyName“-> "keyVaultKey")。可以在开头计算的keyVaultKey属性包括"apiVersion“、"id”、"name“、"type”

所以我的问题是:可以从Bicep/ARM模板获取KV密钥版本吗?如果是--如何获得?还是通常不建议这样做(特别是在透明数据加密的情况下)?

最后,如果没有基于ARM/Bicep的解决方案,我认为下一个最佳解决方案可能是尝试通过powershell检索最新版本,然后将其作为输入传递。关于这种方法有什么建议/例子吗?

注意:、KeyVault和Keys是在单独的部署中创建的,因此我不能为此使用KV部署输出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-27 18:06:56

错误只是资源的名称:必须在部署启动时计算值,这在您的情况下是不可能的,因为名称是从另一个资源生成的。

您需要通过另一个模块调用它:

代码语言:javascript
复制
// sqlserver-keyvault-encryption.bicep
param sqlServerName string
param keyVaultName string
param keyName string
param keyVersion string
param keyUri string

resource sqlServer 'Microsoft.Sql/servers@2022-05-01-preview' existing = {
  name: sqlServerName
}

// Create sql server key from key vault
resource sqlServerKey 'Microsoft.Sql/servers/keys@2022-05-01-preview' = {
  name: '${keyVaultName}_${keyName}_${keyVersion}'
  parent: sqlServer
  properties: {
    serverKeyType: 'AzureKeyVault'
    uri: keyUri
  }
}

// Create the encryption protector
resource propector 'Microsoft.Sql/servers/encryptionProtector@2022-05-01-preview' = {
  name: 'current'
  parent: sqlServer
  properties: {
    serverKeyType: 'AzureKeyVault'
    serverKeyName: sqlServerKey.name
  }
}

然后可以从父模块调用它:

代码语言:javascript
复制
param sqlServerName string
param keyVaultName string
param keyName string

resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' existing = {
  name: keyVaultName
}

resource keyVaultKey 'Microsoft.KeyVault/vaults/keys@2022-07-01' existing = {
  name: keyName
  parent: keyVault
}

module encryption 'sqlserver-keyvault-encryption.bicep' = {
  name: 'sqlserver-keyvault-encryption'
  params: {
    sqlServerName: sqlServerName
    keyVaultName: keyVault.name
    keyName: keyVaultKey.name
    keyVersion: last(split(keyVaultKey.properties.keyUriWithVersion, '/'))
    keyUri: keyVaultKey.properties.keyUriWithVersion
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74222622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档