在 Azure Pipelines 中使用 Azure 密钥保管库机密

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

使用 Azure Key Vault,开发人员可以安全地存储和管理敏感信息,例如 API 密钥、凭据或证书。 Azure Key Vault 服务支持两种类型的容器:保管库和托管 HSM(硬件安全模块)池。 保管库可以存储软件和 HSM 支持的密钥、机密和证书;而托管 HSM 池仅支持 HSM 支持的密钥。

在本教程中,您将学习如何执行以下操作:

  • 使用 Azure CLI 创建 Azure 密钥保管库
  • 添加机密并配置对 Azure 密钥保管库的访问权限
  • 在管道中使用机密

先决条件

  • Azure DevOps 组织和项目。 创建 组织项目 (如果尚未创建)。

  • Azure 订阅。 如果你没有 Azure 帐户,请免费创建一个

获取示例代码

如果已有自己的存储库,请转到下一步。 否则,请将以下示例存储库导入 Azure 存储库。

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

  2. 选择 Repos,然后选择“ 导入”。 输入以下存储库 URL,然后选择“ 导入”。

    https://github.com/MicrosoftDocs/pipelines-dotnet-core
    

创建 Azure Key Vault

  1. 登录到 Azure 门户,然后选择右上角的“Cloud Shell”按钮。

  2. 如果你的帐户关联了多个 Azure 订阅,请使用以下命令指定默认订阅。 可以使用 az account list 生成订阅列表。

    az account set --subscription <YOUR_SUBSCRIPTION_NAME_OR_ID>
    
  3. 设置默认的 Azure 区域。 可以使用 az account list-locations 生成可用区域的列表。

    az config set defaults.location=<YOUR_REGION>
    
  4. 创建新的资源组。

    az group create --name <YOUR_RESOURCE_GROUP_NAME>
    
  5. 创建新的 Azure Key Vault。

    az keyvault create \
      --name <YOUR_KEY_VAULT_NAME> \
      --resource-group <YOUR_RESOURCE_GROUP_NAME>
    
  6. 在 Azure 密钥保管库中创建新机密。

    az keyvault secret set \
      --name <YOUR_SECRET_NAME> \
      --value <YOUR_ACTUAL_SECRET> \
      --vault-name <YOUR_KEY_VAULT_NAME>
    

设置身份验证

创建用户分配的托管标识

  1. 登录到Azure 门户,然后在搜索栏中搜索托管标识服务。

  2. 选择“创建”,并填写必填字段,如下所示:

    • 订阅:从下拉菜单中选择订阅。
    • 资源组:选择现有资源组或创建新资源组。
    • 区域:从下拉菜单中选择一个区域。
    • 名称:输入用户分配的托管标识的名称。
  3. 完成后,选择“审阅 + 创建”。

  4. 部署完成后,选择“ 转到资源”,然后复制 订阅客户端 ID 值,以在后续步骤中使用。

  5. 导航到“设置属性>,并复制托管标识的租户 ID 值供以后使用。

设置密钥保管库访问策略

  1. 导航到Azure 门户,并使用搜索栏查找之前创建的密钥保管库。

  2. 选择“访问策略”,然后选择“创建以添加新策略。

  3. 在“机密权限”下,选中“获取”和列出”复选框。

  4. 选择“下一步,然后将前面创建的托管标识的客户端 ID 粘贴到搜索栏中。 选择托管标识。

  5. 依次选择“ 下一步”、“ 下一 步”。

  6. 查看新策略,然后选择“ 完成时创建 ”。

