设置机密变量

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. 选择“管道”>“库”>“+ 添加变量组”。

    Screenshot of Add variable group button highlighted with red box.

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

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

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

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

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

    Screenshot of saving a variable group.

变量组遵循库安全模型

将现有 Azure 密钥保管库链接到变量组,并将选择性保管库机密映射到变量组。

  1. 在“变量组”页面中,启用“Azure 密钥保管库中的机密作为变量进行链接”。 你将需要一个包含机密的现有密钥保管库。 使用 Azure 门户创建密钥保管库。

    Screenshot of variable group with Azure key vault integration.

  2. 指定 Azure 订阅终结点和包含机密的保管库的名称。

    为获取机密,请确保 Azure 服务连接在保管库上至少具有 Get 和 List 管理权限。 通过选择保管库名称旁边的“授权”,允许 Azure Pipelines 设置这些权限。 或者,在 Azure 门户中手动设置权限:

    1. 打开保管库的“设置”,然后选择“访问策略”>“新增”。
    2. 选择“选择主体”,然后选择客户端帐户的服务主体。
    3. 选择“机密权限”,并确保 Get 和 List 已勾选。
    4. 选择“确定”以保存更改。
  3. 在“变量组”页面上,选择“+ 添加”,从保管库中选择要映射到此变量组的特定机密。

管理密钥保管库机密

请参阅以下有关管理机密的有用提示列表。

  • 仅将机密“名称”映射到变量组,而不机密值。 从保管库提取的最新机密值用于链接到变量组的管道运行。

  • 对密钥保管库中现有机密所做的任何更改都将自动提供给使用变量组的所有管道。

  • 在保管库中添加或删除新机密时,不会自动更新关联的变量组。 必须显式更新变量组中包含的机密,以便正确执行使用变量组的管道。

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

使用 Azure 密钥保管库任务

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

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

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

    Add the Azure Key Vault task.

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 中的机密变量输出。

Screenshot of bash variable output.

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