Безопасный доступ к Azure Repos из конвейеров
Репозитории являются критически важным ресурсом для успешного бизнеса, так как они содержат код, который управляет вашим бизнесом. Доступ к репозиториям не должен быть предоставлен легко.
В этой статье показано, как повысить безопасность конвейеров, обращаюющихся к Azure Repos, чтобы ограничить риск попадания исходного кода в неправильные руки.
В конфигурации конвейеров для безопасного доступа к репозиториям Azure включены переключатели Ограничить область авторизации задания текущим проектом для конвейеров без выпуска, Ограничить область авторизации задания текущим проектом для конвейеров выпуска и Защитить доступ к репозиториям в конвейерах YAML.
Мы рассмотрим как конвейеры сборки, так и классические конвейеры выпуска:
Базовый процесс
Шаги аналогичны всем конвейерам:
Определите список репозиториев Azure Repos, к которым требуется доступ к конвейеру, которые являются частью одной организации, но находятся в разных проектах.
Список репозиториев можно скомпилировать, проверив конвейер. Кроме того, вы можете включить авторизацию задания limit область в текущий проект для конвейеров выпуска (не)выпусков, а также заметить, какие репозитории конвейера не проверка. Репозитории подмодулы могут не отображаться в первом сбое выполнения.
Для каждого проекта Azure DevOps, содержащего репозиторий, к которому необходим доступ конвейера, выполните действия, чтобы предоставить удостоверению сборки конвейера доступ к этому проекту.
Для каждого репозитория Azure Repos, проверка конвейера, выполните действия, чтобы предоставить удостоверению сборки конвейера доступ на чтение этого репозитория.
Для каждого репозитория, который используется в качестве подмодулы репозиторием, проверка конвейера выходит и находится в одном проекте, выполните действия, чтобы предоставить удостоверению сборки конвейера доступ на чтение этого репозитория.
Включите область авторизации задания ограничения на текущий проект для конвейеров, отличных от выпуска, ограничение авторизации задания область текущим проектом для конвейеров выпуска и защита доступа к репозиториям в конвейерах YAML.
Конвейеры сборки
Чтобы проиллюстрировать действия по повышению безопасности конвейеров при доступе к Azure Repos, мы будем использовать работающий пример.
Предположим, что вы работаете над конвейером SpaceGameWeb
, размещенным в fabrikam-tailspin/SpaceGameWeb
проекте, в SpaceGameWeb
репозитории Azure Repos. Кроме того, предположимSpaceGameWeb
, что конвейер проверка из SpaceGameWebReact
репозитория в том же проекте, а FabrikamFiber
FabrikamChat
также репозитории в fabrikam-tailspin/FabrikamFiber
проекте.
Наконец, предположим FabrikamFiber
, что репозиторий использует FabrikamFiberLib
репозиторий в качестве подмодула, размещенного в том же проекте. Дополнительные сведения о том, как проверка вне подмодул.
Структуры SpaceGameWeb
репозитория проекта выглядят как на следующем снимке экрана.
Структуры FabrikamFiber
репозитория проекта выглядят как на следующем снимке экрана.
Представьте, что проект не настроен для использования удостоверения сборки на основе проекта или защиты доступа к репозиториям в конвейерах 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
проекте, а также FabrikamFiber
FabrikamChat
репозитории в fabrikam-tailspin/FabrikamFiber
проекте.
При запуске примера конвейера вы увидите сборку, аналогичную следующему снимку экрана.
Вам будет предложено предоставить разрешение репозиториям, проверка конвейера или определить как ресурсы.
После выполнения конвейера произойдет сбой, так как он не сможет проверка из 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
этим.
Классические конвейеры выпуска
Процесс защиты доступа к репозиториям для конвейеров выпуска аналогичен тому, который предназначен для конвейеров сборки.
Чтобы проиллюстрировать необходимые действия, мы будем использовать работающий пример. В нашем примере в проекте есть конвейер FabrikamFiberDocRelease
fabrikam-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.
Чтобы устранить эти проблемы, выполните действия, описанные в разделе "Базовый".
Если вы запускаете наш пример конвейера, он будет выполнен успешно.