创建服务连接

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

  2. 选择项目设置>服务连接,然后选择新建服务连接以创建新的服务连接。

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

  4. 对于 “标识类型”,请从下拉菜单中选择 “托管标识 ”。

  5. 对于 步骤 1:托管标识详细信息,请填写字段,如下所示:

    • 托管标识的订阅:选择包含托管标识的订阅。

    • 托管标识的资源组:选择托管标识的资源组。

    • 托管标识:从下拉菜单中选择托管标识。

  6. 对于 步骤 2:Azure 作用域,请填写字段,如下所示:

    • 服务连接的范围级别:选择订阅。

    • 服务连接的订阅:选择托管标识将访问的订阅。

    • 服务连接的资源组:(可选)指定以限制对一个资源组的托管标识访问。

  7. 对于 步骤 3:服务连接详细信息

    • 服务连接名称:提供服务连接的名称。

    • 服务管理参考:(可选)ITSM 数据库中的上下文信息。

    • 说明:(可选) 添加说明。

  8. “安全性”中 ,选中“授予对所有管道 的访问权限”复选框,以允许所有管道使用此服务连接。 如果未选择此选项,则必须手动授予对使用此服务连接的每个管道的访问权限。

  9. 选择保存以验证并创建服务连接。

    显示如何创建托管标识 ARM 服务连接的屏幕截图。

从管道访问密钥保管库机密

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

  2. 选择“管道”,然后选择“新建管道”。

  3. 选择 Azure Repos Git (YAML),然后选择存储库。

  4. 选择“初学者管道”模板。

  5. 默认管道将包括一个运行 echo 命令的脚本。 我们不需要这些脚本,因此可将其删除。

  6. 添加 AzureKeyVault 任务,将占位符替换为先前创建的服务连接的名称和密钥保管库名称。 YAML 文件应与下面的片段类似:

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - task: AzureKeyVault@2
      displayName: Azure Key Vault
      inputs:
        azureSubscription: 'SERVICE_CONNECTION_NAME'
        KeyVaultName: 'KEY_VAULT_NAME'
        SecretsFilter: '*'
        RunAsPreJob: false
    
  7. 让我们添加以下任务来复制和发布机密。 此示例仅用于演示目的,不应在生产环境中实现。

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - task: AzureKeyVault@2
      displayName: Azure Key Vault
      inputs:
        azureSubscription: 'SERVICE_CONNECTION_NAME'
        KeyVaultName: 'KEY_VAULT_NAME'
        SecretsFilter: '*'
        RunAsPreJob: false
    
    - task: CmdLine@2
      displayName: Create file
      inputs:
        script: 'echo $(SECRET_NAME) > secret.txt'
    
    - task: CopyFiles@2
      displayName: Copy file
      inputs:
        Contents: secret.txt
        targetFolder: '$(Build.ArtifactStagingDirectory)'
    
    - task: PublishBuildArtifacts@1
      displayName: Publish Artifact
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'drop'
        publishLocation: 'Container'
    
  8. 选择保存并运行,然后再次选择它以提交更改并触发管道。 如果系统提示你是否允许管道访问 Azure 资源,请选择“允许”。 只需批准管道一次。

  9. 选择“CmdLine”任务以查看日志。

    显示命令行任务日志的屏幕截图。

  10. 管道运行完成后,返回到管道摘要并选择已发布的项目。

    在摘要选项卡中显示已发布项目的屏幕截图。

  11. 选择删除>secret.txt 以下载。

    显示如何下载已发布项目的屏幕截图。

  12. 打开刚下载的文本文件,该文本文件应包含 Azure Key Vault 中的机密。

警告

本教程仅用于教育目的。 有关安全最佳做法以及如何安全使用机密,请参阅使用 Azure 密钥保管库管理服务器应用中的机密

清理资源

按照以下步骤删除创建的资源:

  1. 如果你已创建新组织来托管项目,请参阅如何删除组织,否则请删除项目

  2. 本教程中创建的所有 Azure 资源都托管在一个资源组下。 运行以下命令,以删除资源组及其所有资源。

    az group delete --name <YOUR_RESOURCE_GROUP_NAME>
    

常见问题解答

问:我收到以下错误:“用户或组没有机密列出权限”,该如何解决?

答:如果你遇到的错误指出用户或组在密钥保管库上没有机密列出权限,请运行以下命令,以授予应用程序对 Azure 密钥保管库中的密钥或机密的访问权限:

az account set --subscription <YOUR_SUBSCRIPTION_ID>

az login

$spnObjectId = az ad sp show --id <YOUR_SERVICE_PRINCIPAL_ID>

az keyvault set-policy --name <YOUR_KEY_VAULT_NAME> --object-id $spnObjectId --secret-permissions get list