Безопасный доступ к Azure Repos из конвейеров

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

В этой статье показано, как повысить безопасность конвейеров, обращаюющихся к Azure Repos, чтобы ограничить риск попадания исходного кода в неправильные руки.

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

Мы рассмотрим как конвейеры сборки, так и классические конвейеры выпуска:

Базовый процесс

Шаги аналогичны всем конвейерам:

  1. Определите список репозиториев Azure Repos, к которым требуется доступ к конвейеру, которые являются частью одной организации, но находятся в разных проектах.

    Список репозиториев можно скомпилировать, проверив конвейер. Кроме того, вы можете включить авторизацию задания limit область в текущий проект для конвейеров выпуска (не)выпусков, а также заметить, какие репозитории конвейера не проверка. Репозитории подмодулы могут не отображаться в первом сбое выполнения.

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

  3. Для каждого репозитория Azure Repos, проверка конвейера, выполните действия, чтобы предоставить удостоверению сборки конвейера доступ на чтение этого репозитория.

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

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

Конвейеры сборки

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

Предположим, что вы работаете над конвейером SpaceGameWeb , размещенным в fabrikam-tailspin/SpaceGameWeb проекте, в SpaceGameWeb репозитории Azure Repos. Кроме того, предположимSpaceGameWeb, что конвейер проверка из SpaceGameWebReact репозитория в том же проекте, а FabrikamFiberFabrikamChat также репозитории в fabrikam-tailspin/FabrikamFiber проекте.

Наконец, предположим FabrikamFiber , что репозиторий использует FabrikamFiberLib репозиторий в качестве подмодула, размещенного в том же проекте. Дополнительные сведения о том, как проверка вне подмодул.

Структуры SpaceGameWeb репозитория проекта выглядят как на следующем снимке экрана.

Screenshot of the SpaceGameWeb repository structure.

Структуры FabrikamFiber репозитория проекта выглядят как на следующем снимке экрана.

Screenshot of the FabrikamFiber repository structure.

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

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

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

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

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

В нашем примере, когда этот переключатель отключен, SpaceGameWeb конвейер может получить доступ ко всем репозиториям во всех проектах. Если переключатель включен, SpaceGameWeb доступ к ресурсам в fabrikam-tailspin/SpaceGameWeb проекте может получить доступ только к ресурсам, поэтому только SpaceGameWeb репозитории и SpaceGameWebReact репозитории.

Если запустить наш пример конвейера, при включении переключателя конвейер завершится ошибкой, а журналы ошибок будут сообщать вам remote: TF401019: The Git repository with name or identifier FabrikamChat does not exist or you do not have permissions for the operation you are attempting. и remote: TF401019: The Git repository with name or identifier FabrikamFiber does not exist or you do not have permissions for the operation you are attempting.

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

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

Если вы запускаете наш пример конвейера, он будет выполнен успешно.

Дальнейшая конфигурация

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

Предположим, что SpaceGameWeb конвейер является конвейером YAML, и его исходный код YAML выглядит примерно так, как показано в следующем коде.

trigger:
- main

pool:
  vmImage: ubuntu-latest

resources:
  repositories:
    - repository: SpaceGameWebReact
      name: SpaceGameWeb/SpaceGameWebReact
      type: git
    - repository: FabrikamFiber
      name: FabrikamFiber/FabrikamFiber
      type: git
    - repository: FabrikamChat
      name: FabrikamFiber/FabrikamChat
      type: git

steps:
  - script: echo "Building SpaceGameWeb"
  - checkout: SpaceGameWebReact
  - checkout: FabrikamChat
    condition: always()  
  - checkout: FabrikamFiber
    submodules: true
    condition: always()
  - script: |
      cd FabrikamFiber
      git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" submodule update --recursive --remote
  - script: cat $(Build.Repository.LocalPath)/FabrikamFiber/FabrikamFiberLib/README.md
  - ...

Защита доступа к репозиториям в конвейерах YAML

Azure DevOps предоставляет подробный механизм разрешений для репозиториев Azure Repos в виде защиты доступа к репозиториям YAML в параметрах конвейеров YAML. Этот параметр делает конвейер YAML явным образом запрашивать разрешение на доступ ко всем репозиториям Azure Repos, независимо от того, какой проект они принадлежат. Дополнительные сведения об этом параметре. Извлечение других типов репозиториев, например размещенных в GitHub, не влияет на этот параметр.

В нашем работающем примере, когда этот переключатель включен, SpaceGameWeb конвейер запросит разрешение на доступ к SpaceGameWebReact репозиторию в fabrikam-tailspin/SpaceGameWeb проекте, а также FabrikamFiberFabrikamChat репозитории в fabrikam-tailspin/FabrikamFiber проекте.

