在 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 Repo 来设置管道。

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

  2. 选择 Repos,然后选择初始化,以使用 README 初始化主分支。

    显示如何使用 README 文件初始化存储库的屏幕截图。

创建 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>
    

设置密钥保管库访问策略

为了访问 Azure Key Vault,需要设置一个服务主体来授予对 Azure Pipelines 的访问权限。 按照本指南操作,使用 Azure CLI 创建服务主体,然后继续执行本节中的后续步骤。

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

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

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

  3. 机密权限下,选择获取列出

  4. 选择下一步,然后选择之前创建的服务主体。 服务主体是一个对象,表示请求访问 Azure 资源的应用程序或服务。

  5. 选择下一步,然后再次选择下一步

  6. 查看策略,完成后选择创建

添加角色分配

在下一步中,我们将使用服务主体创建 ARM 服务连接。 在验证连接之前,需要在订阅级别授予服务主体读取访问权限:

  1. 导航到 Azure 门户

  2. 从左侧导航面板中选择订阅,然后找到订阅并选择。

  3. 选择访问控制,然后选择添加>添加角色分配

    显示如何在订阅级别添加新角色分配的屏幕截图。

  4. 选择角色选项卡下的读取者,然后选择下一步

  5. 选择用户、组或服务主体,然后选择选择成员

    显示如何将成员添加到 Azure 中的角色分配的屏幕截图。

  6. 使用搜索栏查找服务主体,然后选择“+”符号以将其选中,然后单击选择按钮。

  7. 选择查看 + 分配,查看设置,然后选择查看 + 分配再次确认选择并添加角色分配。

创建服务连接

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

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

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

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

  5. 对于环境选择 Azure 云,对于范围级别选择订阅,然后输入订阅 ID订阅名称

  6. 使用创建服务主体时获得的信息填写以下字段,完成后选择验证

    • 服务主体 ID:服务主体的 appId
    • 服务主体密钥:服务主体的密码
    • 租户 ID:服务主体的租户
  7. 验证成功后,为服务连接提供名称和描述(可选),然后选中授予对所有管道的访问权限复选框。

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

    屏幕截图,其中显示如何使用服务主体创建新的 Azure 资源管理器服务连接。

  1. 登录到 Azure DevOps 集合,然后导航到项目。

  2. 选择项目设置>服务连接>新建服务连接,然后选择 Azure 资源管理器,创建新的 ARM 服务连接。

  3. 为服务连接命名,然后为环境选择 Azure 云,为范围级别选择订阅

  4. 输入订阅 ID订阅名称

  5. 使用创建服务主体时获得的信息填写以下字段,完成后选择验证连接

    • 服务主体客户端 ID:服务主体 appId
    • 服务主体密钥:服务主体的密码
    • 租户 ID:服务主体的租户
  6. 选中允许所有管道使用此连接复选框,然后在完成后选择确定

    显示如何在 Azure DevOps Server 2019 中使用服务主体创建新的 ARM 服务连接的屏幕截图。

创建新管道

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

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

  3. 使用使用经典编辑器创建经典管道。

  4. 选择 Azure Repos Git,选择存储库和默认分支,然后选择继续

  5. 选择“.Net Desktop”管道模板。

  6. 在本例中,我们只需要完成最后两个任务。 在按住 CTRL 键的同时选择前五个任务,然后单击右键并选择“删除选定任务”以将其删除。

    显示如何删除多个管道任务的屏幕截图。

  7. 选择 + 以添加新任务。 搜索命令行任务,将其选中,然后选择添加将其添加到管道。 添加后,按如下方式进行配置:

    • 显示名称:创建文件
    • 脚本echo $(YOUR_SECRET_NAME) > secret.txt

    显示如何配置命令行任务的屏幕截图。

  8. 选择 + 以添加新任务。 搜索 Azure Key Vault 任务,将其选中,然后选择添加*将其添加到管道。 添加后,按如下方式进行配置:

    • 显示名称:Azure Key Vault
    • Azure 订阅:选择之前创建的服务主体服务连接
    • Key Vault:选择密钥保管库
    • 机密筛选器:以逗号分隔的机密名称列表,或保留 * 以从所选密钥保管库下载所有机密

    演示如何在经典管道中设置 Azure Key Vault 任务的屏幕截图。

  9. 选择复制文件任务并填写必填字段,如下所示:

    • 显示名称:复制文件
    • 内容:secret.txt
    • 目标文件夹:$(build.artifactstagingdirectory)

    演示如何在经典管道中设置复制文件任务的屏幕截图。

  10. 选择发布项目任务并填写必填字段,如下所示:

    • 显示名称:发布项目
    • 发布路径:$(build.artifactstagingdirectory)
    • 项目名称:删除
    • 项目发布位置:Azure Pipelines

    演示如何在经典管道中设置发布项目任务的屏幕截图。

  11. 选择保存并排队,然后选择运行以运行管道。

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

  13. 选择删除>secret.txt,以下载已发布的项目。

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

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

  1. 登录到 Azure DevOps 集合,然后导航到项目。

  2. 选择“管道”,然后选择“生成”。

  3. 选择新建>新建生成管道

  4. 使用使用经典编辑器创建新经典生成管道。

  5. 选择 Azure Repos Git,选择存储库和默认分支,然后选择继续

  6. 选择 .Net Desktop 管道模板,然后选择应用

  7. 在本例中,我们只需要完成最后两个任务。 在按住 CTRL 键的同时选择前五个任务,然后单击右键并选择“删除选定任务”以将其删除。

    显示如何在 Azure DevOps Server 2019 中的经典管道中删除多个管道任务的屏幕截图。

  8. 选择 + 以添加新任务。 搜索命令行任务,将其选中,然后选择添加将其添加到管道。 添加后,按如下方式进行配置:

    • 显示名称:创建文件
    • 脚本echo $(YOUR_SECRET_NAME) > secret.txt

    显示如何在 Azure DevOps Server 2019 中的经典管道中配置命令行任务的屏幕截图。

  9. 选择 + 以添加新任务。 搜索 Azure Key Vault 任务,将其选中,然后选择添加*将其添加到管道。 添加后,按如下方式进行配置:

    • 显示名称:Azure Key Vault
    • Azure 订阅:选择之前创建的服务主体服务连接
    • Key Vault:选择密钥保管库
    • 机密筛选器:以逗号分隔的机密名称列表,或保留 * 以从所选密钥保管库下载所有机密

    显示如何在 Azure DevOps Server 2019 的经典管道中设置 Azure Key Vault 任务的屏幕截图。

  10. 选择复制文件任务并填写必填字段,如下所示:

    • 显示名称:复制文件
    • 内容:secret.txt
    • 目标文件夹:$(build.artifactstagingdirectory)

    显示如何在 Azure DevOps Server 2019 中的经典管道中设置复制文件任务的屏幕截图。

  11. 选择发布项目任务并填写必填字段,如下所示:

    • 显示名称:发布项目
    • 发布路径:$(build.artifactstagingdirectory)
    • 项目名称:删除
    • 项目发布位置:Azure Pipelines

    显示如何在 Azure DevOps Server 2019 中的经典管道中设置发布项目任务的屏幕截图。

  12. 选择保存并队列,然后选择保存并队列以运行生成管道。

  13. 管道运行完成后,选择项目,然后选择删除

  14. 在新打开的窗口中,选择删除>secret.txt,选择省略号图标 (...),然后选择 下载以保存文本文件。

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

警告

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

清理资源

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

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

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

    az group delete --name <YOUR_RESOURCE_GROUP_NAME>
    

常见问题解答

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

答:如果你遇到的错误指出用户或组在密钥保管库上没有机密列出权限,请运行以下命令,以授予应用程序对 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;