Acceso a Azure DevOps con la identidad de carga de trabajo de Microsoft Entra

Azure DevOps Services

Nota:

Esta característica se está implementando esta semana y la próxima. Si aún no ve la característica en el proyecto de Azure DevOps Services, vuelva a comprobar en unos días.

Una conexión de servicio de Azure DevOps permite que las canalizaciones se autentiquen en Azure DevOps sin tokens de acceso personal (PAT) mediante las identidades de carga de trabajo de Microsoft Entra. Entidades de servicio e identidades administradas acceden a Azure DevOps a través de federación de identidades de carga de trabajo, un método sin secreto que elimina la necesidad de administrar y rotar secretos.

Beneficios

  • Autenticación sin PAT: elimine la necesidad de crear, almacenar y rotar tokens de acceso personal.
  • Privilegios mínimos: Use permisos por tubería en lugar de permisos compartidos de cuenta de servicio de compilación.
  • Seguridad mejorada: use credenciales federadas de Entra con rotación automática de tokens.
  • Acceso entre organizaciones: Acceda a los recursos de Azure DevOps en diferentes organizaciones mediante una única conexión de servicio única.
  • Audit trail: todos los intentos de autenticación se registran en los registros de auditoría de Azure DevOps.

Escenarios compatibles

La conexión de servicio Azure DevOps admite estos escenarios:

  • Repository resources: Consulte el código de repositorios de diferentes organizaciones Azure DevOps.
  • Flujos de artefactos: Acceda a los flujos de Azure Artifacts (NuGet, npm, Maven, Python, Cargo, Conda) en todas las organizaciones sin necesidad de tokens de acceso personal (PAT).
  • Llamadas a la API REST: Autenticarse en las APIs REST de Azure DevOps desde scripts insertados.
  • Extension publishing: Publicar extensiones en Visual Studio Marketplace.

Prerrequisitos

Para crear una conexión de servicio Azure DevOps, necesita:

  • Una organización de Azure DevOps
  • Una entidad de servicio de Entra o una identidad administrada que se utilizará para la autenticación
  • Creator o Administrator rol para las conexiones de servicio en el proyecto de Azure DevOps donde se crea la conexión de servicio. De forma predeterminada, los miembros del grupo Creadores de Endpoints tienen el rol Creador. Para más información, consulte Establecimiento de la seguridad de la conexión de servicio.
  • Al acceder a recursos entre organizaciones, la entidad de servicio o la identidad administrada debe añadirse como usuario a cada organización de destino.

Paso 1: Crear una conexión de servicio dentro de la misma organización

Si el principal de servicio está en la misma organización de Azure DevOps que la conexión de servicio:

Agregue la entidad de servicio a su organización

  1. En la organización de Azure DevOps, vaya a Configuración de organización>Usuarios.

  2. Seleccione Agregar usuarios.

  3. Escriba los detalles de la entidad de servicio:

    • Nombre: el nombre de la entidad de servicio o de la identidad administrada, o el identificador de objeto
    • Nivel de acceso: seleccione el nivel de acceso adecuado. Usar Básico para acceso estándar
  4. Asigna la entidad de servicio o la identidad administrada al proyecto donde crearás la conexión de servicio, por ejemplo, agregándola al grupo Lectores.

  5. Seleccione Agregar para confirmar.

  6. Asigna permisos adicionales a nivel de recurso a la entidad de servicio o a la identidad administrada.

Paso 2: Creación de la conexión de servicio

  1. En su proyecto de Azure DevOps, vaya a Configuración del Proyecto>Conexiones de servicio.

  2. Seleccione Nueva conexión de servicio.

  3. Seleccione Azure DevOps como tipo de conexión de servicio.

  4. Complete el formulario:

    • Identidad: Seleccione el principal de servicio que agregó a su organización.
    • Nombre de conexión de servicio: escriba un nombre descriptivo para la conexión (por ejemplo, my-azdo-connection).
    • Descripción (opcional): agregar detalles sobre el propósito de la conexión
  5. Seleccione Guardar para crear la conexión de servicio.

Creación de una conexión de servicio para el acceso entre organizaciones

Para acceder a los recursos de una organización de Azure DevOps diferente unida al mismo inquilino de Entra ID:

  1. Siga los pasos descritos en Creación de una conexión de servicio dentro de la misma organización, pero seleccione Organización diferente al crear la conexión de servicio.

  2. Escriba el nombre del Azure DevOps organización de destino.

  3. También debe agregar la entidad de servicio como usuario en la organización de destino.

