Accede a un depósito de claves privado desde tu pipeline

Azure Key Vault proporciona una manera segura de administrar las credenciales, incluidas las claves, los secretos y los certificados. Mediante el uso de Azure Pipelines, puede simplificar el proceso de acceso y el uso de almacenes de claves para almacenar y recuperar credenciales.

En determinados escenarios, las organizaciones priorizan la seguridad restringiendo el acceso a los almacenes de claves únicamente a determinadas redes virtuales de Azure. Esta restricción garantiza el mayor nivel de seguridad para las aplicaciones críticas. En este tutorial, aprenderá a configurar la autenticación y configurar el acceso entrante para que la canalización pueda consultar y recuperar datos de un Azure Key Vault privado.

Requisitos previos

Producto Requirements
Azure DevOps - Una organización de Azure DevOps.
- Un Azure DevOps project.
- Permisos:
    - Para conceder acceso a todas las canalizaciones del proyecto: debe ser miembro del grupo Administradores de proyectos.
    - Para crear conexiones de servicio: debe tener el rol Administrador o Creador para las conexiones de servicio.
Azur - Una suscripción de Azure.
: un almacén de claves de Azure.

Acceso a un almacén de claves privado

Los desarrolladores pueden usar Azure Pipelines para vincular un almacén de claves de Azure a un grupo de variables y asignar secretos de almacén selectivos a él. Se puede acceder a un Key Vault que se usa como grupo de variables:

  • Desde Azure DevOps durante la configuración del grupo de variables.
  • Desde un agente hospedado de forma local durante el tiempo de ejecución del trabajo de la canalización.

Diagrama que muestra las dos rutas de acceso diferentes para acceder a un almacén de claves privado.

Para configurar el acceso al almacén de claves privado, complete los pasos siguientes en orden:

  1. Cree una entidad de servicio para autenticarse en los recursos de Azure.
  2. Cree una conexión de servicio Azure Resource Manager en Azure DevOps mediante la entidad de servicio.
  3. Cree una credencial federada para la entidad de servicio en Azure.

Crear una entidad de servicio

Cree una entidad de servicio para autenticarse con recursos de Azure:

  1. Vaya al portal Azure.

  2. En el menú superior, abra Azure Cloud Shell y seleccione Bash.

  3. Ejecute el comando siguiente para crear una entidad de servicio:

    az ad sp create-for-rbac --name YOUR_SERVICE_PRINCIPAL_NAME
    
  4. Copie la salida del comando. Necesitará estos valores en el paso siguiente al crear la conexión de servicio.

Creación de una conexión de servicio

Después de crear la entidad de servicio, utilice sus valores de salida para crear una conexión de servicio de Azure Resource Manager en Azure DevOps.

  1. Inicie sesión en su organización de Azure DevOps y vaya a su proyecto.

  2. Seleccione Configuración del proyecto>Conexiones de servicio>Nueva conexión de servicio.

  3. Seleccione Azure Resource Manager y, a continuación, haga clic en Siguiente.

  4. En Tipo de identidad, seleccione Registro de aplicaciones (automático) en el menú desplegable.

  5. En Credential, mantenga el valor recomendado predeterminado como Federación de identidades de carga de trabajo.

  6. En Nivel de ámbito, seleccione Suscripción y, a continuación, seleccione la suscripción en el menú desplegable.

  7. Seleccione un grupo de recursos si desea limitar el acceso solo al grupo de recursos especificado.

  8. Escriba un nombre para la conexión de servicio y, a continuación, active la casilla Conceder permiso de acceso a todas las canalizaciones para permitir que todas las canalizaciones usen esta conexión de servicio.

  9. Haga clic en Guardar.

    Captura de pantalla que muestra cómo configurar una conexión de servicio Azure Resource Manager para una entidad de servicio.

Creación de una credencial federada

