在管道中使用 Azure Key Vault 机密

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

使用 Azure Key Vault,可以安全地存储和管理敏感信息,例如密码、API 密钥、证书等。 使用 Azure Key Vault,可以轻松创建和管理加密密钥来加密数据。 Azure Key Vault 还可用于管理所有资源的证书。 本文将指导如何进行以下操作:

  • 创建 Azure 密钥保管库。
  • 配置密钥保管库权限。
  • 创建新的服务连接。
  • 从 Azure Pipeline 查询机密。

先决条件

创建 Azure Key Vault

注意

不支持使用 Azure 基于角色的访问控制l (Azure RBAC) 的 Azure 密钥保管库。

  1. 导航到 Azure 门户

  2. 选择左侧导航窗格中的“创建资源”。

    显示了如何在 Azure 门户中创建新资源的屏幕截图。

  3. 搜索密钥保管库,然后按 Enter。

    显示了如何在 Azure 门户中搜索 Azure 密钥保管库的屏幕截图。

  4. 选择“创建”以创建新的 Azure Key Vault。

    显示了如何在 Azure 门户中创建新 Azure 密钥保管库的屏幕截图。

  5. 选择你的“订阅”,然后添加新的“资源组”。 输入一个“密钥保管库名称”,然后选择一个“区域”和一个“定价层”。 完成后,选择“审阅 + 创建”。

    显示了在 Azure 门户中创建新密钥保管库步骤的屏幕截图。

  6. 完成新资源的部署后,选择“转到资源”。

    显示了如何在 Azure 门户中导航到资源的屏幕截图。

创建服务主体

在此步骤中,我们将在 Azure 中创建一个新的服务主体,使我们能够从 Azure Pipelines 查询 Azure 密钥保管库。

  1. 导航到 Azure 门户

  2. 从菜单栏中选择 >_ 图标以打开 Cloud Shell

  3. 根据偏好选择 PowerShell 或将其保留为 Bash

  4. 运行以下命令以创建新服务主体:

    az ad sp create-for-rbac --name YOUR_SERVICE_PRINCIPAL_NAME
    
  5. 输出应与以下示例匹配。 请务必复制命令的输出,因为你将需要它在接下来的步骤中创建服务连接。

    {
      "appId": "p951q3e2-8e5r-z697-e9q52aviu8a2",
      "displayName": "MyServicePrincipal",
      "password": "***********************************",
      "tenant": "85wes2u6-63sh-95zx-2as3-qw58wex269df"
    }
    

配置 Key Vault 访问权限

  1. 导航到 Azure 门户

  2. 选择在上一步创建的密钥保管库。

  3. 选择“访问策略”。

    显示了如何在 Azure 门户中导航到密钥保管库访问策略的屏幕截图。

  4. 选择“添加访问策略”以添加新策略。

  5. 将“获取”和“列出”添加到“机密权限”。

    显示了如何在 Azure 门户中为密钥保管库添加获取和列表权限的屏幕截图。

  6. 在“选择主体”下,选择添加服务主体,然后选择之前创建的主体。

  7. 完成时选择“保存”。

创建新的服务连接

  1. 登录到 Azure DevOps 组织,并导航到你的项目。

  2. 选择“项目设置”齿轮图标,然后选择“服务连接”

  3. 如果要在项目中首次设置服务连接,请选择“创建服务连接”。 如果之前已建立服务连接,请选择“新建服务连接”。

  4. 选择“Azure 资源管理器”,然后选择“下一步”。

  5. 选择“服务主体(手动)”,然后选择“下一步”。

  6. 选择范围级别订阅,并使用之前创建的服务主体的信息填写必填字段。 完成操作后,选择验证

    • 服务主体 ID:服务主体的 appId
    • 服务主体密钥:服务主体的密码
    • 租户 ID:服务主体的租户
  7. 提供服务连接的名称,确保选中“授予对所有管道的访问权限”复选框。

  8. 完成操作后,选择验证并保存

    显示了如何创建新的手动服务主服务连接的屏幕截图。

在管道中查询和使用机密

使用 Azure Key Vault 任务,我们可以提取机密的值,并将其用于管道中的后续任务。 需要记住的一点是,机密必须显式映射到 env 变量,如下例所示。

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: AzureKeyVault@1
  inputs:
    azureSubscription: 'repo-kv-demo'                    ## YOUR_SERVICE_CONNECTION_NAME
    KeyVaultName: 'kv-demo-repo'                         ## YOUR_KEY_VAULT_NAME
    SecretsFilter: 'secretDemo'                          ## YOUR_SECRET_NAME. Default value: *
    RunAsPreJob: false                                   ## Make the secret(s) available to the whole job

- task: DotNetCoreCLI@2
  inputs:
    command: 'build'
    projects: '**/*.csproj'

- task: DotNetCoreCLI@2
  inputs:
    command: 'run'
    projects: '**/*.csproj'
  env:
    mySecret: $(secretDemo)

- bash: |
    echo "Secret Found! $MY_MAPPED_ENV_VAR"        
  env:
    MY_MAPPED_ENV_VAR: $(mySecret)

上一个 bash 命令的输出应如下所示:

Secret Found! ***

注意

如果要从 Azure Key Vault 查询多个机密,请使用 SecretsFilter 参数传递以逗号分隔的机密名称的列表:'secret1, secret2'