Utiliza la conexión de servicio en la canalización

Consultar repositorios de diferentes organizaciones

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

Hacer referencia a una plantilla de otra organización

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

Acceso a repositorios de artefactos

Usa la conexión del servicio para las tareas de autenticación de artefactos.

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

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

Llamar a Azure DevOps desde un script

- 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

La tarea AzureCLI@3 usa la Azure DevOps CLI, que está preinstalada en agentes hospedados de Microsoft. En los agentes autohospedados, usted necesita el Azure CLI con la extensión azure-devops. Si la azure-devops extensión no está instalada, la tarea AzureCLI@3 la instala en tiempo de ejecución.

Prácticas recomendadas de seguridad

  • Permisos mínimos: asigne a la entidad de servicio solo los permisos que necesita para las tareas de canalización específicas.
  • Auditoría de accesos: revise periódicamente los registros de auditoría para supervisar el uso de la conexión de servicio.
  • Uso del ámbito: use conexiones de servicio independientes para distintos proyectos u organizaciones para limitar los permisos compartidos.

Solución de problemas

Sugerencia

Para mejorar la seguridad, asigne a la entidad de servicio solo los permisos que necesita, revise los registros de auditoría periódicamente y use conexiones de servicio independientes para diferentes proyectos u organizaciones.

Error en la creación de la conexión de servicio

Causa: La entidad de servicio no se ha agregado a su organización o carece de los permisos necesarios.

Reparar:

  • Compruebe que agregó el principal de servicio como usuario a su organización.
  • Compruebe que tiene los permisos adecuados para crear conexiones de servicio.
  • Asegúrese de que el principal del servicio tiene el nivel de acceso necesario en la organización.

La canalización no se puede autenticar

Causa: El nombre de la conexión de servicio no coincide con la referencia de YAML o la entidad de servicio carece de permisos para los recursos de destino.

Reparar:

El acceso entre organizaciones no funciona

Causa: No ha agregado la entidad de servicio como usuario en ambas organizaciones o ha escrito mal el nombre de la organización de destino.

Reparar:

  • Agregue el service principal como usuario en ambas organizaciones.
  • Compruebe que el nombre de la organización de destino está escrito correctamente en la configuración de conexión de servicio.
  • Compruebe que la entidad de servicio tiene los permisos necesarios en la organización de destino.

Mensajes de error comunes

Mensaje Significado y mitigación
ERROR: TF401444: inicie sesión al menos una vez como 72f988bf-86f1-41af-91ab-2d7cd011db47\72f988bf-86f1-41af-91ab-2d7cd011db47\115c3ab3-943b-4e0c-96ed-1a1763fbaa44 en un explorador web para habilitar el acceso al servicio. Compruebe que agregó el principal de servicio como usuario a su organización.
La identidad administrada / la entidad de servicio <sp/msi name> no tiene acceso a la organización Azure DevOps <org>. Asegúrese de que la identidad se ha agregado a la organización. Vea https://aka.ms/azdosc#prerequisites. Agregue la entidad de servicio como usuario a la organización de destino y asígnela al proyecto correspondiente.
No tiene permiso para acceder a la identidad seleccionada. La conexión de servicio se guarda como borrador. Para completar la configuración, póngase en contacto con el propietario de la identidad para crear una credencial federada en el portal de Azure mediante el emisor y el identificador del sujeto a continuación. El usuario que ha iniciado sesión no tiene permisos suficientes para crear credenciales federadas. Siga las instrucciones que se muestran para crear credenciales federadas directamente en la identidad.
VS800075: el proyecto con el identificador "vstfs:///Classification/TeamProject/00000000-0000-00000000-000000000000" no existe o no tiene permiso para acceder a él. La identidad de conexión de servicio no se agrega al proyecto. Vaya a la página de > detalles de conexión del servicio Ver acceso en la organización actual>Miembro de> Seleccione un grupo para agregar la identidad, por ejemplo, el grupo Readers. Como alternativa, vaya a Configuración de> la organizaciónUsuarios> La identidad usada para la conexión > de servicio Administrar acceso> seleccione los proyectos a los que necesita acceder la identidad.

mensajes de error de Microsoft Entra ID

La tabla siguiente enumera los códigos de error comunes de Microsoft Entra ID y los posibles inconvenientes relacionados con las conexiones del servicio de identidad de carga de trabajo.

