Tutorial: Uso de las identidades administradas asignadas por el sistema de una máquina virtual Windows para acceder a Azure Storage utilizando una credencial de SAS

Las 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.

Este tutorial muestra cómo usar una identidad asignada por el sistema para una máquina virtual Windows a fin de obtener una credencial de Firma de acceso compartido (SAS) del almacenamiento. En concreto, una credencial SAS de servicio.

Una credencial SAS de servicio permite conceder acceso limitado a los objetos de una cuenta de almacenamiento, durante un período de tiempo limitado y con un servicio específico (en nuestro caso, el servicio blob), sin exponer una clave de acceso a la cuenta. 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 PowerShell de Azure Storage. Aprenderá a:

  • Crear una 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

Prerequisites

Nota:

Se recomienda usar el módulo Azure Az de PowerShell para interactuar con Azure. Consulte Instalación de Azure PowerShell para empezar. Para más información sobre cómo migrar al módulo Az de PowerShell, consulte Migración de Azure PowerShell de AzureRM a Az.

Crear una cuenta de almacenamiento

Si aún no tiene una, creará ahora 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 la credencial de SAS 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 está usando para este tutorial.

  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 en la que se muestra cómo crear una 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 nueva cuenta de almacenamiento. 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 cómo crear un 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 no admite la autenticación de Microsoft Entra de forma nativa. No obstante, puede usar una identidad administrada para recuperar una SAS de almacenamiento de Resource Manager y usar la SAS 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.

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

  2. Seleccione Access Control (IAM) .

  3. Seleccione Agregar>Agregar asignación de roles para abrir la página Agregar asignación de roles.

  4. Asigne el siguiente rol. Para asignar roles, consulte Asignación de roles de Azure mediante Azure Portal.

    Configuración Valor
    Role Colaborador de la cuenta de almacenamiento
    Asignar acceso a Identidad administrada
    Asignada por el sistema Máquina virtual
    Seleccionar <La máquina virtual Windows>

    Captura de pantalla que muestra la página para añadir una asignación de roles.

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, trabajaremos desde la máquina virtual.

En esta parte tendrá que usar los cmdlets de PowerShell de Azure Resource Manager. Si no lo tiene instalado, descargue la versión más reciente antes de continuar.

  1. En Azure Portal, vaya a Máquinas virtuales, vaya a la máquina virtual Windows y, a continuación, desde la página Información general, seleccione Conectar en la parte superior.

  2. Escriba su nombre de usuario y contraseña que agregó cuando creó la máquina virtual Windows.

  3. Ahora que ha creado una Conexión a Escritorio remoto con la máquina virtual:

  4. Abra PowerShell en la sesión remota y use Invoke-WebRequest para obtener un token de Azure Resource Manager de la identidad administrada local para el punto de conexión de recursos de Azure.

       $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' -Method GET -Headers @{Metadata="true"}
    

    Nota:

    El valor del parámetro "resource" debe 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.

    A continuación, extraiga el elemento "Content", que se almacena como una cadena con formato de notación de objetos JavaScript (JSON) en el objeto $response.

    $content = $response.Content | ConvertFrom-Json
    

    Luego, extraiga el token de acceso de la respuesta.

    $ArmToken = $content.access_token
    

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

Ahora vamos a utilizar PowerShell 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 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.

En primer lugar, convierta los parámetros a JSON y después llame al punto de conexión listServiceSas del almacenamiento para crear las credenciales SAS:

$params = @{canonicalizedResource="/blob/<STORAGE-ACCOUNT-NAME>/<CONTAINER-NAME>";signedResource="c";signedPermission="rcw";signedProtocol="https";signedExpiry="2017-09-23T00:00:00Z"}
$jsonParams = $params | ConvertTo-Json
$sasResponse = Invoke-WebRequest -Uri https://management.azure.com/subscriptions/<SUBSCRIPTION-ID>/resourceGroups/<RESOURCE-GROUP>/providers/Microsoft.Storage/storageAccounts/<STORAGE-ACCOUNT-NAME>/listServiceSas/?api-version=2017-06-01 -Method POST -Body $jsonParams -Headers @{Authorization="Bearer $ArmToken"}

Nota:

La dirección URL distingue mayúsculas de minúsculas, por lo tanto, asegúrese de que usa las mismas mayúsculas y minúsculas que al asignar el nombre al grupo de recursos, así como la "G" mayúscula de "resourceGroups".

Ahora podemos extraer la credencial SAS de la respuesta:

$sasContent = $sasResponse.Content | ConvertFrom-Json
$sasCred = $sasContent.serviceSasToken

Si examina la credencial SAS, verá algo parecido a esto:

PS C:\> $sasCred
sv=2015-04-05&sr=c&spr=https&se=2017-09-23T00%3A00%3A00Z&sp=rcw&sig=JVhIWG48nmxqhTIuN0uiFBppdzhwHdehdYan1W%2F4O0E%3D

A continuación, creamos un archivo llamado "test.txt". Seguidamente, use la credencial SAS para autenticarse con el cmdlet New-AzStorageContent, cargue el archivo en el contenedor de blobs y, después, descargue el archivo.

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

Asegúrese de instalar en primer lugar los cmdlets de Azure Storage, mediante Install-Module Azure.Storage. Después, cargue el blob recién creado utilizando el cmdlet Set-AzStorageBlobContent de PowerShell:

$ctx = New-AzStorageContext -StorageAccountName <STORAGE-ACCOUNT-NAME> -SasToken $sasCred
Set-AzStorageBlobContent -File test.txt -Container <CONTAINER-NAME> -Blob testblob -Context $ctx

Respuesta:

ICloudBlob        : Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob
BlobType          : BlockBlob
Length            : 56
ContentType       : application/octet-stream
LastModified      : 9/21/2017 6:14:25 PM +00:00
SnapshotTime      :
ContinuationToken :
Context           : Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext
Name              : testblob

También puede descargar el blob que ha cargado mediante el cmdlet Get-AzStorageBlobContent de PowerShell:

Get-AzStorageBlobContent -Blob testblob -Container <CONTAINER-NAME> -Destination test2.txt -Context $ctx

Respuesta:

ICloudBlob        : Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob
BlobType          : BlockBlob
Length            : 56
ContentType       : application/octet-stream
LastModified      : 9/21/2017 6:14:25 PM +00:00
SnapshotTime      :
ContinuationToken :
Context           : Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext
Name              : testblob

Pasos siguientes

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