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

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

Azure 密钥保管库使开发人员能够安全地存储和管理 API 密钥、凭据或证书等机密。 Azure 密钥保管库服务支持两种类型的容器:保管库和托管 HSM(硬件安全模块)池。 保管库支持存储软件和 HSM 保护的密钥、机密和证书,而托管 HSM 池仅支持 HSM 保护的密钥。

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

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

先决条件

创建 Azure Key Vault

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

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

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

    az config set defaults.location=<your_region>
    

    例如,此命令将选择 westus2 区域:

    az config set defaults.location=westus2
    
  3. 创建新的资源组。 资源组是用于保存 Azure 解决方案相关资源的容器。

    az group create --name <your-resource-group>
    
  4. 创建新的密钥保管库。

    az keyvault create \
      --name <your-key-vault> \
      --resource-group <your-resource-group>
    
  5. 在 Azure 密钥保管库中创建新机密。

    az keyvault secret set \
      --name "Password" \
      --value "mysecretpassword" \
      --vault-name <your-key-vault-name>
    

创建一个项目

  1. 登录到你的 Azure DevOps 组织

  2. 如果你的组织中目前没有任何项目,请选择“创建项目以开始”。 否则,请选择右上角的“新建项目”。

创建存储库

我们将使用 YAML 创建管道,但首先需要创建新的存储库。

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

  2. 选择“存储库”,然后选择“初始化”以根据自述文件初始化新的存储库。

    显示如何初始化存储库的屏幕截图。

创建新管道

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

  2. 选择“Azure Repos Git”(YAML)。

    显示如何选择 Azure Repos 源代码管理的屏幕截图。

  3. 选择在上一步骤中创建的存储库。

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

  5. 默认管道包含几个运行 echo 命令的脚本。 我们不需要这些脚本,因此可将其删除。 新的 YAML 文件应如下所示:

    trigger:
    - main
    
    pool:
        vmImage: 'ubuntu-latest'
    
    steps:
    
  6. 选择“显示助手”以展开助手面板。 此面板提供易用且可搜索的管道任务列表。

    显示如何访问任务助手面板的屏幕截图。

  7. 搜索“保管库”,然后选择“Azure 密钥保管库”任务。

    显示如何搜索 Azure 密钥保管库任务的屏幕截图。

  8. 选择“Azure 订阅”,然后选择“授权”。 从下拉菜单中选择“密钥保管库”,然后选择“添加”以将任务添加到 YAML 管道。

    显示如何配置 Azure 密钥保管库任务的屏幕截图。

    注意

    Azure DevOps Server 2019 和 2020 不支持“使机密可供整个作业使用”功能。

  9. YAML 文件应如下所示:

    trigger:
    - main
    
    pool:
      vmImage: ubuntu-latest
    
    steps:
    - task: AzureKeyVault@2
      inputs:
        azureSubscription: 'Your-Azure-Subscription'
        KeyVaultName: 'Your-Key-Vault-Name'
        SecretsFilter: '*'
        RunAsPreJob: false
    
    - task: CmdLine@2
      inputs:
        script: 'echo $(Your-Secret-Name) > secret.txt'
    
    - task: CopyFiles@2
      inputs:
        Contents: secret.txt
        targetFolder: '$(Build.ArtifactStagingDirectory)'
    
    - task: PublishBuildArtifacts@1
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'drop'
        publishLocation: 'Container'
    

暂时不要将你的管道保存或排队。 必须首先为管道授予对 Azure 密钥保管库的适当访问权限。 将浏览器选项卡保持打开状态,我们将在设置密钥保管库权限后继续执行剩余的步骤。

设置 Azure 密钥保管库访问策略

若要访问 Azure 密钥保管库,必须首先设置一个服务主体以授予对 Azure Pipelines 的访问权限。 按照此指南所述创建服务主体,然后继续执行本部分所述的后续步骤。

  1. 导航到 Azure 门户

  2. 使用搜索栏搜索之前创建的密钥保管库。

    显示如何搜索 Azure 密钥保管库的屏幕截图。

  3. 在“设置”下,选择“访问策略”。

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

  5. 对于“机密权限”,请选择“获取”和“列出”。

  6. 选择用于选择服务主体的选项,并搜索在本部分开头创建的服务主体。 安全主体是一个对象,表示请求访问 Azure 资源的用户、组、服务或应用程序。

  7. 选择“添加”以创建访问策略,完成后选择“保存”。

注意

不支持使用 Azure 基于角色的访问控制 (Azure RBAC) 的 Azure Key Vault。

运行并检查管道

  1. 返回到我们离开的上一个选项卡。

  2. 选择“保存”,然后再次选择“保存”以提交更改并触发管道。 如果系统提示你是否允许管道访问 Azure 资源,请选择“允许”。 只需批准管道一次。

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

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

  4. 返回到管道摘要并选择已发布的工件。

    显示管道摘要和已发布工件的屏幕截图。

  5. 选择“secret.txt”工件将其打开。

    显示如何打开已发布工件的屏幕截图。

  6. 该文本文件应包含机密:mysecretpassword。

警告

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

清理资源

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

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

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

    az group delete --name PipelinesKeyVaultResourceGroup
    

常见问题解答

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

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

$ErrorActionPreference="Stop";
$Credential = Get-Credential;
Connect-AzAccount -SubscriptionId <YOUR_SUBSCRIPTION_ID> -Credential $Credential;
$spn=(Get-AzureRmADServicePrincipal -SPN <YOUR_SERVICE_PRINCIPAL_ID>);
$spnObjectId=$spn.Id;
Set-AzureRmKeyVaultAccessPolicy -VaultName key-vault-tutorial -ObjectId $spnObjectId -PermissionsToSecrets get,list;

后续步骤