Доступ к Azure DevOps с помощью учетной записи рабочей нагрузки Microsoft Entra

Службы Azure DevOps

Замечание

Эта функция развертывается на этой и следующей неделе. Если вы еще не видите эту функцию в проекте служб Azure DevOps, вернитесь обратно через несколько дней.

Подключение службы Azure DevOps позволяет конвейерам проходить аутентификацию в Azure DevOps без использования личных токенов доступа (PATs) через рабочие удостоверения Microsoft Entra. Субъекты-службы и управляемые удостоверения обращаются к Azure DevOps через федерацию удостоверений рабочего процесса, которая устраняет необходимость в управлении и смене секретов.

Преимущества

  • Аутентификация без PAT: устранение необходимости создавать, хранить и выполнять ротацию личных маркеров доступа.
  • Наименьшие привилегии: используйте разрешения для каждого конвейера вместо общих разрешений учетной записи службы сборки.
  • Улучшенная безопасность: Используйте федеративные учетные данные Entra с автоматической сменой токенов.
  • Кросс-организационный доступ: доступ к ресурсам Azure DevOps в разных организациях с помощью одного подключения к службе.
  • Audit trail: все попытки проверки подлинности регистрируются в журналах аудита Azure DevOps.

Поддерживаемые сценарии

Подключение службы Azure DevOps поддерживает следующие сценарии:

  • Ресурсы репозитория: ознакомьтесь с кодом из репозиториев в организациях Azure DevOps.
  • Artifact feeds: Доступ к веб-каналам Azure Artifacts (NuGet, npm, Maven, Python, Cargo, Conda) между организациями без paTs.
  • Вызовы API REST: аутентификация к REST API Azure DevOps из встроенных скриптов.
  • Extension publishing: публикация расширений в Visual Studio Marketplace.

Необходимые условия

Чтобы создать подключение службы Azure DevOps, вам потребуется:

Шаг 1. Создание подключения к службе в одной организации

Если ваш служебный принципал находится в той же организации Azure DevOps, что и подключение к службе:

Добавьте субъект-службу в вашу организацию

  1. В организации Azure DevOps перейдите в раздел Организация параметров>Users.

  2. Выберите "Добавить пользователей".

  3. Введите сведения об учетной записи службы:

    • Имя: основной службы или имя управляемой идентичности или идентификатор объекта
    • Уровень доступа: выберите соответствующий уровень доступа. Использование "Базовый" для стандартного доступа
  4. Назначьте служебный принципал или управляемое удостоверение проекту, где вы создадите подключение к службе, например, добавив его в группу Читатели.

  5. Нажмите кнопку "Добавить ", чтобы подтвердить.

  6. Назначьте любые дополнительные разрешения уровня ресурса для субъектов-служб или управляемых удостоверений.

Шаг 2. Создание подключения к службе

  1. В Azure DevOps project перейдите к Project settings>Service connections.

  2. Выберите новое подключение к службе.

  3. Выберите Azure DevOps в качестве типа подключения службы.

  4. Заполните форму:

    • Удостоверение: Выберите служебный принципал, добавленный в организацию
    • Имя подключения службы: введите описательное имя подключения (например, my-azdo-connection)
    • Описание (необязательно): добавление сведений о назначении подключения
  5. Нажмите кнопку "Сохранить", чтобы создать подключение службы.

Создание подключения службы для доступа между организациями

Чтобы получить доступ к ресурсам в организации Azure DevOps, присоединенной к тому же клиенту Azure Entra ID:

  1. Выполните действия, описанные в разделе "Создание подключения к службе" в одной организации, но выберите другую организацию при создании подключения к службе.

  2. Введите имя целевой Azure DevOps организации.

  3. Необходимо также добавить субъект-службу в качестве пользователя в целевой организации.

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

Ознакомьтесь с репозиториями из разных организаций

pool:
  vmImage: 'ubuntu-latest'

resources:
  repositories:
  - repository: external-repo
    type: git
    endpoint: my-azdo-connection
    name: 'external-project/external-repo'
    ref: 'refs/heads/main'

steps:
- checkout: self
- checkout: external-repo

Ссылка на шаблон из другой организации

resources:
  repositories:
    - repository: templates 
      type: git
      endpoint: my-azdo-connection
      name: 'external-project/external-repo'
      ref: "refs/heads/main"    
      
steps:
- template: azdosc-template.yml@templates

Доступ к потокам артефактов

Используйте подключение службы для задач аутентификации артефактов:

- task: NuGetAuthenticate@1
  inputs:
    nuGetServiceConnections: 'my-azdo-connection'

