Share via


Migración de aplicaciones para usar conexiones sin contraseña con Azure Service Bus

Las solicitudes de aplicaciones a Azure Service Bus se deben autenticar mediante claves de acceso de cuenta o conexiones sin contraseña. Sin embargo, debe priorizar las conexiones sin contraseña en las aplicaciones siempre que sea posible. En este tutorial se explora cómo migrar de los métodos de autenticación tradicionales a conexiones sin contraseña más seguras.

Riesgos de seguridad asociados a las claves de acceso

El siguiente ejemplo de código muestra cómo conectarse a Azure Service Bus usando una cadena de conexión que incluye una clave de acceso. Cuando se crea un bus de servicio, Azure genera estas claves y cadenas de conexión automáticamente. Muchos desarrolladores se inclinan por esta solución, porque es parecida a las opciones con las que han trabajado en el pasado. Si su aplicación usa actualmente claves de acceso, considere la posibilidad de migrar a conexiones sin contraseña siguiendo los pasos que se describen más adelante en este documento.

await using ServiceBusClient client = new("<CONNECTION-STRING>");

Las cadenas de conexión deben usarse con precaución. Los desarrolladores deben ser diligentes para no exponer nunca las claves en una ubicación que no sea segura. Cualquier persona que obtenga acceso a la clave puede autenticarse. Por ejemplo, si una clave de cuenta se registra por accidente en el control de código fuente, se envía a través de un correo electrónico no seguro, se pega en el chat equivocado o la ve alguien que no debería tener permiso, existe el riesgo de que un usuario malintencionado acceda a la aplicación. En su lugar, considere la posibilidad de actualizar la aplicación para usar conexiones sin contraseña.

Migración a conexiones sin contraseña

Muchos servicios de Azure admiten conexiones sin contraseña mediante Microsoft Entra ID y el control de acceso basado en roles (RBAC). Estas técnicas proporcionan características de seguridad sólidas y se pueden implementar mediante DefaultAzureCredential desde las bibliotecas de cliente de Azure Identity.

Importante

Algunos lenguajes deben implementar DefaultAzureCredential en su código de manera explícita, mientras que otros usan DefaultAzureCredential internamente a través de complementos o controladores subyacentes.

DefaultAzureCredential admite varios métodos de autenticación y determina automáticamente qué se debe usar en tiempo de ejecución. Este enfoque permite que la aplicación use diferentes métodos de autenticación en distintos entornos (desarrollo local frente a producción) sin implementar código específico del entorno.

El orden y las ubicaciones en los que DefaultAzureCredential busca las credenciales se pueden encontrar en la información general de la biblioteca de Azure Identity y varía entre idiomas. Por ejemplo, cuando se trabaja en modo local con .NET, DefaultAzureCredential se autentica normalmente con la cuenta que el desarrollador ha usado para iniciar sesión en Visual Studio, la CLI de Azure o Azure PowerShell. Cuando la aplicación se implemente en Azure, DefaultAzureCredential detecta y usa automáticamente la identidad administrada del servicio de hospedaje asociado, como Azure App Service. No se necesitan cambios de código para esta transición.

Nota

Una identidad administrada proporciona una identidad de seguridad para representar una aplicación o servicio. La identidad está administrada por la plataforma Azure y no requiere que aprovisione o rote los secretos. Puede obtener más información sobre las identidades administradas en la documentación de información general.

El siguiente ejemplo de código muestra cómo conectarse a Service Bus usando conexiones sin contraseña. En la siguiente sección se describe con más detalle cómo migrar a esta configuración para un servicio específico.

Una aplicación de .NET puede pasar una instancia de DefaultAzureCredential al constructor de una clase de cliente de servicio. DefaultAzureCredential detectará automáticamente las credenciales que estén disponibles en ese entorno.

ServiceBusClient serviceBusClient = new(
    new Uri($"https://{serviceBusNamespace}.blob.core.windows.net"),
    new DefaultAzureCredential());

Pasos para migrar una aplicación a fin de usar la autenticación sin contraseña

En los pasos siguientes se explica cómo migrar una aplicación existente para usar conexiones sin contraseña en lugar de una solución basada en claves. Primero debe configurar un entorno de desarrollo local y, después, aplicar esos conceptos a un entorno de hospedaje de aplicaciones de Azure. Estos mismos pasos de migración deben aplicarse tanto si se usan claves de acceso directamente como si se usan cadenas de conexión.

Configuración de roles y usuarios para la autenticación de desarrollo local

