在管道中使用 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 DevOps 组织。 免费创建一个(如果还没有)。
- 你自己的项目。 如果还没有项目,则创建一个项目。
- 你自己的存储库。 创建新的 Git 存储库(如果还没有)。
- Azure 订阅。 创建免费 Azure 帐户(如果还没有)。
创建 Azure Key Vault
注意
不支持使用 Azure 基于角色的访问控制l (Azure RBAC) 的 Azure 密钥保管库。
导航到 Azure 门户。
选择左侧导航窗格中的“创建资源”。
搜索密钥保管库,然后按 Enter。
选择“创建”以创建新的 Azure Key Vault。
选择你的“订阅”,然后添加新的“资源组”。 输入一个“密钥保管库名称”,然后选择一个“区域”和一个“定价层”。 完成后,选择“审阅 + 创建”。
完成新资源的部署后,选择“转到资源”。
创建服务主体
在此步骤中,我们将在 Azure 中创建一个新的服务主体,使我们能够从 Azure Pipelines 查询 Azure 密钥保管库。
导航到 Azure 门户。
从菜单栏中选择 >_ 图标以打开 Cloud Shell。
根据偏好选择 PowerShell 或将其保留为 Bash。
运行以下命令以创建新服务主体:
az ad sp create-for-rbac --name YOUR_SERVICE_PRINCIPAL_NAME
输出应与以下示例匹配。 请务必复制命令的输出,因为你将需要它在接下来的步骤中创建服务连接。
{ "appId": "p951q3e2-8e5r-z697-e9q52aviu8a2", "displayName": "MyServicePrincipal", "password": "***********************************", "tenant": "85wes2u6-63sh-95zx-2as3-qw58wex269df" }
配置 Key Vault 访问权限
导航到 Azure 门户。
选择在上一步创建的密钥保管库。
选择“访问策略”。
选择“添加访问策略”以添加新策略。
将“获取”和“列出”添加到“机密权限”。
在“选择主体”下,选择添加服务主体,然后选择之前创建的主体。
完成时选择“保存”。
创建新的服务连接
登录到 Azure DevOps 组织,并导航到你的项目。
选择“项目设置”,然后选择“服务连接”。
如果要在项目中首次设置服务连接,请选择“创建服务连接”。 如果之前已建立服务连接,请选择“新建服务连接”。
选择“Azure 资源管理器”,然后选择“下一步”。
选择“服务主体(手动)”,然后选择“下一步”。
选择范围级别的订阅,并使用之前创建的服务主体的信息填写必填字段。 完成操作后,选择验证:
- 服务主体 ID:服务主体的 appId。
- 服务主体密钥:服务主体的密码。
- 租户 ID:服务主体的租户。
提供服务连接的名称,确保选中“授予对所有管道的访问权限”复选框。
完成操作后,选择验证并保存。
在管道中查询和使用机密
使用 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'。