Después de guardar la conexión de servicio, configure una credencial federada en Azure para establecer la confianza entre la entidad de servicio y Azure DevOps.

  1. Vaya al portal de Azure, escriba el identificador de cliente de la entidad de servicio en la barra de búsqueda y seleccione la aplicación.

  2. En Administrar, seleccione Certificados y secretos>Credenciales federadas.

  3. Seleccione Agregar credencial y, después, en Escenario de credenciales federadas, seleccione Otro emisor.

  4. En Issuer, pegue la siguiente URL para reemplazar el marcador de posición con el GUID de su organización. Para encontrar el identificador de la organización, vaya a Configuración de la organización>Microsoft Entra. Descargue la lista de las organizaciones de Azure DevOps que están conectadas a su directorio.

    https://login.microsoftonline.com/<TENANT_ID>/v2.0
    
  5. En Identificador de asunto, pegue la siguiente dirección URL. Reemplace los marcadores de posición por el nombre de la organización, el nombre del proyecto y el nombre de conexión del servicio.

    ENTRA_PREFIX/sc/ORGANIZATION_NAME/PROJECT_NAME/SERVICE_CONNECTION_NAME
    
  6. Escriba un nombre para la credencial federada y, a continuación, seleccione Agregar.

Creación de una conexión de servicio

Después de crear la entidad de servicio, utilice sus valores de salida para crear una conexión de servicio de Azure Resource Manager en Azure DevOps.

  1. Inicie sesión en su organización de Azure DevOps y vaya a su proyecto.

  2. Seleccione Configuración del proyecto>Conexiones de servicio>Nueva conexión de servicio.

  3. Seleccione Azure Resource Manager>Siguiente y, a continuación, seleccione Entidad de servicio (manual)>Siguiente.

  4. En Entorno, seleccione Azure Nube y, en Nivel de ámbito, seleccione Suscripción. A continuación, escriba el identificador de suscripción y el nombre de la suscripción.

  5. Escriba la información de la entidad de servicio y seleccione Comprobar.

  6. Después de la comprobación correcta, asigne un nombre a la conexión de servicio, agregue una descripción y, a continuación, active la casilla Conceder permiso de acceso a todas las canalizaciones . Seleccione Comprobar y guardar.

Sugerencia

Si no puede comprobar la conexión de la entidad de servicio, conceda a la entidad de servicio acceso Lector a la suscripción.

Acceso a un almacén de claves privado desde Azure DevOps

En esta sección se tratan dos métodos para acceder a un almacén de claves privado desde Azure DevOps.

El primer método utiliza grupos de variables para vincular y asignar los secretos desde el almacén de claves, y después configura el acceso de entrada permitiendo rangos de IP estáticos. Azure Pipelines usa la dirección IP pública Azure DevOps al consultar un almacén de claves desde un grupo de variables, por lo que debe permitir esos intervalos IP en el firewall del almacén de claves.

El segundo método agrega dinámicamente la dirección IP del agente hospedado por Microsoft a la lista de permitidos del firewall del almacén de claves al principio de la canalización, consulta el almacén de claves y finalmente elimina la dirección IP. Este método es solo para fines de demostración y no se recomienda para su uso en producción.

Paso 1: Asociar los secretos del almacén de claves con un grupo de variables

  1. Inicie sesión en su organización de Azure DevOps y vaya a su proyecto.

  2. Seleccione Canalizaciones>Biblioteca y, a continuación, seleccione + Grupo de variables.

  3. Asigne un nombre al grupo de variables y, a continuación, habilite Vincular secretos de Azure Key Vault como variables.

  4. Seleccione la conexión de servicio que creó anteriormente, seleccione el almacén de claves y, a continuación, seleccione Autorizar.

  5. En Variables, seleccione Agregar para agregar el secreto y, a continuación, seleccione Guardar.

Nota:

Asegúrese de que la conexión de servicio tenga los permisos Obtener y Enumerar, y de que la entidad de servicio tenga asignado el rol Usuario de secretos de Key Vault en su almacén de claves privado.