Cuando desarrolle aplicaciones en modo local, asegúrese de que la cuenta de usuario que accede a Service Bus tenga los permisos correctos. En este ejemplo, usará el rol Propietario de los datos de Azure Service Bus para enviar y recibir datos, aunque también hay disponibles roles más específicos. Para asignarse este rol a sí mismo, necesitará que se le asigne el rol Administrador de acceso de usuario u otro rol que incluya la acción Microsoft.Authorization/roleAssignments/write. Puede asignar roles RBAC de Azure a un usuario mediante Azure Portal, la CLI de Azure o Azure PowerShell. Puede obtener más información sobre los ámbitos disponibles para las asignaciones de roles en la página de información general del ámbito.

En este escenario, asignará permisos a su cuenta de usuario, cuyo ámbito es un espacio de nombres de Service Bus específico, con el fin de seguir el principio de privilegios mínimos. Esta práctica solo proporciona a los usuarios los permisos mínimos necesarios y crea entornos de producción más seguros.

En el ejemplo siguiente, se asignará el rol Propietario de los datos de Azure Service Bus a su cuenta de usuario, lo que le permitirá enviar y recibir datos.

Importante

En la mayoría de los casos, la asignación de roles tardará un minuto o dos en propagarse en Azure, pero en casos excepcionales puede tardar hasta ocho minutos. Si recibe errores de autenticación al ejecutar por primera vez el código, espere unos instantes e inténtelo de nuevo.

  1. En Azure Portal, busque el espacio de nombres de Service Bus usando la barra de búsqueda principal o el panel de navegación izquierdo.

  2. En la página de información general del bus de servicio, seleccione Control de acceso (IAM) en el menú de la izquierda.

  3. En la página Control de acceso (IAM), seleccione la pestaña Asignación de roles.

  4. Seleccione + Agregar en el menú superior y, a continuación, Agregar asignación de roles en el menú desplegable resultante.

    A screenshot showing how to assign a role.

  5. Puede usar el cuadro de búsqueda para filtrar los resultados por el rol deseado. En este ejemplo, busque Propietario de los datos de Azure Service Bus, seleccione el resultado coincidente y elija Siguiente.

  6. En la pestaña Asignar acceso a, seleccione Usuario, grupo o entidad de servicio y, a continuación, elija + Seleccionar miembros.

  7. En el cuadro de diálogo, busque el nombre de usuario de Microsoft Entra (normalmente su dirección de correo electrónico de user@domain) y, a continuación, elija Seleccionar en la parte inferior del cuadro de diálogo.

  8. Seleccione Revisar y asignar para ir a la página final y, a continuación, de nuevo Revisar y asignar para completar el proceso.

Inicio de sesión y migración del código de la aplicación para usar conexiones sin contraseña

Cuando desarrolle aplicaciones en modo local, asegúrese de que se autentica con la misma cuenta de Microsoft Entra a la que le asignó el rol para el espacio de nombres de Service Bus. Puede autenticarse a través de la CLI de Azure, Visual Studio, Azure PowerShell u otras herramientas, como IntelliJ.

En el caso del desarrollo local, asegúrese de realizar la autenticación con la misma cuenta de Microsoft Entra a la que ha asignado el rol. Puede autenticarse a través de herramientas de desarrollo populares, como la CLI de Azure o Azure PowerShell. Las herramientas de desarrollo con las que puede autenticarse varían en todos los idiomas.

Inicie sesión en Azure a través de la CLI de Azure mediante el siguiente comando:

az login

A continuación, actualice el código para usar conexiones sin contraseña.

  1. Para usar DefaultAzureCredential en una aplicación .NET, instale el paquete Azure.Identity:

    dotnet add package Azure.Identity
    
  2. En la parte superior del archivo, agregue el código siguiente:

    using Azure.Identity;
    
  3. Identifique el código que crea un objeto ServiceBusClient para conectarse a Azure Service Bus. Actualice su código para que coincida con el ejemplo siguiente:

     var serviceBusNamespace = $"https://{namespace}.servicebus.windows.net";
     ServiceBusClient client = new(
         serviceBusNamespace,
         new DefaultAzureCredential());
    

Ejecución de la aplicación de forma local

Después de realizar estos cambios de código, ejecute la aplicación localmente. La nueva configuración debe recoger las credenciales locales, como la CLI de Azure, Visual Studio o IntelliJ. Los roles que asigne al usuario de desarrollo local en Azure permitirán a la aplicación conectarse al servicio de Azure localmente.

Configuración del entorno de hospedaje de Azure

Una vez que la aplicación se ha configurado para usar conexiones sin contraseña y se ejecuta localmente, el mismo código se puede autenticar en los servicios de Azure después de implementarla en Azure. Por ejemplo, una aplicación que se haya implementado en una instancia de Azure App Service y que tenga habilitada una identidad administrada puede conectarse a Azure Service Bus.