Mensaje Posible problema
AADSTS700016: La aplicación con el identificador '****' no fue encontrada La identidad que se usa para la conexión de servicio ya no existe, puede que se haya quitado de esa conexión de servicio o no se ha configurado correctamente. Si configura la conexión de servicio de forma manual con una identidad creada previamente, compruebe que appID/clientId se ha configurado correctamente.
AADSTS7000215: se ha proporcionado un secreto de cliente no válido. Está usando una conexión de servicio con un secreto que ha caducado. Convierta la conexión de servicio a federación de identidades de carga de trabajo y reemplace el secreto caducado por credenciales federadas.
AADSTS700024: la declaración del cliente no está dentro de su intervalo de tiempo válido Si el error se produce después de aproximadamente 1 hora, use una conexión de servicio con la federación de identidad de carga de trabajo y una identidad administrada en su lugar. Los tokens de identidad administrada tienen una duración de aproximadamente 24 horas.
Si el error se produce antes de 1 hora pero después de 10 minutos, mueva los comandos que (implícitamente) soliciten un token de acceso para, por ejemplo, acceder al almacenamiento de Azure al principio del script. El token de acceso se almacenará en caché para los comandos posteriores.
AADSTS70021: no se encontró ningún registro de identidad federado coincidente para la aserción presentada. Emisor de aserciones: https://app.vstoken.visualstudio.com. No se ha creado ninguna credencial federada o la dirección URL del emisor no es correcta. La dirección URL del emisor correcta tiene el formato https://login.microsoftonline.com/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Para corregir la dirección URL de emisión, edite y guarde una conexión de servicio. Si Azure DevOps no creó su identidad, debe actualizar manualmente el emisor. Puede encontrar el emisor correcto en el cuadro de diálogo de edición de la conexión de servicio o en la respuesta si utiliza la API REST.
AADSTS70021: no se encontró ningún registro de identidad federado coincidente para la aserción presentada. Emisor de aserciones: https://login.microsoftonline.com/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX. Asunto de aserción: sc://<org>/<project>/<service-connection>. La dirección URL del emisor o el sujeto de federación no coinciden. Se cambió el nombre de la organización o proyecto de Azure DevOps o se cambió el nombre de una conexión de servicio creada manualmente sin actualizar el sujeto de federación en la identidad.
AADSTS700211: No se encontró ningún registro de identidad federado coincidente para el emisor de la aserción presentada No se ha creado ninguna credencial federada o la dirección URL del emisor no es correcta.
AADSTS700213: no se encontró ningún registro de identidad federado coincidente para el sujeto de la aserción presentada No se ha creado ninguna credencial federada o la dirección URL del sujeto no es correcta.
AADSTS700223 La federación de identidades de carga de trabajo está restringida o deshabilitada en el inquilino de Microsoft Entra. En este caso, es posible usar en su lugar una identidad administrada para la federación. Para obtener más información, consulte Identidad de trabajo con identidad gestionada.
AADSTS70025: la aplicación cliente no tiene credenciales de identidad federadas configuradas Asegúrese de que las credenciales federadas están configuradas en el registro de aplicaciones o la identidad administrada.
Microsoft Entra rechazó el token emitido por Azure DevOps con código de error AADSTS700238 La federación de identidades de tareas de trabajo se ha restringido en la entidad Microsoft Entra. El emisor de su organización (https://login.microsoftonline.com/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) no tiene permitido usar la federación de identidad de carga de trabajo con el tipo de identidad de carga de trabajo (registro de aplicaciones y/o identidad administrada) que está utilizando. Pida al administrador de inquilinos o al equipo de administración de Microsoft Entra que permita la federación de identidades de carga de trabajo para su organización de Azure DevOps.
AADSTS70052: la identidad debe ser una identidad administrada, una aplicación de inquilino único o una cuenta de servicio Los registros de aplicaciones multiinquilino que tienen signInAudience: AzureADMultipleOrgs no son compatibles actualmente con el emisor de Microsoft Entra. Use signInAudience: AzureADMyOrg y divida el acceso a varios inquilinos para usar diferentes conexiones de servicio para cada inquilino en su lugar. Si depende de las operaciones de ARM que accedan a múltiples entidades en una sola solicitud (por ejemplo, emparejamiento de redes virtuales entre inquilinos), puede contactar con soporte para que la organización de Azure DevOps use el emisor de Azure DevOps.
AADSTS900382: el cliente confidencial no se admite en Cross Cloud Algunas nubes soberanas bloquean la federación de identidades de carga de trabajo.

¿El error AADSTS que ve no figura en la lista anterior? Compruebe Microsoft Entra códigos de error de autenticación y autorización.

Pasos siguientes