Tutorial: Uso de una identidad asignada por el sistema de una máquina virtual Linux para acceder a Azure Storage con las credenciales de SAS

Identidades administradas para recursos de Azure es una característica de Microsoft Entra ID. Cada servicio de Azure compatible con Managed Identities for Azure Resources está sujeto a su propia escala de tiempo. Asegúrese de revisar el estado de disponibilidad de las identidades administradas para el recurso y los problemas conocidos antes de comenzar.

En este tutorial, se explica cómo usar las identidades administradas asignadas por el sistema de una máquina virtual Linux para obtener las credenciales de Firma de acceso compartido (SAS) del almacenamiento. En concreto, una credencial SAS de servicio.

Nota

La clave SAS generada en este tutorial no se restringirá ni limitará a la máquina virtual.

Una SAS de servicio concede acceso limitado a los objetos de una cuenta de almacenamiento sin exponer una clave de acceso de la cuenta. El acceso se puede conceder durante un tiempo limitado y un servicio específico. Puede usar una credencial SAS de la forma habitual al realizar operaciones de almacenamiento, por ejemplo, al usar el SDK de Storage. En este tutorial, mostramos cómo cargar y descargar un blob mediante la CLI de Azure Storage. Aprenderá a:

  • Crear una cuenta de almacenamiento
  • Creación de un contenedor de blobs en la cuenta de almacenamiento
  • Conceder acceso a la máquina virtual a una SAS de cuenta de almacenamiento en Resource Manager
  • Obtener un token de acceso mediante la identidad de la máquina virtual y utilizarlo para recuperar la credencial SAS desde Resource Manager

Requisitos previos

Crear una cuenta de almacenamiento

Si aún no tiene una, ahora creará una cuenta de almacenamiento. También puede omitir este paso y conceder a la identidad administrada asignada por el sistema de la máquina virtual acceso a las claves de una cuenta de almacenamiento existente.

  1. Seleccione el botón +/Crear nuevo servicio de la esquina superior izquierda de Azure Portal.

  2. Seleccione Storage (Almacenamiento), luego Cuenta de almacenamiento y se mostrará un panel "Crear cuenta de almacenamiento" nuevo.

  3. Escriba un nombre para la cuenta de almacenamiento, que va a utilizar más adelante.

  4. Modelo de implementación y Tipo de cuenta deben establecerse en "Resource Manager" y "De uso general", respectivamente.

  5. Asegúrese de que Suscripción y Grupo de recursos coinciden con los que especificó cuando creó la máquina virtual en el paso anterior.

  6. Seleccione Crear.

    Captura de pantalla que muestra la nueva pantalla de creación de la cuenta de almacenamiento.

Creación de un contenedor de blobs en la cuenta de almacenamiento

Más adelante se cargará y descargará un archivo a la cuenta de almacenamiento nueva. Dado que los archivos requieren almacenamiento de blobs, es necesario crear un contenedor de blobs en el que almacenar el archivo.

  1. Vuelva a la cuenta de almacenamiento recién creada.

  2. Seleccione el vínculo Contenedores en el panel de la izquierda, en "Blob service".

  3. Seleccione + Contenedor en la parte superior de la página y se abrirá un panel "Nuevo contenedor".

  4. Asigne un nombre al contenedor, seleccione un nivel de acceso y, a continuación, seleccione Aceptar. El nombre especificado se utilizará más adelante en el tutorial.

    Captura de pantalla que muestra la pantalla de creación del contenedor de almacenamiento.

Concesión de acceso a la identidad administrada asignada por el sistema de la máquina virtual para usar una SAS de almacenamiento

Azure Storage admite la autenticación de Microsoft Entra de manera nativa, por lo que puede usar una identidad administrada asignada por el sistema de la VM para recuperar una SAS de almacenamiento de Resource Manager y usarla para acceder al almacenamiento. En este paso, va a conceder a la identidad administrada asignada por el sistema de la máquina virtual acceso a la SAS de la cuenta de almacenamiento. Asigne el rol Colaborador de la cuenta de almacenamiento a la identidad administrada en el ámbito del grupo de recursos que contiene la cuenta de almacenamiento.

Para asignar roles, consulte Asignación de roles de Azure mediante Azure Portal.

Nota:

Para más información sobre los distintos roles que puede usar para conceder permisos de almacenamiento, consulte Autorización del acceso a blobs y colas con Microsoft Entra ID.

Obtención de un token de acceso utilizando la identidad de la máquina virtual y su uso para llamar a Azure Resource Manager

En el resto del tutorial, vamos a trabajar desde la máquina virtual que se creó anteriormente.

Para completar estos pasos, necesitará un cliente SSH. Si usa Windows, puede usar el cliente SSH en el Subsistema de Windows para Linux. Si necesita ayuda para configurar las claves del cliente SSH, consulte:

Ahora que tiene el cliente SSH, continúe con los pasos siguientes:

  1. En Azure Portal, vaya a Máquinas virtuales, a la máquina virtual Linux y, luego, en la página Información general, seleccione Conectar en la parte superior. Copie la cadena para conectarse a la máquina virtual.

  2. Conéctese a la máquina virtual mediante un cliente SSH.

  3. A continuación, se le pedirá que escriba la contraseña que agregó al crear la máquina virtual Linux. Debe haber iniciado sesión correctamente.

  4. Utilice CURL para obtener un token de acceso para Azure Resource Manager.

    La solicitud CURL y la respuesta para el token de acceso están a continuación:

    curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' -H Metadata:true    
    

    Nota:

    En la solicitud anterior, el valor del parámetro "resource" tiene que coincidir exactamente con el que Microsoft Entra ID espera. Al usar el id. de recurso de Azure Resource Manager, debe incluir la barra diagonal final en el URI. En la siguiente respuesta, el elemento access_token se ha acortado para abreviar.

    {
      "access_token":"eyJ0eXAiOiJ...",
      "refresh_token":"",
      "expires_in":"3599",
      "expires_on":"1504130527",
      "not_before":"1504126627",
      "resource":"https://management.azure.com",
      "token_type":"Bearer"
    }
    