Cree la identidad administrada mediante Azure Portal

En los pasos siguientes se muestra cómo crear una identidad administrada asignada por el sistema para varios servicios de hospedaje web. La identidad administrada puede conectarse de manera segura a otros servicios de Azure mediante las configuraciones de aplicación que configuró anteriormente.

Algunos entornos de hospedaje de aplicaciones admiten el conector de servicio, que ayuda a conectar los servicios de proceso de Azure a otros servicios de respaldo. El conector de servicio configura automáticamente la configuración de red y la información de conexión. Puede obtener más información sobre el conector de servicio y los escenarios que se admiten en la página de información general.

Actualmente se admiten los siguientes servicios de proceso:

  • Azure App Service
  • Azure Spring Cloud
  • Azure Container Apps (versión preliminar)

En esta guía de migración, usará App Service, pero los pasos son similares a los de Azure Spring Apps y Azure Container Apps.

Nota

Actualmente, Azure Spring Apps solo admite el conector de servicio mediante cadenas de conexión.

  1. En la página de información general principal de App Service, seleccione Conector de servicio en el panel de navegación de la izquierda.

  2. Seleccione + Crear en el menú superior y se abrirá el panel Crear conexión. Escriba los siguientes valores:

    • Tipo de servicio: elija Service Bus.
    • Suscripción: selecciona la suscripción que quiera usar.
    • Nombre de conexión: escriba un nombre para la conexión, como conector_appservice_servicebus.
    • Tipo de cliente: deje seleccionado el valor predeterminado o elija el cliente específico que quiera usar.

    Seleccione Siguiente: Autenticación.

  3. Asegúrese de que la identidad administrada asignada por el sistema (recomendada) esté seleccionada y, a continuación, elija Siguiente: Redes.

  4. Deje los valores predeterminados seleccionados y, a continuación, elija Siguiente: Revisar y crear.

  5. Una vez que Azure valide la configuración, seleccione Crear.

El conector de servicio creará automáticamente una identidad administrada asignada por el sistema para el servicio de aplicaciones. El conector también le asignará a la identidad administrada el rol Propietario de los datos de Azure Service Bus para el bus de servicio seleccionado.

Como alternativa, también puede habilitar la identidad administrada en un entorno de hospedaje de Azure usando la CLI de Azure.

Puede usar un conector de servicio para crear una conexión entre un entorno de hospedaje de proceso de Azure y un servicio de destino mediante la CLI de Azure. La CLI controla automáticamente la creación de una identidad administrada y asigna el rol adecuado, tal y como se explica en las instrucciones del portal.

Si usa Azure App Service, use el comando az webapp connection:

az webapp connection create servicebus \
    --resource-group <resource-group-name> \
    --name <webapp-name> \
    --target-resource-group <target-resource-group-name> \
    --namespace <target-service-bus-namespace> \
    --system-identity

Si utiliza Azure Spring Apps, use el comando az spring connection:

az spring connection create servicebus \
    --resource-group <resource-group-name> \
    --service <service-instance-name> \
    --app <app-name> \
    --deployment <deployment-name> \
    --target-resource-group <target-resource-group> \
    --namespace <target-service-bus-namespace> \
    --system-identity

Si usa Azure Container Apps, use el comando az containerapp connection:

az containerapp connection create servicebus \
    --resource-group <resource-group-name> \
    --name <webapp-name> \
    --target-resource-group <target-resource-group-name> \
    --namespace <target-service-bus-namespace> \
    --system-identity

Asignación de roles a la identidad administrada

A continuación, debe conceder permisos a la identidad administrada que ha creado para acceder al bus de servicio. Para ello, asigne un rol a la identidad administrada, tal y como hizo con el usuario de desarrollo local.

Si ha conectado los servicios por medio del conector de servicio, no es necesario realizar este paso. Se han controlado las configuraciones necesarias:

  • Si seleccionó una identidad administrada cuando creó la conexión, se creó una identidad administrada asignada por el sistema para la aplicación y se le asignó el rol Propietario de los datos de Azure Service Bus en el bus de servicio.

  • Si ha seleccionado la cadena de conexión, esta se habrá agregado como una variable de entorno de aplicación.

Prueba de la aplicación

Después de realizar estos cambios de código, vaya a la aplicación hospedada en el explorador. La aplicación debe poder conectarse al bus de servicio. Tenga en cuenta que las asignaciones de roles pueden tardar varios minutos en propagarse a través del entorno de Azure. Ahora la aplicación está configurada para ejecutarse localmente y en un entorno de producción sin que los desarrolladores tengan que administrar los secretos en la propia aplicación.

Pasos siguientes

En este tutorial, ha aprendido a migrar una aplicación a conexiones sin contraseña.