Конфиденциальные данные в Azure Pipelines

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

В этой статье приведены рекомендации по защите секретов в Azure Pipelines. Секрет — это то, к чему необходимо строго контролировать доступ, например ключи API, пароли или криптографические ключи. Azure Pipelines не создает значения секретов, но вам может понадобиться добавить секреты в конвейеры для хранения конфиденциальных данных, таких как ключи API.

Эта статья является частью серии, которая помогает реализовать меры безопасности для Azure Pipelines. Дополнительные сведения см. в статье "Защита Azure Pipelines".

Предпосылки

Категория Требования
Azure DevOps — Реализуйте рекомендации, приведенные в "Обеспечьте безопасность Azure DevOps" и "Защита Azure Pipelines".
— Базовые знания о YAML и Azure Pipelines. Дополнительные сведения см. в статье "Создание первого конвейера".
Разрешения — Чтобы изменить разрешения конвейеров: член группы "Администраторы проектов".
— Чтобы изменить разрешения организации: необходимо быть членом группы администраторов коллекции проектов.

Использование другого метода

Секреты представляют собой встроенные риски безопасности, поэтому лучше не использовать их вообще. Вместо того чтобы управлять секретами в переменных или предоставлять их в конфигурации конвейера, проверьте, может ли конвейер использовать один из этих других методов для выполнения задачи.

Для получения дополнительной информации см. Использование субъектов-служб и управляемых удостоверений.

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

Никогда не сохраняйте конфиденциальные значения в виде обычного текста в файле azure-pipelines.yml . Вы можете использовать секретные переменные для конфиденциальной информации, такой как пароли, идентификаторы и другие идентифицирующие данные, которые вы не хотите раскрывать. Секретные переменные шифруются, поэтому их можно использовать в конвейерах без предоставления их значений.

  • Лучше всего безопасно управлять секретными переменными в Azure Key Vault. Можно также задать секретные переменные в пользовательском интерфейсе определения конвейера или в группе переменных.
  • Не используйте команду ведения журнала для задания секретной переменной, так как любой пользователь, который может получить доступ к конвейеру, также может увидеть секрет.
  • Никогда не повторяйте секреты в качестве выходных данных и не передавайте секреты в командной строке. Вместо этого лучше сопоставить секреты с переменными среды.
  • При создании секрета следуйте рекомендациям по именованию переменных и убедитесь, что имя секрета не раскрывает конфиденциальную информацию.

Дополнительные сведения о настройке секретов в переменных см. в разделе "Задание секретных переменных".

Ограничение доступа к секретным переменным

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

  • Храните секреты в Azure Key Vault. С помощью Azure Key Vault можно использовать управление доступом на основе ролей Azure, чтобы ограничить доступ к секрету или группе секретов.
  • Задайте секретные переменные в пользовательском интерфейсе конвейера. Эти переменные относятся к конвейеру, в котором они заданы, поэтому они видны только пользователям этого конвейера.
  • Задайте секреты в группах переменных. Группы переменных следуют модели безопасности библиотеки, что позволяет управлять тем, кто может получить доступ к элементам или создавать их.

Не записывайте секреты в журналы

Azure Pipelines пытается удалять секреты из логов, насколько это возможно, но не является безупречным. Избегайте повторения секретов в консоли, используя их в параметрах командной строки или регистрируя их в файлах.

Будьте осторожны при использовании команд Azure CLI, которые выводят конфиденциальную информацию. Используйте формат выходных данных None и, если необходимо получить секрет из вызова Azure CLI, получите сведения о безопасности из секретной переменной.

Не используйте структурированные данные в качестве секретов

Избегайте использования структурированных форматов данных, таких как JSON, XML или YAML, для инкапсуляции секретных значений, включая символы управления, такие как возврат каретки \r и перевод строки \n. Вместо этого создайте отдельные секреты для каждого конфиденциального значения. Такой подход обеспечивает более высокую точность редактирования и снижает риск непреднамеренного предоставления конфиденциальных данных.

Использование аудиторского секрета

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

  • Изучите исходный код репозитория, на котором размещен конвейер. Чтобы убедиться, что секреты обрабатываются правильно, проверьте все задачи, используемые конвейером. Убедитесь, что секреты не отправляются на непредназначенные хосты или случайно не печатаются в выходные данные журнала.

  • После тестирования допустимых и недопустимых входных данных просмотрите журналы выполнения для конвейера. Убедитесь, что секреты правильно редактируются и не предоставляются. Иногда ошибки в командах или средствах могут случайно утечки секретов в журналы ошибок. Хотя Azure Pipelines пытается скрутировать секреты из журналов, проверка вручную по-прежнему важна.

Аудит и смена секретов

Чтобы выполнить аудит и смену секретов, выполните следующие рекомендации.

  • Периодически просматривайте секреты, зарегистрированные в конвейерах. Убедитесь, что они все еще необходимы и удалите все, что больше не требуется. Эта практика помогает снизить нагрузку и потенциальные риски безопасности.
  • Обеспечьте правильную настройку и безопасную обработку секретов подключения службы.
  • Оставьте срок действия личного маркера доступа (PAT) коротким и выберите необходимые минимальные разрешения.
  • Регулярно поворачивайте секреты, чтобы свести к минимуму время использования скомпрометированного секрета. Периодические изменения секретов повышают безопасность.

Использование шаблонов YAML

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

Чтобы реализовать этот подход, создайте отдельный файл YAML для скрипта и сохраните этот скрипт в отдельном безопасном репозитории. Затем можно ссылаться на шаблон и передавать секретную переменную из Azure Key Vault, группы переменных или пользовательского интерфейса конвейера в YAML в качестве параметра. Дополнительные сведения об использовании шаблонов см. в справочнике по использованию шаблона.

Ограничение секретов с помощью политик ветви и разрешений группы переменных

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

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

jobs:
- job: ExampleJob
  condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
  pool:
    vmImage: 'ubuntu-latest'
  steps:
  - script: echo "This runs only for the main branch"
    displayName: 'Conditional Step'
  variables:
  - group: your-variable-group-name