Paso 1.1: Configuración de los permisos de conexión de servicio

  1. Vaya a su almacén de claves de Azure y, a continuación, seleccione Directivas de acceso.

  2. Seleccione Crear y, en Permisos secretos, agregue los permisos Obtener y Enumerar y, a continuación, seleccione Siguiente.

  3. Agregue la conexión de servicio en la barra de búsqueda, selecciónela y, a continuación, seleccione Siguiente.

  4. Seleccione Siguiente una vez más, revise la configuración y, a continuación, seleccione Revisar y crear.

Paso 1.2: Configurar los permisos de la entidad de servicio

  1. Vaya a su almacén de claves de Azure y, a continuación, seleccione Control de acceso (IAM).

  2. Seleccione Agregar asignación> deroles y, a continuación, seleccione la pestaña Rol.

  3. Seleccione el rol Usuario de secretos de Key Vault y, a continuación, seleccione Siguiente.

  4. Elija Seleccionar miembros, agregue su entidad de servicio y elija Seleccionar.

  5. Seleccione Revisar y asignar.

  1. Inicie sesión en su organización de Azure DevOps y vaya a su proyecto.

  2. Seleccione Canalizaciones>Biblioteca y, a continuación, seleccione + Grupo de variables.

  3. Asigne un nombre al grupo de variables y, a continuación, habilite Vincular secretos de Azure Key Vault como variables.

  4. Seleccione la conexión de servicio Azure que creó anteriormente en el menú desplegable y, a continuación, seleccione el almacén de claves.

    Captura de pantalla que muestra cómo vincular un grupo de variables a un almacén de claves de Azure con un error que indica que faltan permisos Get y List.

  5. Es posible que se encuentre con el mensaje de error "La conexión de servicio de Azure especificada debe tener permisos de administración de secretos \"Obtener, Enumerar\" en el almacén de claves seleccionado". Vaya a su almacén de claves en Azure Portal y seleccione Control de acceso (IAM)>Agregar asignación de roles>Usuario de secretos de Key Vault>Siguiente. Agregue su entidad de servicio y, después, seleccione Revisar y asignar.

    Captura de pantalla que muestra cómo agregar una entidad de servicio como usuario secreto para un almacén de claves de Azure.

  6. Agregue los secretos y, a continuación, seleccione Guardar.

Paso 2: Configurar el acceso entrante desde Azure DevOps

Después de configurar el grupo de variables, permita el acceso entrante desde Azure DevOps al almacén de claves agregando los intervalos IP estáticos para la región geográfica de la organización.

  1. Inicie sesión en su organización de Azure DevOps.

  2. Seleccione Configuración de la organización.

  3. Vaya a Información general para buscar la ubicación geográfica.

    Captura de pantalla que muestra cómo encontrar la ubicación geográfica de la organización de Azure DevOps.

  4. Buscar rangos de IPv4 por ubicación geográfica.

    Importante

    Para las conexiones entrantes desde Estados Unidos, asegúrese de añadir los rangos de IP de todas las regiones de Estados Unidos.

  5. Configure el almacén de claves para permitir el acceso desde intervalos IP estáticos.

Paso 3: Consulta de un almacén de claves privado con un grupo de variables

Con el grupo de variables vinculado y el acceso entrante configurado, use la siguiente canalización para consultar el almacén de claves privado y copiar el secreto recuperado. Azure Pipelines usa su dirección IP pública para consultar el almacén de claves desde un grupo de variables, por lo que debe asegurarse de configurar el acceso entrante antes de ejecutar la canalización.

variables:
-  group: mySecret-VG

steps:
- task: CmdLine@2
  inputs:
    script: 'echo $(mySecret) > secret.txt'

- task: CopyFiles@2
  inputs:
    Contents: secret.txt
    targetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

Método alternativo: permitir dinámicamente la dirección IP del agente hospedado Microsoft

En este enfoque, la canalización consulta la dirección IP del agente hospedado por Microsoft al iniciarse, la agrega a la lista de direcciones IP permitidas del firewall del almacén de claves, ejecuta las tareas del almacén de claves y, a continuación, elimina la dirección IP antes de que finalice la canalización.

