Uno de los retos con el que siempre nos enfrentamos es el de cómo gestionar las credenciales de otros servicios de Azure en nuestro código. Es una conversación recurrente en todos nuestros clientes: concienciar que es vital desacoplar todo tipo de credenciales del código así como el dónde almaceno dichas credenciales, pero ¿y si no hubiera credenciales que almacenar? Esta es justo la idea detrás de las managed identities.
Desde hace algún tiempo, en algunos servicios ha aparecido una nueva sección llamada Identity. Se trata de una característica gratuita, que permite gestionar la identidad de servicios, a través de Azure Active Directory, con el objetivo de que sean capaces de autenticarse y que gracias a ellos puedan ser asignados a roles en otros servicios de la plataforma.
Existen dos tipos de managed identities:
- System-assigned: se asigna directamente sobre el servicio de Azure. Si este servicio se elimina las credenciales se eliminan de manera automática de Azure AD cuando este desaparece.
- User-assigned: Esta identidad no está asignada directamente sobre un servicio, sino que trabaja en un modelo standalone. Esta puede ser asignada a más de un servicio. Por ejemplo, puedes tener una identidad del tipo user-assigned asignada a varias máquinas virtuales. Si eliminamos las máquinas virtuales, al contrario que el tipo system-assigned, esta identidad no es eliminada automáticamente. Este tipo no está soportado a día de hoy en todos los servicios donde se pueden habilitar managed identities.
En este enlace puedes comprobar todos los servicios que soportan uno o ambos tipos y el grado de madurez.
Para ver cómo funciona este sistema vamos a verlo con un ejemplo de una máquina virtual que quiere acceder a una cuenta de almacenamiento, utilizando el sistema system assigned.
Pasos a seguir con Managed Identities
Antes de montar la demo quiero que entiendas bien cómo funciona:
- Habilito Managed Identity en el servicio que necesita acceder a otro servicio. En este caso sería la máquina virtual.
- Asigno un rol al servicio que tiene habilitado managed idetity dentro del servicio al que quiere acceder. En este caso sería la cuenta de almacenamiento.
Habilitar Managed Identity en la máquina virtual
Elige o crea una máquina virtual Windows y accede al apartado Identity de la misma:

En el apartado System assigned selecciona On y haz clic en Save. Te avisará de que una vez registrada a esta se le podrán asignar permisos para acceder a recursos protegidos con Azure AD. Haz clic en Yes para continuar.
Si has dedido crear la máquina virtual, podrás encontrar esta opción en el apartado MANAGEMENT en la sección Identity.
Una vez habilitado el servicio como identidad manejada nos figurará un object ID que se corresponde con el objeto generado en Azure AD para este servicio.

¿Fácil verdad? Ahora que podemos autenticarnos con esta VM en Azure Active Directory lo que necesitamos es ver a qué otro servicio podemos acceder con esta autenticación.
Permisos a la máquina virtual en mi cuenta de Azure Storage
Para que todo esto tenga sentido, tenemos que asignar algún permiso a esta máquina virtual en algún otro recurso. En este ejemplo vamos a hacer una prueba con una cuenta de Azure Storage, de la que ya te hablé que tiene en Preview el acceso a la misma a través de RBAC.
Crea o accede a una cuenta de almacenamiento y haz clic en el apartado Access Control (IAM) y haz clic en Add a role assignment. Aparecerá un apartado en el lado derecho donde seleccionaremos:
Role: Storage Blob Data Contributor (Preview)
Assign access to: System Assigned managed identity > Virtual Machine
Select: la máquina virtual en la que habilitaste la opción de managed identity debería de aparecer aquí.

Guarda los cambios. En el momento que escribí este post, al estar en preview, la opción de RBAC en las cuentas de almacenamiento puede tardar hasta 5 minutos en propagarse.
Comprobar el acceso a través de managed identity
Ya tienes todo configurado para que tu máquina virtual tenga acceso a la cuenta de almacenamiento a través de managed identity. Lo único que nos falta es comprobar que todo funciona como esperamos. Vamos a intentar crear un contenedor y un archivo dentro del mismo, a través de PowerShell, utilizando este sistema de autenticación.
Accede a tu máquina a través de RDP y abre una consola de PowerShell.
Instala el módulo Az en la máquina a través de este comando:
Install-Module Az
Para conectar y crear con tu cuenta de almacenamiento utiliza el siguiente script:
Connect-AzAccount -MSI -Subscription TU_SUBSCRIPTION_ID
$context = New-AzStorageContext -StorageAccountName msistoragedemo -UseConnectedAccount
New-AzStorageContainer -Name msitest -Context $context
Write-Output "I created a file using MSI" > fileusingmsi.txt
Set-AzStorageBlobContent -File .\fileusingmsi.txt -Container msitest -Blob fileusingmsi.txt -Context $context
Como ves, cuando me conecto a mi cuenta de Azure utilizo el parámetro -MSI para indicar que quiero utilizar Managed Identity. (MSI significa Managed Service Identity y es el nombre formal de este servicio) y luego, para generar el contexto, que es la conexión con mi cuenta de almacenamiento, utilizo la opción -UseConnectedAccount, en lugar de mi Shared Key, para que utilice la conexión que se creo al lanzar Connect-AzAccount. De esta forma ya estamos utilizando managed identity para acceder a nuestra cuenta de almacenamiento, sin la necesidad de utilizar credenciales.
Si ahora accedes al apartado Blobs de tu cuenta de Azure Storage comprobarás que el contendor y el archivo se han creado sin problemas.
Al final, debes quedarte con la siguiente idea:
Managed identity habilita la autenticación de servicios en Azure AD mientras que RBAC habilita la autorización en los servicios. Combinando las dos tendremos servicios que pueden autenticarse y servicios que autorizan su uso a diferentes niveles a los servicios autenticados.
Ahora bien, para todos aquellos servicios que todavía no soportan esta característica, podemos apoyarnos en Azure Key Vault, donde podremos guardar nuestras credenciales de manera segura y que si que soporta RBAC. En este otro artículo tienes un ejemplo de cómo sería el caso de un App Service que accede a Azure Key Vault a través de este sistema para recuperar diferentes credenciales. Echa también un vistazo a la documentación oficial, donde encontrarás más ejemplos.
¡Saludos!