Безопасное использование переменных и параметров в конвейере

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

В этой статье описывается, как безопасно использовать переменные и параметры для сбора входных данных от пользователей конвейера. Дополнительные сведения об использовании переменных и параметров см. в следующей статье:

Используйте осторожность с секретными переменными. Рекомендуемые способы задания секретных переменных находятся в пользовательском интерфейсе, в группе переменных и в группе переменных из Azure Key Vault. Дополнительные сведения см. в разделе "Задание секретных переменных".

Переменные

Переменные могут быть удобным способом сбора информации от пользователя заранее. Можно также использовать переменные для передачи данных из шага в шаг в конвейер.

Но используйте переменные с осторожностью. Только что созданные переменные, определенные в 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 можно разрешить пользователям переопределить его значение при запуске конвейера. Мы называем такую переменную переменной во время очереди. Переменные во время очереди всегда определяются в редакторе пользовательского интерфейса Pipelines.

Снимок экрана: определение переменной времени очереди.

Переменные во время очереди предоставляются конечному пользователю при выполнении конвейера вручную, и они могут изменять свои значения. Снимок экрана: обновление значения переменной времени очереди.

Пользователям требуется разрешение на изменение конфигурации сборки очереди в конвейере, чтобы указать переменные, заданные во время очереди.

Ограничить переменные, которые можно задать во время ожидания

Пользовательский интерфейс и REST API, используемые для запуска конвейера, позволяют пользователям определять новые переменные во время очереди.

Снимок экрана: добавление переменной времени очереди непосредственно перед запуском конвейера.

На ранних этапах работы Azure Pipelines имелись некоторые проблемы с этой функцией:

  • Он позволил пользователям определять новые переменные, которые не определены явным образом автором конвейера в определении.
  • Это позволяло пользователям переопределять системные переменные.

Чтобы устранить эти проблемы, мы определили параметр для ограничения переменных, которые можно задать во время очереди. Если этот параметр включен, можно задать только те переменные, которые явно помечены как "Устанавливаемые во время очереди". Если этот параметр не включен, вы можете установить любые переменные во время очереди.

Этот параметр предназначен для работы на уровне организации и на уровне проекта.

  1. Уровень организации. Если параметр включен, он применяется, что для всех конвейеров во всех проектах в организации можно задать только те переменные, которые явно помечены как Settable во время очереди. Если параметр отключен, каждый проект может выбрать, следует ли ограничить набор переменных во время очереди или нет. Параметр — это переключатель в разделе Параметры организации —> конвейеры —> Параметры. Только коллекции проектов Администратор istrator могут включать или отключать его. Снимок экрана: ограничение переменных, которые могут быть заданы во время очереди на уровне организации.
  2. Уровень проекта. Если параметр включен, он применяет это значение для всех конвейеров проекта, можно задать только те переменные, которые явно помечены как Settable во время очереди. Если параметр включен на уровне организации, он включен для всех проектов и не может быть отключен. Параметр — это переключатель в разделе Project Параметры —> конвейеры —> Параметры. Только Администратор istrator Project могут включать или отключать его. Снимок экрана: ограничение переменных, которые могут быть заданы во время очереди на уровне проекта.

Рассмотрим пример. Предположим, что параметр включен, и конвейер определяет переменную с именем 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
}

Параметры

В отличие от переменных, параметры конвейера не могут быть изменены конвейером во время его выполнения. Параметры имеют такие типы данных, как number и string, и они могут быть ограничены подмножеством значений. Ограничение параметров полезно, если настраиваемая пользователем часть конвейера должна принимать значение только из ограниченного списка. Программа установки гарантирует, что конвейер не будет принимать произвольные данные.

Включение проверки параметров аргументов задач оболочки

Конвейеры могут ссылаться на задачи, выполняемые в конвейере. Несколько задач, включенных в Azure DevOps, имеют параметр аргументов, который позволяет указать дополнительные параметры для задачи.

Если включена проверка параметра "Включить аргументы задач оболочки", параметр аргументов проверяется для любых символов, которые могут быть неправильно выполнены оболочкой. Примеры символов включают запятую, кавычки и скобки.

Как и переменные Limit, которые можно задать в режиме очереди, можно настроить проверку параметров аргументов задач оболочки на уровне организации на Параметры> Pipelines Параметры или на уровне проекта на Параметры> Pipelines>>Параметры.

При включении обнаруженная проблема проверки возникает, как показано ниже, регистрируется сообщение об ошибке: Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`).

Чтобы устранить проблему, настройте аргументы, экранируя специальные символы, как указано в сообщении об ошибке.

Если включена проверка параметра параметра "Включить задачи оболочки", проверка применяется к параметру аргументов в следующих задачах.

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

Следующие шаги

После защиты входных данных также необходимо защитить общую инфраструктуру.