Nota:

Este enfoque es solo para fines de demostración. No se recomienda este enfoque para Azure Pipelines.

- task: AzurePowerShell@5
  displayName: 'Allow agent IP'
  inputs:
    azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
    azurePowerShellVersion: LatestVersion
    ScriptType: InlineScript
    Inline: |
     $ip = (Invoke-WebRequest -uri "http://ifconfig.me/ip").Content
     Add-AzKeyVaultNetworkRule -VaultName "YOUR_KEY_VAULT_NAME" -ResourceGroupName "YOUR_RESOURCE_GROUP_NAME" -IpAddressRange $ip
     echo "##vso[task.setvariable variable=agentIP]$ip"

- task: AzureKeyVault@2
  inputs:
    azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
    KeyVaultName: 'YOUR_KEY_VAULT_NAME'
    SecretsFilter: '*'
    RunAsPreJob: false

- task: AzurePowerShell@5
  displayName: 'Remove agent IP'
  inputs:
    azureSubscription: 'YOUR_SERVICE_CONNECTION_NAME'
    azurePowerShellVersion: LatestVersion
    ScriptType: InlineScript
    Inline: |
     $ipRange = "$(agentIP)/32"
     Remove-AzKeyVaultNetworkRule -VaultName "YOUR_KEY_VAULT_NAME" -IpAddressRange $ipRange
  condition: succeededOrFailed()

Importante

Asegúrese de que la entidad de servicio que usa para acceder a su almacén de claves desde la canalización tenga asignado el rol Colaborador de Key Vault en el control de acceso (IAM) de su almacén de claves.

Acceso a un almacén de claves privado desde un agente autohospedado

Para acceder a un almacén de claves privado desde un agente de Azure Pipelines, use un agente autohospedado (Windows, Linux o Mac) o Virtual Machine Scale Sets agentes. Los agentes hospedados por Microsoft, al igual que otros servicios de proceso de uso general, no están incluidos en la lista de servicios de confianza de Key Vault.

Para establecer la conectividad con su almacén de claves privado, configure un punto de conexión privado para el acceso directo. Este punto de conexión debe ser enrutable y su nombre DNS privado debe poder resolverse desde el agente de canalización autohospedado.

Paso 1: Configurar el acceso entrante desde un agente autohospedado

  1. Siga las instrucciones para crear una red virtual.

  2. En el portal de Azure, use la barra de búsqueda en la parte superior de la página para buscar el almacén de claves de Azure.

  3. Seleccione el almacén de claves y, a continuación, vaya a Configuración>Redes.

  4. Seleccione Conexiones de punto de conexión privado y, a continuación, seleccione Crear para crear un nuevo punto de conexión privado.

    Captura de pantalla que muestra cómo crear una nueva conexión de endpoint privado para un Azure Key Vault.

  5. Seleccione el grupo de recursos que hospeda la red virtual que creó anteriormente. Escriba un nombre y un nombre de interfaz de red para la instancia y asegúrese de seleccionar la misma región que la red virtual que creó anteriormente. Seleccione Siguiente.

    Captura de pantalla que muestra cómo configurar la pestaña Aspectos básicos al crear una nueva instancia de punto de conexión privado para el almacén de claves de Azure.

  6. Para Método de conexión, seleccione Conectar a un recurso de Azure en mi directorio. En Tipo de recurso, elija Microsoft. KeyVault/vaults en el menú desplegable. Seleccione el recurso en el menú desplegable. Subrecurso de destino se rellena automáticamente con el valor vault. Seleccione Siguiente.

    Captura de pantalla que muestra cómo configurar la pestaña Recurso al crear una nueva instancia de punto de conexión privado para el almacén de claves de Azure.

  7. En la pestaña Virtual Network, seleccione el virtual network y la subred que creó anteriormente y deje el resto de los campos como predeterminado. Seleccione Siguiente.

  8. Acepte la configuración predeterminada en las pestañas DNS y Etiquetas . En la pestaña Revisar y crear , seleccione Crear.

  9. Una vez implementado su recurso, vaya a su almacén de claves y seleccione Configuración>Redes>Conexiones de punto de conexión privado. El punto de conexión privado debe aparecer con el estado de conexión como Aprobado. Si vincula a un recurso de Azure en otro directorio, debe esperar a que el propietario del recurso apruebe la solicitud de conexión.

    Captura de pantalla que muestra una conexión de extremo privado aprobada

