安全地在管道中使用变量和参数

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

了解如何安全地利用变量和参数从管道用户收集输入。 有关详细信息,请参阅以下文章:

请谨慎使用机密变量。 用于设置机密变量的建议方法包括使用 UI、创建变量组或利用源自 Azure 密钥库的变量组。 有关详细信息,请参阅设置密码变量

变量

变量是一种方便的方法,用于提前收集用户输入,并有助于在管道步骤之间传输数据。 但是,在使用变量时请谨慎行事。 默认情况下,新创建的变量(无论是在 YAML 中定义还是脚本中定义)都是读写的。 下游步骤可能会意外修改变量值。

例如,请考虑以下脚本片段:

msbuild.exe myproj.proj -property:Configuration=$(MyConfig)

如果前面的步骤设置为MyConfigDebug & deltree /y c:,可能会导致意外后果。 虽然此示例只是删除生成代理的内容,但它突出显示了此类设置的潜在危险。

可以将变量设置为只读。 系统变量(如 Build.SourcesDirectory、任务输出变量和队列时间变量)始终是只读的。 在 YAML 中创建或在运行时由脚本创建的变量可以指定为只读。 当脚本或任务创建新变量时,它可以在其日志记录命令中传递 isReadonly=true 标志,从而将变量设为只读。

在 YAML 中,可以使用以下特定键指定只读变量:

variables:
- name: myReadOnlyVar
  value: myValue
  readonly: true

队列时间变量

在 Pipelines UI 编辑器中定义变量时,可以允许用户在管道执行期间重写其值。 这些变量称为队列时间变量,始终在 Pipelines UI 编辑器中定义。

定义队列时间变量的屏幕截图。

当最终用户手动运行管道时,队列时间变量会向它们公开,他们可以更改其值。 更新队列时变量值的屏幕截图。

用户需要对管道具有编辑队列生成配置权限,才能指定在队列时间设置的变量。

限制可在排队时设置的变量

用于运行管道的 UI 和 REST API 为用户提供了在队列时定义新变量的方法。

在运行管道之前添加队列时间变量的屏幕截图。

在 Azure Pipelines 的早期,此功能具有以下问题:

  • 它允许用户定义定义中尚未由管道作者定义的新变量。
  • 此 API 允许用户重写系统变量。

为了解决这些问题,我们定义了一个设置来 限制可以在队列时设置的变量。 启用此设置后,只能设置显式标记为“队列时 Settable”的变量。 换句话说,可以在队列时设置任何变量,除非此设置处于打开状态。

此设置设计为在组织和项目级别工作。

  • 组织级别:
    • 当设置处于打开状态时,它强制仅针对组织内所有项目的所有管道修改显式标记为“Settable at queue time”的变量。
    • 项目集合管理员可以启用或禁用此设置。
    • 在“组织设置>管道>设置”访问此设置。 限制可在排队时在组织级别设置的变量的屏幕截图。
  • 项目级别:
    • 与组织级别类似,启用此设置可确保只有标记为“队列时设置”的变量才能针对特定项目中的所有管道进行修改。
    • 如果启用了组织级别设置,则它适用于所有项目,并且无法关闭。
    • 项目管理员可以启用或禁用此设置。
    • 在“项目设置管道>设置”>下访问此设置。 可在项目级别的队列时间设置的限制变量的屏幕截图。

下面的示例演示了该设置,管道定义了一个名为 my_variable 在队列时无法设置的变量。 在经典管道中定义变量的屏幕截图。

接下来,假设要运行管道。 “变量”面板不显示任何变量,并且缺少“添加变量”按钮。

变量面板的屏幕截图,其中的设置已开启。

使用生成 - 队列运行 - 运行管道 REST API 调用对管道运行进行排队,并设置新变量的值my_variable失败,并出现如下错误。

{
  "$id": "1",
  "innerException": null,
  "message": "You can't set the following variables (my_variable). If you want to be able to set these variables, then edit the pipeline and select Settable at queue time on the variables tab of the pipeline editor.",
  "typeName": "Microsoft.Azure.Pipelines.WebApi.PipelineValidationException, Microsoft.Azure.Pipelines.WebApi",
  "typeKey": "PipelineValidationException",
  "errorCode": 0,
  "eventId": 3000
}

参数

与变量不同,正在运行的管道无法修改管道参数。 参数具有数据类型,numberstring并且可以限制为特定的值子集。 当管道的用户可配置方面只接受预定义列表中的值时,此限制非常有用,确保管道不接受任意数据。

启用 shell 任务实参验证

管道可以引用管道中执行的任务。 某些任务包括一个 arguments 参数,可用于为任务指定更多选项。

启用“启用 shell 任务”参数验证设置时,参数参数将进行评审,以确保 shell 正确执行分号、引号和括号等字符。 与可在队列时间选项设置的“限制”变量类似,可以在“设置管道>设置>下,在组织或项目级别配置 Enable shell 任务参数验证。

启用此功能后,与参数相关的 arguments 任何验证问题都触发错误消息,如下所示:

Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`).

若要解决此问题,请通过转义错误消息中指示的特殊字符来调整参数。 此验证适用于 arguments 以下特定任务中的参数:

  • PowerShell
  • BatchScript
  • Bash
  • Ssh
  • AzureFileCopy
  • WindowsMachineFileCopy

后续步骤