设置机密变量

Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022

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

为什么机密变量很重要: 保护 CI/CD 管道中的敏感凭据至关重要。 通过安全地存储机密,可以防止未经授权的访问敏感资源,降低生成日志中凭据泄露的风险,并保持符合安全最佳做法。 机密变量确保只有经过授权的管道和任务才能访问敏感数据,从而保护组织的安全状况。

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

在管道设置 UI 中设置的机密变量仅限于这些变量设置的管道中使用。 使用变量组跨管道共享机密变量。

UI 中的机密变量

编辑单个管道时,在管道编辑器中设置机密变量。 通过选择锁图标来加密和生成管道变量机密。

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

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

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

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

重要

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

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

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

在 UI 中使用机密变量

若要引用 YAML 管道中的机密变量,请将它们映射为环境变量。 在此示例中,UI 定义两个机密变量, SecretOne 以及 SecretTwo. SecretOne 的值是 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 Key Vault 中的机密链接为变量。 有关详细信息,请参阅使用 Azure 密钥保管库机密

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

  5. 若要使变量安全,请选择行末尾的锁图标。

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

    变量组创建页上的“保存”按钮的屏幕截图,其中显示了准备保存的已完成变量组。

变量组遵循库安全模型

可以创建变量组并将其链接到现有的 Key Vault,以便映射到密钥保管库中存储的机密。 只有机密名称会被映射到变量组中,而机密值不会被映射到变量组中。 管道运行链接到变量组并从保管库中提取最新机密值。 有关详细信息,请参阅将变量组链接到 Azure 密钥库中的机密。

使用 Azure 密钥保管库任务

使用 Azure Key Vault 任务将机密安全地包含在您的管道中。 通过使用此任务,管道可以连接到 Key Vault 并检索密钥,以作为管道变量。

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

  2. 搜索 vault 并选择 Key Vault 任务

    任务助手面板的屏幕截图,显示了保管库搜索结果,其中包括 Azure Key Vault 任务选项。

有关 Key Vault 任务的详细信息,请参阅 在 Azure Pipelines 中使用 Azure Key Vault 机密

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

task.setvariable使用日志记录命令在 PowerShell 和 Bash 脚本中设置变量。 此方法是处理机密变量最不安全的方法,但可用于调试。 设置机密变量的建议方法位于 UI、变量组和 Key Vault 中的变量组中。

警告

安全风险:使用日志记录命令在脚本中设置机密变量本质上不太安全。 有权访问管道定义、生成日志或源代码的任何人都可以查看日志记录命令,并可能公开机密。 仅在安全受信任的环境中使用此方法进行调试。 对于生产方案,始终首选基于 UI 的配置、变量组或 Azure Key Vault 集成。

若要使用日志记录命令将变量设置为脚本,请传递 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 变量输出。

有关详细信息,请参阅 在脚本中设置和使用变量