Paso 2: Permitir la red virtual

Con el punto de conexión privado configurado, permita la red virtual que hospeda el agente autohospedado en la configuración del firewall del almacén de claves.

  1. Vaya al portal de Azure y busque el almacén de claves de Azure.

  2. Seleccione Configuración redes> y asegúrese de que está en la pestaña Firewalls y redes virtuales.

  3. Seleccione Agregar red virtual>Agregar redes virtuales existentes.

  4. Seleccione la suscripción en el menú desplegable, seleccione la red virtual que creó anteriormente y, a continuación, seleccione las subredes.

  5. Seleccione Agregar y desplácese hasta la parte inferior de la página y seleccione Aplicar para guardar los cambios.

    Captura de pantalla que muestra cómo agregar una red virtual existente al firewall del almacén de claves.

Paso 3: Consulta de un almacén de claves privado desde un agente autohospedado

Una vez habilitada la red virtual, use el siguiente pipeline para consultar el almacén de claves privado a través del grupo de variables vinculado desde un agente autohospedado:

pool: Self-hosted-pool

variables:
  group: mySecret-VG

steps:
- task: CmdLine@2
  inputs:
    script: 'echo $(mySecret) > secret.txt'

- task: CopyFiles@2
  inputs:
    Contents: secret.txt
    targetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

Si no desea conceder acceso de entrada Azure DevOps al almacén de claves privado, use la tarea AzureKeyVault para consultar directamente el almacén de claves. En este caso, asegúrese de que la red virtual que hospeda el agente autohospedado está permitida en la configuración del firewall del almacén de claves.

pool: Self-hosted-pool

steps:
- task: AzureKeyVault@2
  inputs:
    azureSubscription: '$(SERVICE_CONNECTION_NAME)'
    keyVaultName: $(KEY_VAULT_NAME)
    SecretsFilter: '*'

- task: CmdLine@2
  inputs:
    script: 'echo $(mySecret) > secret.txt'

- task: CopyFiles@2
  inputs:
    Contents: secret.txt
    targetFolder: '$(Build.ArtifactStagingDirectory)'

- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

Solución de problemas

Use las instrucciones siguientes para solucionar errores comunes de acceso al almacén de claves:

  • Public network access is disabled and request is not from a trusted service nor via an approved private link.

    Este error indica que el acceso público está deshabilitado, pero no se configura ningún punto de conexión privado ni las excepciones de firewall necesarias. Siga los pasos descritos en Configuración del acceso entrante desde un agente autohospedado o Configuración del acceso entrante desde Azure DevOps en función del escenario para configurar el acceso al almacén de claves privado.

  • Request was not allowed by NSP rules and the client address is not authorized and caller was ignored because bypass is set to None Client address: <x.x.x.x>

    Este error indica que el acceso público está deshabilitado, Permitir que los servicios de Microsoft de confianza omitan este firewall no está activada y la dirección IP del cliente no está en la lista de direcciones IP permitidas del firewall del almacén de claves. En el portal de Azure, vaya al almacén de claves, seleccione Configuración>redes y agregue la dirección IP del cliente a la lista de permitidos del firewall.

  • Error: Client address is not authorized and caller is not a trusted service.

    Asegúrese de que los intervalos IPv4 de su región geográfica se hayan agregado a la lista de direcciones IP permitidas del almacén de claves. Para obtener más información, consulte Configuración del acceso entrante desde Azure DevOps.

    Como alternativa, vea Permitir dinámicamente la IP del agente hospedado en Microsoft para agregar la dirección IP del cliente al firewall del almacén de claves en tiempo de ejecución.