При запуске примера конвейера вы увидите сборку, аналогичную следующему снимку экрана. Screenshot of running the SpaceGameWeb pipeline the first time after turning on the Protect access to repositories in YAML pipelines toggle.

Вам будет предложено предоставить разрешение репозиториям, проверка конвейера или определить как ресурсы. Screenshot of being asked to grant permission to the SpaceGameWeb pipeline to access three repositories.

После выполнения конвейера произойдет сбой, так как он не сможет проверка из FabrikamFiberLib репозитория как подмодулFabrikamFiber. Чтобы решить эту проблему, явно проверка егоFabrikamFiberLib, например, добавьте - checkout: git://FabrikamFiber/FabrikamFiberLib шаг перед -checkout: FabrikamFiber шагом.

Если вы запускаете пример конвейера, он будет выполнен успешно.

Окончательный исходный код конвейера YAML выглядит следующим фрагментом кода.

trigger:
- main

pool:
  vmImage: ubuntu-latest

resources:
  repositories:
    - repository: SpaceGameWebReact
      name: SpaceGameWeb/SpaceGameWebReact
      type: git
    - repository: FabrikamFiber
      name: FabrikamFiber/FabrikamFiber
      type: git
    - repository: FabrikamChat
      name: FabrikamFiber/FabrikamChat
      type: git

steps:
  - script: echo "Building SpaceGameWeb"
  - checkout: SpaceGameWebReact
  - checkout: FabrikamChat
    condition: always()  
  - checkout: git://FabrikamFiber/FabrikamFiberLib  
  - checkout: FabrikamFiber
    submodules: true
    condition: always()
  - script: |
      cd FabrikamFiber
      git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" submodule update --recursive --remote
  - script: cat $(Build.Repository.LocalPath)/FabrikamFiber/FabrikamFiberLib/README.md

Устранение неполадок

Вот несколько проблемных ситуаций и способы их обработки.

Вы используете git в командной строке для проверка репозиториев в той же организации

Например, вы используете - script: git clone https://$(System.AccessToken)@dev.azure.com/fabrikam-tailspin/FabrikamFiber/_git/OtherRepo/. Команда завершится ошибкой, когда включен переключатель "Защита доступа к репозиториям" в конвейерах YAML.

Чтобы решить проблему, проверка из OtherRepo репозитория с помощью checkout команды, например- checkout: git://FabrikamFiber/OtherRepo.

Репозиторий использует другой репозиторий в качестве подмодулы

Предположим, что один из репозиториев конвейера проверка использует другой репозиторий (в том же проекте), что и подмодул, как в нашем примере для FabrikamFiber репозиториев и FabrikamFiberLib репозиториев. Дополнительные сведения о том, как проверка вне подмодул.

Кроме того, предположим, что вы предоставили SpaceGame удостоверению сборки доступ на чтение этого репозитория, но проверка из FabrikamFiber репозитория по-прежнему завершается ошибкой при проверка выходе FabrikamFiberLib из подмодулы.

Чтобы решить эту проблему, явно проверка, FabrikamFiberLibнапример, добавьте - checkout: git://FabrikamFiber/FabrikamFiberLib шаг перед -checkout: FabrikamFiber этим.

Классические конвейеры выпуска

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

Чтобы проиллюстрировать необходимые действия, мы будем использовать работающий пример. В нашем примере в проекте есть конвейер FabrikamFiberDocReleasefabrikam-tailspin/FabrikamFiberDocRelease выпуска. Предположим, что конвейер проверка из FabrikamFiber репозитория в fabrikam-tailspin/FabrikamFiber проекте, выполняет команду для создания общедоступной документации, а затем публикует его на веб-сайте. Кроме того, представьте, что FabrikamFiber репозиторий использует FabrikamFiberLib репозиторий (в том же проекте) как подмодул

Использование удостоверения сборки на основе проекта для классических конвейеров выпуска

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

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

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

В нашем примере, когда этот переключатель отключен, FabrikamFiberDocRelease конвейер выпуска может получить доступ ко всем репозиториям во всех проектах, включая FabrikamFiber репозиторий. Если переключатель включен, FabrikamFiberDocRelease доступ к ресурсам в fabrikam-tailspin/FabrikamFiberDocRelease проекте может быть доступен только для доступа, поэтому FabrikamFiber репозиторий становится недоступным.

Если вы запускаете наш пример конвейера, при включении переключателя конвейер завершится сбоем, а журналы будут сообщать вам. remote: TF401019: The Git repository with name or identifier FabrikamFiber does not exist or you do not have permissions for the operation you are attempting.

Чтобы устранить эти проблемы, выполните действия, описанные в разделе "Базовый".

Если вы запускаете наш пример конвейера, он будет выполнен успешно.

См. также