- task: DotNetCoreCLI@2
  inputs:
    command: 'restore'
    projects: '**/*.csproj'

Вызов Azure DevOps из скрипта

- task: AzureCLI@3
  displayName: Secret-less
  inputs:
    connectionType: 'azureDevOps'
    azureDevOpsServiceConnection: 'my-azdo-connection'
    scriptType: 'pscore'
    scriptLocation: 'inlineScript'
    inlineScript: |
      az rest --method get `
              --url "https://status.dev.azure.com/_apis/status/health?api-version=7.1-preview.1" `
              --resource 499b84ac-1321-427f-aa17-267ca6975798 `
              --query "sort_by(services[?id=='Pipelines'].geographies | [], &name)" `
              -o table

      az devops configure -l

      az devops project list --query "value[].{Name:name, Id:id}" `
                            -o table

      az pipelines pool list --query "[].{Id:id, Name:name}" `
                            -o table

- task: AzureCLI@3
  displayName: Use Entra access token
  inputs:
    connectionType: 'azureDevOps'
    azureDevOpsServiceConnection: 'my-azdo-connection'
    scriptType: 'pscore'
    scriptLocation: 'inlineScript'
    inlineScript: |
      # Get access token for Azure DevOps
      $token = az account get-access-token --resource "499b84ac-1321-427f-aa17-267ca6975798" `
                                           --query "accessToken" `
                                           --output tsv
      
      # Use token in REST API call
      $headers = @{
        Authorization = "Bearer $token"
        "Content-Type" = "application/json"
      }
      
      $body = @{
        name = "Test Build"
      } | ConvertTo-Json
      
      Invoke-RestMethod -Uri "$(System.CollectionUri)$(System.TeamProject)/_apis/build/definitions?api-version=7.1" `
                        -Method POST `
                        -Headers $headers `
                        -Body $body

Задача AzureCLI@3 использует интерфейс командной строки Azure DevOps, который предварительно установлен для агентов, размещенных в Microsoft. Для локально размещенных агентов требуется Azure CLI с azure-devops расширением. azure-devops Если расширение не установлено, задача AzureCLI@3 устанавливает его во время выполнения.

Лучшие практики обеспечения безопасности

  • Минимальные разрешения. Назначьте субъекту-службе только необходимые разрешения для конкретных задач конвейера.
  • Доступ к аудиту: регулярно просматривайте журналы аудита для мониторинга использования подключения к службе.
  • Область применения: Используйте отдельные подключения к службам для разных проектов или организаций, чтобы ограничить общие разрешения.

Troubleshooting

Подсказка

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

Ошибка создания подключения службы

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

Исправление:

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

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

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

Исправление:

Доступ между организациями не работает

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

Исправление:

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

Распространенные сообщения об ошибках

Message Значение и устранение рисков
ОШИБКА: TF401444: выполните вход по крайней мере один раз как 72f988bf-86f1-41af-91ab-2d7cd011db47\72f988bf-86f1-41af-91ab-2d7cd011db47\115c3ab3-943b-4e0c-96ed-1a1763fbaa44 в веб-браузере, чтобы включить доступ к службе. Убедитесь, что вы добавили учетную запись службы в качестве пользователя в вашу организацию.
Управляемая идентификация или принципал службы <sp/msi name> не имеет доступа к организации Azure DevOps <org>. Убедитесь, что учетная запись добавлена в организацию. См. https://aka.ms/azdosc#prerequisites Добавьте учетную запись службы в качестве пользователя целевой организации и назначьте его требуемому проекту.
У вас нет разрешения на выбранный идентификатор. Подключение службы сохраняется в виде черновика. Чтобы завершить настройку, свяжитесь с владельцем идентичности, чтобы создать федеративные учетные данные в портале Azure с использованием издателя и идентификатора субъекта, указанных ниже. У пользователя, вошедшего в систему, недостаточно разрешений для создания федеративных учетных данных. Следуйте инструкциям, отображаемым для создания федеративных учетных данных непосредственно в удостоверении.
VS800075. Проект с идентификатором "vstfs:///Classification/TeamProject/00000000-0000-00000000-000000000000" не существует или у вас нет разрешения на доступ к нему. Идентификатор подключения услуги не добавлен в проект. Перейдите на страницу сведений о подключении к службе, чтобы просмотреть доступ в текущей организации . Выберите группу, чтобы добавить удостоверение, например, в группу . Кроме того, перейдите в раздел "Параметры организации">"Пользователи", используйте удостоверение для подключения к службе, чтобы >>, и выберите проекты, к которым оно должно иметь доступ.

сообщения об ошибках Microsoft Entra ID

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

Message Возможная проблема
AADSTS700016: приложение с идентификатором "****" не найдено Учетная запись, используемая для подключения к службе, больше не существует, могла быть удалена, или настроена неправильно. Если вы настраиваете подключение службы вручную с предварительно созданным удостоверением, убедитесь, что appID/clientId настроено правильно.
AADSTS7000215: указан недействительный секрет клиента. Вы используете подключение к службе с истекшим сроком действия секрета. Преобразуйте подключение службы в федерацию удостоверений рабочей нагрузки и замените истекший секрет учетными данными федерации.
AADSTS700024. Утверждение клиента не вписывается в допустимый временной интервал Если ошибка возникает примерно через 1 час, используйте подключение к сервису с федерацией удостоверений рабочей нагрузки и управляемыми удостоверениями. Токены управляемой идентификации имеют время существования около 24 часов.
Если ошибка возникает менее чем через 1 час, но более чем через 10 минут, переместите команды, которые (неявно) запрашивают токен доступа (например, для доступа к хранилищу Azure), в начало вашего скрипта. Маркер доступа кэшируется для последующих команд.
Для представленного утверждения не найдена соответствующая запись федеративной идентичности. Издатель утверждения: https://app.vstoken.visualstudio.com. Федеративные учетные данные не были созданы или URL-адрес издателя не является правильным. Правильный URL-адрес издателя имеет формат https://login.microsoftonline.com/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. URL издателя можно исправить, изменив его и сохранив подключение к службе. Если Azure DevOps не создал ваше удостоверение личности, необходимо вручную обновить издателя. Вы можете найти правильного издателя в диалоговом окне редактирования подключения к службе или в ответе, если вы используете REST API.
Для представленного утверждения не найдена соответствующая запись федеративной идентичности. Издатель утверждения: https://login.microsoftonline.com/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Тема утверждения: sc://<org>/<project>/<service-connection>. URL-адрес издателя или тема федерации не совпадают. Организация или проект Azure DevOps были переименованы, или вручную созданное подключение службы было переименовано без обновления темы федерации на удостоверении.
AADSTS700211: не найдена соответствующая федеративная запись данных удостоверения для представленного эмитента утверждения Федеративные учетные данные не были созданы или URL-адрес издателя не является правильным.
AADSTS700213: не найдена соответствующая федеративная запись идентичности для представленного субъекта утверждения Федеральные учетные данные не были созданы или субъект указан неверно.
AADSTS700223 Федерация удостоверений рабочей нагрузки ограничена или отключена в клиенте Microsoft Entra. В этом сценарии можно использовать управляемое удостоверение для федерации. Для получения дополнительной информации см. Идентификация рабочих нагрузок с управляемой идентификацией.
AADSTS70025. Клиент не имеет настроенных удостоверений федеративной идентификации Убедитесь, что федеративные учетные данные правильно настроены для регистрации приложения или управляемой идентичности.
Microsoft Entra отклонил токен, выданный Azure DevOps с кодом ошибки AADSTS700238 Федерация удостоверений рабочей нагрузки ограничена клиентом Microsoft Entra. Издатель вашей организации (https://login.microsoftonline.com/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) не может использовать федерацию удостоверений рабочей нагрузки с типом удостоверения рабочей нагрузки (регистрация приложения и /или управляемое удостоверение), которое вы используете. Попросите администратора клиента Microsoft Entra или административную команду разрешить федерацию удостоверений для рабочих нагрузок в вашей организации Azure DevOps.
AADSTS70052. Удостоверение должно быть управляемым удостоверением, однопользовательским приложением или учетной записью службы. Многотенантные регистрации приложений с signInAudience: AzureADMultipleOrgs в настоящее время не поддерживаются издателем Microsoft Entra. Вместо этого используйте signInAudience: AzureADMyOrg и разделите доступ к нескольким арендаторам, чтобы для каждого арендатора использовать разные подключения к службам. Если вы зависите от операций ARM, которые обращаются к нескольким клиентам в одном запросе (например, межклиентское пиринг виртуальных сетей), вы можете обратиться в службу поддержки, чтобы ваша организация Azure DevOps использовала эмитент Azure DevOps.
AADSTS900382: конфиденциальный клиент не поддерживается в Кросс-облаке Некоторые независимые облака блокируют федерацию удостоверений рабочей нагрузки.

Вы видите ошибку AADSTS, которая не указана выше? Проверьте коды ошибок проверки подлинности и авторизации Microsoft Entra.

Дальнейшие действия