Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
В Azure Pipelines можно использовать переменные и параметры для сбора входных данных от пользователей. Эта возможность полезна, если вы хотите разрешить пользователям настраивать выполнение конвейера. Однако принятие входных данных пользователем также может привести к рискам безопасности, если они не обработаны должным образом. В этой статье вы узнаете, как безопасно использовать переменные и параметры в конвейере.
Эта статья является частью серии, которая помогает реализовать меры безопасности для Azure Pipelines. Дополнительные сведения см. в статье "Защита Azure Pipelines".
Предпосылки
Категория | Требования |
---|---|
Azure DevOps | — Реализуйте рекомендации в secure your Azure DevOps и Secure Azure Pipelines. — Базовые знания о YAML и Azure Pipelines. Дополнительные сведения см. в разделе Создайте ваш первый конвейер. |
Разрешения | — Изменение разрешений конвейеров: Член группы "Администраторы проектов". — Изменение разрешений организации: член группы администраторов коллекции проектов. |
Переменные
Переменные служат удобным способом для сбора данных, вводимых пользователем, и упрощения передачи данных между этапами конвейера. Однако при работе с переменными следует соблюдать осторожность. По умолчанию, новые переменные, которые создаются в YAML или в скриптах, доступны для чтения и записи. Подчиненные шаги могут неожиданно изменять значения переменных.
Например, рассмотрим следующий фрагмент скрипта:
msbuild.exe myproj.proj -property:Configuration=$(MyConfig)
Если предыдущий шаг устанавливает MyConfig
в Debug & deltree /y c:
, это может привести к непредвиденным последствиям. Хотя этот пример просто удаляет содержимое агента сборки, он подчеркивает потенциальную опасность, связанную с такими настройками.
Переменные можно сделать только для чтения.
Системные переменные, такие как Build.SourcesDirectory
, выходные переменные задачи и переменные времени очереди всегда доступны только для чтения.
Переменные, созданные в YAML или созданные во время выполнения скриптом, могут быть назначены только для чтения.
Когда скрипт или задача создают новую переменную, она может передать isReadonly=true
флаг в своей команде ведения журнала, чтобы сделать переменную доступной только для чтения.
В YAML можно указать переменные, доступные только для чтения, с помощью следующего ключа:
variables:
- name: myReadOnlyVar
value: myValue
readonly: true
Используйте осторожность с секретными переменными. Рекомендуемые методы настройки секретных переменных включают использование пользовательского интерфейса, создание группы переменных или использование группы переменных, исходной из Azure Key Vault. Дополнительные сведения см. в разделе Задание секретных переменных.
Переменные времени очереди
При определении переменной в редакторе пользовательского интерфейса Pipelines пользователи могут переопределить его значение во время выполнения конвейера. Эти переменные называются переменными времени ожидания и всегда определяются в редакторе пользовательского интерфейса Pipelines.
Переменные времени очереди предоставляются конечному пользователю при выполнении конвейера вручную, и они могут изменить свои значения.
Пользователям требуется разрешение на изменение конфигурации сборки очереди в конвейере, чтобы указать переменные, заданные при постановке в очередь.
Ограничить переменные, которые можно задать во время ожидания
Пользовательский интерфейс и REST API, используемые для запуска конвейера, позволяют пользователям определять новые переменные во время очереди.
В ранние дни Azure Pipelines эта функция имела следующие проблемы:
- Он позволил пользователям определять новые переменные, которые еще не определены автором конвейера в определении.
- Это позволяло пользователям переопределять системные переменные.
Для решения этих проблем мы определили настройку, ограничивающую переменные, которые можно задать во время очереди. Если эта настройка включена, можно задать только те переменные, которые явно помечены как устанавливаемые во время очереди. Другими словами, можно задать любые переменные во время очереди, если этот параметр не включен.
Этот параметр предназначен для работы на уровнях системы организации и проекта.
-
Уровень организации:
- Если параметр включен, это утверждает, что только переменные, явно помеченные как устанавливаемые во время очереди, могут быть изменены для всех конвейеров во всех проектах в организации.
- Администраторы коллекции проектов могут включить или отключить этот параметр.
- Получите доступ к этому параметру в разделе "Параметры конвейеров>> организации".
-
Уровень проекта:
- Как и на уровне организации, включение этого параметра гарантирует, что для всех конвейеров в определенном проекте можно изменить только переменные, помеченные как Settable во время очереди.
- Если параметр уровня организации включен, он применяется ко всем проектам и не может быть отключен.
- Администраторы проектов могут включить или отключить этот параметр.
- Получите доступ к этому параметру в разделе "Параметры конвейеров>>
В следующем примере показано, что параметр включен, и конвейер определяет переменную с именем my_variable
, которая не задана во время очереди.
Затем предположим, что вы хотите запустить конвейер. На панели "Переменные" не отображаются переменные , а кнопка "Добавить переменную " отсутствует.
Использование вызовов REST API Builds - Queue и Runs - Run Pipeline для постановки в очередь выполнения конвейера и задания значения для новой переменной 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
, и они могут быть ограничены определенными подмножествами значений. Это ограничение полезно, если настраиваемый пользователем аспект конвейера должен принимать только значения из предопределенного списка, гарантируя, что конвейер не принимает произвольные данные.
Включение проверки параметров аргументов задач оболочки
Потоки данных могут ссылаться на задачи, выполняемые внутри потока. Некоторые задачи включают arguments
параметр, позволяющий указать дополнительные параметры для задачи.
Если включена настройка Проверка аргументов задач оболочки, параметр аргументов проходит проверку, чтобы убедиться, что оболочка правильно обрабатывает такие символы, как точка с запятой, кавычки и скобки. Подобно опции "Ограничить переменные, которые можно задать в момент постановки в очередь", вы можете настроить включение проверки аргументов параметров задач оболочки на уровне организации или проекта в разделе Настройки>Конвейеры>Настройки.
Если эта функция включена, все проблемы проверки, связанные с 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