设置机密变量

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

机密变量是可在管道中使用且无需公开其值的加密变量。 机密变量可用于密码、ID 等私人信息,以及不希望在管道中公开的其他标识数据。 机密变量使用 2048 位 RSA 密钥进行静态加密,并在代理上可供任务和脚本使用。

设置机密变量的建议方法包括 UI变量组Azure 密钥保管库中的变量组。 也可以使用日志记录命令在脚本中设置机密变量,但不建议使用这种方法,因为可以访问你的管道的任何人也都可以看到该机密。

在管道的管道设置 UI 中设置的机密变量的范围限定为设置它们的管道。 可以使用变量组跨管道共享机密变量。

UI 中的机密变量

编辑单个管道时,可以在管道编辑器中设置机密变量。 你将通过选择锁图标来加密管道变量并将其设置为机密。

为 YAML 和经典设置机密变量的方式相同。

要在 Web 界面中设置机密,请执行以下步骤:

  1. 转到管道页,选择适当的管道,然后选择编辑
  2. 找到该管道的变量
  3. 添加或更新该变量。
  4. 选择“将此值保密”选项,以加密方式存储变量。
  5. 保存管道。

机密变量使用 2048 位 RSA 密钥进行静态加密。 代理上提供机密供任务和脚本使用。 请注意谁有权更改管道。

重要

我们要尽量屏蔽机密,使其不出现在 Azure Pipelines 输出中,但你仍然需要采取预防措施。 切勿将机密作为输出进行回显。 某些操作系统记录命令行参数。 切勿在命令行上传递机密。 相反,我们建议将机密映射到环境变量中。

我们从不屏蔽机密的子字符串。 例如,如果将“abc123”设置为机密,则不会从日志中屏蔽“abc”。 这是为了避免在过于精细的级别屏蔽机密,从而使日志不可读。 因此,机密不应包含结构化数据。 例如,如果“{ "foo": "bar" }”设置为机密,则不会从日志中屏蔽“bar”。

与普通变量不同,它们不会自动解密为脚本的环境变量。 你需要显式映射机密变量。

在 UI 中使用机密变量

需要将机密变量映射为环境变量,以在 YAML 管道中引用它们。 在此示例中,UI 中定义了两个机密变量:SecretOneSecretTwoSecretOne 的值为 fooSecretTwo 的值为 bar

steps:
- powershell: |
      Write-Host "My first secret variable is $env:FOO_ONE"
      $env:FOO_ONE -eq "foo"
  env:
    FOO_ONE: $(SecretOne)
- bash: |
    echo "My second secret variable: $FOO_TWO"
    if [ "$FOO_TWO" = "bar" ]; then
        echo "Strings are equal."
    else
        echo "Strings are not equal."
    fi
  env:
    FOO_TWO: $(SecretTwo) 

管道输出:

My first secret variable is ***
True
My second secret variable: ***
Strings are equal.

注意

Azure Pipelines 在向管道日志发出数据时会努力屏蔽机密,因此你可能会在输出和日志中看到未设置为机密的其他变量和数据掩码。

有关更详细的示例,请参阅定义变量

在变量组中设置机密变量

可以将机密添加到变量组,也可以链接现有 Azure 密钥保管库中的机密。

创建新变量组

  1. 选择“管道”>“库”>“+ 添加变量组”。

    屏幕截图显示用红框高亮显示的“添加变量组”按钮。

  2. 为组输入名称和描述。

  3. 可选:移动开关以将 Azure 密钥保管库中的机密作为变量进行链接。 有关详细信息,请参阅使用 Azure 密钥保管库机密

  4. 输入要包含在组中的每个变量的名称和值,为每个变量选择“+ 添加”。

  5. 要确保变量安全,请选择行末尾的“锁”图标。

  6. 添加完变量后,请选择“保存”。

    屏幕截图显示保存变量组。

变量组遵循库安全模型

可以创建一个链接到现有 Azure 密钥库的变量组,并将选定的密钥库机密映射到变量组。 只有机密名称会被映射到变量组中,而机密值不会被映射到变量组中。 链接到变量组的管道运行会从存储库中获取最新的机密值。

对密钥保管库中现有机密所做的任何更改,都会自动提供给使用该变量组的所有管道。 但是,如果在保管库中添加或删除机密,则相关的变量组不会自动更新。 必须显式更新要包含在变量组中的机密。

虽然密钥保管库支持在 Azure 中存储和管理加密密钥和证书,但 Azure Pipelines 变量组集成仅支持映射密钥保管库机密。 不支持加密密钥和证书。

注意

不支持使用 Azure 基于角色的访问控制l (Azure RBAC) 的 Azure 保管库。

先决条件

  • 包含机密的 Azure 密钥保管库。 可以使用 Azure 门户创建密钥保管库。
  • 项目的 Azure 服务连接

创建变量组

  1. 在 Azure DevOps 项目中,选择管道>>+ 变量组
  2. 在“变量组”页面中,输入变量组的名称和可选描述。
  3. 启用链接 Azure Key Vault 中的机密作为变量切换。
  4. 选择 Azure 订阅终结点和密钥保管库名称。
  5. 通过选择保管库名称旁边的“授权”,使 Azure DevOps 能够访问密钥保管库。
  6. 在“选择机密”屏幕上,从保管库中选择特定机密以映射到此变量组,然后选择“确定”。
  7. 选择“保存”以保存机密变量组。

屏幕截图显示变量组与 Azure 密钥保管库的集成。

注意

Azure 服务连接必须在密钥保管库上至少拥有 GetList 权限,可以在前面的步骤中进行授权。 也可以通过以下步骤从 Azure 门户提供这些权限:

  1. 打开密钥保管库的“设置”,然后选择访问配置>转到访问策略
  2. 在“访问策略”页上,如果 Azure Pipelines 项目未在“应用程序”下至少具有 GetList 权限,请选择“创建”。
  3. 在“机密权限”下,选择 GetList,然后选择“下一步”。
  4. 选择“服务主体”,然后“下一步”。
  5. 再次选择“下一步”,查看设置,然后选择“创建”。

使用 Azure 密钥保管库任务

可以使用 Azure 密钥保管库任务在管道中包含机密。 此任务允许管道连接到 Azure 密钥保管库并检索要用作管道变量的机密。

  1. 在管道编辑器中,选择“显示助手”以展开助手面板。

  2. 搜索 vault,然后选择 Azure 密钥保管库任务

    添加 Azure 密钥保管库任务。

Azure DevOps Server 2019 和 2020 目前不支持“使机密可供整个作业使用”选项。

要详细了解 Azure 密钥保管库任务,请参阅在 Azure Pipelines 中使用 Azure 密钥保管库机密

使用日志记录命令在脚本中设置机密变量

可以使用 task.setvariable 日志记录命令在 PowerShell 和 Bash 脚本中设置变量。 这是使用机密变量最不安全的方法,但可用于调试。 设置机密变量的建议方法包括 UI、变量组和 Azure 密钥保管库中的变量组。

要使用日志记录命令将变量设置为脚本,需要传递 issecret 标志。

issecret 设置为 true 时,变量的值将另存为机密并从日志中屏蔽。

注意

Azure Pipelines 在向管道日志发出数据时会努力屏蔽机密,因此你可能会在输出和日志中看到未设置为机密的其他变量和数据掩码。

设置机密变量 mySecretVal

- bash: |
    echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"

获取机密变量 mySecretVal

- bash: |
    echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
- bash: |
    echo $(mySecretVal)

bash 中的机密变量输出。

屏幕截图显示 bash 变量输出。

详细了解如何在脚本中设置和使用变量