将 Azure Key Vault 机密分配给 Devops 发布管道的连接字符串

Posted

技术标签:

【中文标题】将 Azure Key Vault 机密分配给 Devops 发布管道的连接字符串【英文标题】:Assign Azure Key Vault Secret to Connection String for Devops Release Pipeline 【发布时间】:2020-03-02 16:31:34 【问题描述】:

在 appsettings.json 中创建连接字符串的常用方法是:

    
  "ConnectionStrings": 
    "DefaultConnection": "Server=(local); Database=MyProperty; Trusted_Connection=True;"
  

我想在 DevOps 发布管道中用我的 QA 数据库替换连接字符串值。

如果我在 Azure Devops 中声明一个发布管道变量,我可以使用名称 ConnectionStrings.DefaultConnection,为其设置一个值,它会将值作为发布的一部分注入 appsettings,如下所示:

但是,如果不是上述,我想使用 Azure Key Vault 并创建一个 Key Vault 机密,我只能将机密名称创建为 DefaultConnection,因为机密名称中不允许使用句点,因此连接字符串不会在发布期间被秘密值替换。 我假设如果我可以创建一个秘密作为 ConnectionStrings.DefaultConnection 它会起作用,但我们不允许添加特殊字符。

即使我添加了变量组,它也会采用不能接受特殊字符的秘密名称,如下所示:

请问有什么方法可以实现吗?

【问题讨论】:

您是否考虑过尽可能使用托管标识(例如,您的数据库是否托管在 Azure 中),而不是在应用程序设置中以纯文本形式放置机密? 是的,这是我根据我的问题尝试使用 Azure Key Vault 实现的目标,以便从保管库中检索值 这不是托管身份。有关使用 Azure SQL Server 的示例,请参阅 docs.microsoft.com/en-us/azure/app-service/…。许多服务支持分配一个比共享凭据更容易和更安全的身份管理(即使是秘密的)。 酷,感谢您的信息! 【参考方案1】:

密钥名称与应用设置/连接字符串之间没有直接关系。如果需要,您可以将您的秘密命名为“鳄梨”。您需要做的是仅在设置真正的应用程序设置/连接字符串时定义正确的名称。

这是一个示例:

更多信息:Azure DevOps Variable Group not applying in Azure Function Configuration

编辑:不,您的秘密不能以相同的模式命名(“:”或“_”来分隔单词)

【讨论】:

感谢您的回复。请看我的编辑。这表明,如果我按照建议在变量组中使用 Key Vault 机密,我不能拥有 ConnectionStrings.DefaultConnection 的机密名称,然后根据您的建议映射到 -ConnectionStrings:DefaultConnection $(ConnectionStrings.DefaultConnection) 不,您的秘密不能以相同的模式命名(“:”或“_”来分隔单词) @ThiagoCustodio 嗨,很抱歉打扰你,但我正处于时间紧缩状态,我正在尝试做类似的事情。我有一个密钥库秘密连接字符串,我希望它在构建时替换。但是,我正在使用 .net 核心构建,我没有看到 appSettings 的表单输入,任何帮助将不胜感激! @ThiagoCustodio Nvm 我不确定如何在尝试更新应用服务应用程序设置的 KeyVaultSecret 错误中正确格式化连接字符串。数据:"ConnectionStrings:test:":"Server=tcp:test-dev.database.windows.net,1433;Initial_Catalog=TestQA;Persist_Security_Info=False;User","":"ID=admin;Password=TestDev! @#;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection_Timeout=30;" 2020-07-10T20:43:58.3282901Z ##[error]Error: 无法更新应用服务'test-api-dev'应用程序设置。错误:BadRequest - 参数名称不能为空。 (代码:400)【参考方案2】:

我们想从 Azure 密钥保管库访问的任何机密说“connString”都可以使用约定 $(connString) 作为管道中的变量进行访问。

要从 Azure 管道中的 Azure 密钥保管库访问机密,有两种方法-

    在管道中 - 使用任务“Azure key Vault”来获取特定的秘密或逗号分隔的秘密列表,或者您也可以使用“秘密过滤器”中的通配符来获取所有秘密。然后使用上述约定,即 $(),在下游任务中使用获取的秘密

    创建基于密钥保管库的变量组 - 变量组可以链接到 Azure 密钥保管库,您可以选择要在管道中读取的特定机密。您可以将一个变量组与多个管道链接。

在任何一种情况下,您都需要对 Azure 密钥库拥有足够的权限,您可以在 Azure 门户的“访问策略”边栏选项卡中定义该权限

【讨论】:

以上是关于将 Azure Key Vault 机密分配给 Devops 发布管道的连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 Azure Key Vault 轮换机密

Angular - Azure Key Vault 管理 Vault 访问机密

将 appsettings.json 文件中的机密存储在 Azure Key Vault 上的 .Net 控制台应用程序中

Azure Key Vault 从 VMSS 实例获取机密

使用 Azure Key Vault 进行 Terraform 以获取机密值

从带有前缀的 Azure Key Vault 获取所有机密