Obtención de una credencial SAS desde Azure Resource Manager para realizar llamadas de almacenamiento

Ahora vamos a utilizar CURL para realizar una llamada a Resource Manager mediante el token de acceso que se recuperó en la sección anterior, a fin de crear una credencial SAS de almacenamiento. Una vez que tenemos la credencial SAS de almacenamiento, podemos hacer llamadas a operaciones de carga y descarga de almacenamiento.

Para esta solicitud, vamos a usar los parámetros de solicitud HTTP de seguimiento para crear la credencial SAS:

{
    "canonicalizedResource":"/blob/<STORAGE ACCOUNT NAME>/<CONTAINER NAME>",
    "signedResource":"c",              // The kind of resource accessible with the SAS, in this case a container (c).
    "signedPermission":"rcw",          // Permissions for this SAS, in this case (r)ead, (c)reate, and (w)rite.  Order is important.
    "signedProtocol":"https",          // Require the SAS be used on https protocol.
    "signedExpiry":"<EXPIRATION TIME>" // UTC expiration time for SAS in ISO 8601 format, for example 2017-09-22T00:06:00Z.
}

Estos parámetros se incluyen en el cuerpo POST de la solicitud para la credencial SAS. Para más información sobre los parámetros para crear una credencial SAS, consulte la referencia de REST de SAS del servicio de lista.

Use la siguiente solicitud CURL para obtener la credencial SAS. Asegúrese de reemplazar los valores de los parámetros <SUBSCRIPTION ID>, <RESOURCE GROUP>, <STORAGE ACCOUNT NAME>, <CONTAINER NAME> y <EXPIRATION TIME> por sus propios valores. Reemplace el valor de <ACCESS TOKEN> con el token de acceso que se recuperó anteriormente:

curl https://management.azure.com/subscriptions/<SUBSCRIPTION ID>/resourceGroups/<RESOURCE GROUP>/providers/Microsoft.Storage/storageAccounts/<STORAGE ACCOUNT NAME>/listServiceSas/?api-version=2017-06-01 -X POST -d "{\"canonicalizedResource\":\"/blob/<STORAGE ACCOUNT NAME>/<CONTAINER NAME>\",\"signedResource\":\"c\",\"signedPermission\":\"rcw\",\"signedProtocol\":\"https\",\"signedExpiry\":\"<EXPIRATION TIME>\"}" -H "Authorization: Bearer <ACCESS TOKEN>"

Nota:

El texto de la dirección URL anterior distingue mayúsculas de minúsculas, por lo que tiene que fijarse en si usa mayúsculas o minúsculas para los grupos de recursos para reflejarlo adecuadamente según corresponda. Además, es importante saber que se trata de una solicitud POST, no es una solicitud GET.

La respuesta CURL devuelve la credencial SAS:

{"serviceSasToken":"sv=2015-04-05&sr=c&spr=https&st=2017-09-22T00%3A10%3A00Z&se=2017-09-22T02%3A00%3A00Z&sp=rcw&sig=QcVwljccgWcNMbe9roAJbD8J5oEkYoq%2F0cUPlgriBn0%3D"} 

En una máquina virtual Linux, cree un archivo de blob de ejemplo para cargarlo en el contenedor de Blob Storage mediante el comando siguiente:

echo "This is a test file." > test.txt

A continuación, autentíquese con el comando az storage de la CLI con la credencial SAS y cargue el archivo en el contenedor de blobs. Para este paso, necesitará instalar la CLI de Azure más reciente en su máquina virtual, si no lo ha hecho ya.

 az storage blob upload --container-name 
                        --file 
                        --name
                        --account-name 
                        --sas-token

Respuesta:

Finished[#############################################################]  100.0000%
{
  "etag": "\"0x8D4F9929765C139\"",
  "lastModified": "2017-09-21T03:58:56+00:00"
}

Además, puede descargar el archivo usando la CLI de Azure y autenticándose con la credencial SAS.

Solicitud:

az storage blob download --container-name
                         --file 
                         --name 
                         --account-name
                         --sas-token

Respuesta:

{
  "content": null,
  "metadata": {},
  "name": "testblob",
  "properties": {
    "appendBlobCommittedBlockCount": null,
    "blobType": "BlockBlob",
    "contentLength": 16,
    "contentRange": "bytes 0-15/16",
    "contentSettings": {
      "cacheControl": null,
      "contentDisposition": null,
      "contentEncoding": null,
      "contentLanguage": null,
      "contentMd5": "Aryr///Rb+D8JQ8IytleDA==",
      "contentType": "text/plain"
    },
    "copy": {
      "completionTime": null,
      "id": null,
      "progress": null,
      "source": null,
      "status": null,
      "statusDescription": null
    },
    "etag": "\"0x8D4F9929765C139\"",
    "lastModified": "2017-09-21T03:58:56+00:00",
    "lease": {
      "duration": null,
      "state": "available",
      "status": "unlocked"
    },
    "pageBlobSequenceNumber": null,
    "serverEncrypted": false
  },
  "snapshot": null
}

Pasos siguientes

En este tutorial, ha aprendido a utilizar una identidad administrada asignada por el sistema de una máquina virtual Linux para acceder a Azure Storage utilizando las credenciales de SAS. Para obtener más información sobre las credenciales SAS de Azure Storage, consulte el siguiente artículo: