在 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 存储库。
登录到 Azure DevOps 组织,并导航到你的项目。
选择 Repos,然后选择“ 导入”。 输入以下存储库 URL,然后选择“ 导入”。
https://github.com/MicrosoftDocs/pipelines-dotnet-core
创建 Azure Key Vault
登录到 Azure 门户,然后选择右上角的“Cloud Shell”按钮。
如果你的帐户关联了多个 Azure 订阅,请使用以下命令指定默认订阅。 可以使用
az account list
生成订阅列表。az account set --subscription <YOUR_SUBSCRIPTION_NAME_OR_ID>
设置默认的 Azure 区域。 可以使用
az account list-locations
生成可用区域的列表。az config set defaults.location=<YOUR_REGION>
创建新的资源组。
az group create --name <YOUR_RESOURCE_GROUP_NAME>
创建新的 Azure Key Vault。
az keyvault create \ --name <YOUR_KEY_VAULT_NAME> \ --resource-group <YOUR_RESOURCE_GROUP_NAME>
在 Azure 密钥保管库中创建新机密。
az keyvault secret set \ --name <YOUR_SECRET_NAME> \ --value <YOUR_ACTUAL_SECRET> \ --vault-name <YOUR_KEY_VAULT_NAME>
设置身份验证
创建用户分配的托管标识
登录到Azure 门户,然后在搜索栏中搜索托管标识服务。
选择“创建”,并填写必填字段,如下所示:
- 订阅:从下拉菜单中选择订阅。
- 资源组:选择现有资源组或创建新资源组。
- 区域:从下拉菜单中选择一个区域。
- 名称:输入用户分配的托管标识的名称。
完成后,选择“审阅 + 创建”。
部署完成后,选择“ 转到资源”,然后复制 订阅 和 客户端 ID 值,以在后续步骤中使用。
导航到“设置属性”>,并复制托管标识的租户 ID 值供以后使用。
设置密钥保管库访问策略
导航到Azure 门户,并使用搜索栏查找之前创建的密钥保管库。
选择“访问策略”,然后选择“创建”以添加新策略。
在“机密权限”下,选中“获取”和“列出”复选框。
选择“下一步”,然后将前面创建的托管标识的客户端 ID 粘贴到搜索栏中。 选择托管标识。
依次选择“ 下一步”、“ 下一 步”。
查看新策略,然后选择“ 完成时创建 ”。
创建服务连接
登录到 Azure DevOps 组织,并导航到你的项目。
选择项目设置>服务连接,然后选择新建服务连接以创建新的服务连接。
选择 Azure 资源管理器,然后选择“下一步”。
对于 “标识类型”,请从下拉菜单中选择 “托管标识 ”。
对于 步骤 1:托管标识详细信息,请填写字段,如下所示:
托管标识的订阅:选择包含托管标识的订阅。
托管标识的资源组:选择托管标识的资源组。
托管标识:从下拉菜单中选择托管标识。
对于 步骤 2:Azure 作用域,请填写字段,如下所示:
服务连接的范围级别:选择订阅。
服务连接的订阅:选择托管标识将访问的订阅。
服务连接的资源组:(可选)指定以限制对一个资源组的托管标识访问。
对于 步骤 3:服务连接详细信息:
服务连接名称:提供服务连接的名称。
服务管理参考:(可选)ITSM 数据库中的上下文信息。
说明:(可选) 添加说明。
在 “安全性”中 ,选中“授予对所有管道 的访问权限”复选框,以允许所有管道使用此服务连接。 如果未选择此选项,则必须手动授予对使用此服务连接的每个管道的访问权限。
选择保存以验证并创建服务连接。
从管道访问密钥保管库机密
登录到 Azure DevOps 组织,并导航到你的项目。
选择“管道”,然后选择“新建管道”。
选择 Azure Repos Git (YAML),然后选择存储库。
选择“初学者管道”模板。
默认管道将包括一个运行 echo 命令的脚本。 我们不需要这些脚本,因此可将其删除。
添加 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
让我们添加以下任务来复制和发布机密。 此示例仅用于演示目的,不应在生产环境中实现。
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'
选择保存并运行,然后再次选择它以提交更改并触发管道。 如果系统提示你是否允许管道访问 Azure 资源,请选择“允许”。 只需批准管道一次。
选择“CmdLine”任务以查看日志。
管道运行完成后,返回到管道摘要并选择已发布的项目。
选择删除>secret.txt 以下载。
打开刚下载的文本文件,该文本文件应包含 Azure Key Vault 中的机密。
警告
本教程仅用于教育目的。 有关安全最佳做法以及如何安全使用机密,请参阅使用 Azure 密钥保管库管理服务器应用中的机密。
清理资源
按照以下步骤删除创建的资源:
本教程中创建的所有 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