保护参数

已完成

有时,你需要将敏感值传递到部署,例如密码和 API 密钥。 但需要确保这些值是受保护的。 在某些情况下,你不希望创建部署的人员知道机密值。 其他情况下,用户会在创建部署时输入参数值,但你需要确保这些机密值不会被记录。 本单元将介绍一些保护参数的方法。

提示

最好的方法是避免完全使用凭据。 Azure 资源的托管标识可以使解决方案的组件无需任何凭据即可安全地相互通信。 托管标识不适用于每个资源,但最好尽可能地使用它们。 如果无法使用,则可以使用此处所述的方法。

注意

本单元中显示的命令用于说明概念。 请暂时不要运行这些命令。 稍后你将练习在此处学到的知识。

定义安全参数

@secure 修饰器可应用于可能包含机密值的字符串和对象参数。 当你将参数定义为 @secure 时,Azure 不会使参数值在部署日志中可用。 此外,如果使用 Azure CLI 或 Azure PowerShell 以交互方式创建部署,并且需要在部署期间输入值,则终端不会在屏幕上显示文本。

作为 HR 应用程序迁移的一部分,你需要部署 Azure SQL 逻辑服务器和数据库。 你将使用管理员登录名和密码预配逻辑服务器。 由于它们是敏感信息,因此需要保护这些值。 下面是为 SQL Server 的管理员详细信息创建两个字符串参数的示例声明:

@secure()
param sqlServerAdministratorLogin string

@secure()
param sqlServerAdministratorPassword string

请注意,两个参数都未指定默认值。 建议避免为用户名、密码和其他机密指定默认值。 否则,如果有用户部署模板,而未意识到应重写值,则他们将降低其安全性,因为他们将获得默认值,而不是自己选择的内容。

提示

请确保不要为敏感数据创建输出。 任何有权访问部署历史记录的人员都可以访问输出值。 它们不适合处理机密。

避免对机密使用参数文件

正如你在上一单元中了解到的,参数文件是指定一组参数值的一种非常好的方法。 你通常会为要部署到的每个环境创建参数文件。 一般情况下,应避免使用参数文件来指定机密值。 参数文件通常保存到集中式版本控制系统,如 Git。 很多用户将来可能会访问它。 不要将敏感数据保存到版本控制系统,因为它们不是用于存储此类信息。

与 Azure Key Vault 集成

Azure Key Vault 是一项服务,旨在存储和提供对机密的访问。 可以通过将参数文件与对 Key Vault 机密的引用,将 Bicep 模板与 Key Vault 集成。

可以通过引用参数文件中的密钥保管库和机密来使用此功能。 该值永远不会公开,因为你只引用其标识符,这本身并不是什么机密。 部署模板时,Azure 资源管理器将联系密钥保管库并检索数据。

提示

可以引用位于不同于部署的资源组或订阅中的密钥保管库中的机密。

此关系图显示一个参数文件,它引用 Azure Key Vault,并将机密传递给 Bicep 模板以部署 Azure 资源。

下面是一个参数文件,它使用 Key Vault 引用来查询要使用的 SQL 逻辑服务器管理员登录名和密码:

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "sqlServerAdministratorLogin": {
      "reference": {
        "keyVault": {
          "id": "/subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets"
        },
        "secretName": "sqlAdminLogin"
      }
    },
    "sqlServerAdministratorPassword": {
      "reference": {
        "keyVault": {
          "id": "/subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets"
        },
        "secretName": "sqlAdminLoginPassword"
      }
    }
  }
}

请注意,此文件具有一个 reference 对象,该对象包含密钥保管库和机密的详细信息,而不是为每个参数指定 value

重要

必须将密钥保管库配置为允许资源管理器在模板部署期间访问密钥保管库中的数据。 此外,部署模板的用户必须具有访问密钥保管库的权限。 下个单元将介绍如何执行这些任务。

在模块内使用密钥保管库

使用模块可以创建可重用的 Bicep 文件,以封装一组资源。 通常使用模块来部署解决方案的各个部分。 模块可能包含接受机密值的参数,你可以使用 Bicep 的 Key Vault 集成安全地提供这些值。 下面是一个 Bicep 文件示例,它部署了一个模块,并提供 ApiKey 机密参数的值,方法是直接从 Key Vault 获取:

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

module applicationModule 'application.bicep' = {
  name: 'application-module'
  params: {
    apiKey: keyVault.getSecret('ApiKey')
  }
}

请注意,在此 Bicep 文件中,通过使用 existing 关键字引用 Key Vault 资源。 此关键字会告知 Bicep Key Vault 已存在,并且此代码是对该保管库的引用。 Bicep 不会重新部署它。 另请注意,模块的代码在模块的 apiKey 参数的值中使用 getSecret() 函数。 这是一个特殊的 Bicep 函数,只能与安全模块参数一起使用。 在内部,Bicep 将此表达式翻译为你之前了解到的相同类型的 Key Vault 引用。