Uso de firmas de acceso compartido para delegar el acceso a Azure Storage

Completado

Mediante una firma de acceso compartido (SAS), puede delegar el acceso a los recursos. Los clientes no tienen acceso directo a las credenciales de la cuenta de almacenamiento y, en un nivel granular, se controla a qué acceden.

Después de investigar todas las opciones de autorización, decide examinar una SAS con más detalle. Le interesará crear y usar una SAS en una aplicación web de .NET en C#. También quiere seguir los procedimientos recomendados de Microsoft sobre cuándo y cómo usar una SAS.

En esta unidad, revisará el funcionamiento de una SAS en un nivel técnico y el código de C# que debe escribir para usarla.

Funcionamiento de las firmas de acceso compartido

Una SAS tiene dos componentes: un URI que apunta a uno o varios recursos de almacenamiento y un token que indica cómo puede acceder a los recursos el cliente.

En un URI único como https://medicalrecords.blob.core.windows.net/patient-images/patient-116139-nq8z7f.jpg?sp=r&st=2020-01-20T11:42:32Z&se=2020-01-20T19:42:32Z&spr=https&sv=2019-02-02&sr=b&sig=SrW1HZ5Nb6MbRzTbXCaPm%2BJiSEn15tC91Y4umMPwVZs%3D, puede distinguir el URI del token de SAS de la manera siguiente:

Identificador URI Token de SAS
https://medicalrecords.blob.core.windows.net/patient-images/patient-116139-nq8z7f.jpg? sp=r&st=2020-01-20T11:42:32Z&se=2020-01-20T19:42:32Z&spr=https&sv=2019-02-02&sr=b&sig=SrW1HZ5Nb6MbRzTbXCaPm%2BJiSEn15tC91Y4umMPwVZs%3D

El token de SAS contiene los siguientes componentes, o parámetros de consulta.

Parámetro de consulta Nombre del campo Ejemplo Descripción
sp permiso firmado sp=r Indica una o varias operaciones que el cliente puede realizar. Los valores se pueden componer: a (agregar), c (crear), d (eliminar), l (enumerar), r (leer) y w (escribir). sp=r es solo lectura; sp=acdlrw concede todos los derechos disponibles.
st hora de inicio st=2020-01-20T11:42:32Z La fecha y hora de inicio del acceso.
se hora de expiración se=2020-01-20T19:42:32Z La fecha y hora de finalización del acceso. En función de la fecha de inicio, este ejemplo concede ocho horas de acceso.
spr protocolo firmado spr=https El protocolo admitido para una solicitud realizada con la SAS. Campo opcional, que tiene valores posibles de HTTPS y HTTP (el valor predeterminado) o solo HTTPS.
sv versión firmada sv=2019-02-02 Versión de servicio de la API de almacenamiento que se va a usar.
sr ámbito de recurso sr=b Tipo de almacenamiento al que se accede. Los valores disponibles incluyen b (blob), c (contenedor), d (directorio), f (archivo) y s (recurso compartido).
sig firma sig=SrW1...wVZs%3D La firma criptográfica.

La firma se firma con la clave de la cuenta de almacenamiento cuando se crea una firma de acceso compartido de servicio o cuenta. Si usa una entidad de seguridad de Microsoft Entra con acceso al almacenamiento, se crea una firma de acceso compartido de delegación de usuarios. Conceda también la acción Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey a la entidad de seguridad.

Creación de una SAS en .NET

Dado que la empresa proporciona acceso a terceros, no puede usar Microsoft Entra ID para crear entidades de servicio para cada tercero que requiera acceso a las imágenes médicas. La aplicación usa una clave de cuenta de almacenamiento para cada archivo individual. Los siguientes pasos muestran cómo crear una SAS mediante código de C#.

Creación de un cliente de contenedor de blobs para conectarse a la cuenta de almacenamiento en Azure

BlobContainerClient container = new BlobContainerClient( "ConnectionString", "Container" );

Recuperación del blob para que el se quiere crear un token de SAS y creación de un objeto BlobClient

foreach (BlobItem blobItem in container.GetBlobs())
{
    BlobClient blob = container.GetBlobClient(blobItem.Name);
}

Creación de un objeto BlobSasBuilder para el blob que se usa para generar el token de SAS

BlobSasBuilder sas = new BlobSasBuilder
{
    BlobContainerName = blob.BlobContainerName,
    BlobName = blob.Name,
    Resource = "b",
    ExpiresOn = DateTimeOffset.UtcNow.AddMinutes(1)
};

// Allow read access
sas.SetPermissions(BlobSasPermissions.Read);

Autenticación de una llamada al método ToSasQueryParameters del objeto BlobSasBuilder

StorageSharedKeyCredential storageSharedKeyCredential = new StorageSharedKeyCredential( "AccountName", "AccountKey");

sasToken = sas.ToSasQueryParameters(storageSharedKeyCredential).ToString();

Procedimientos recomendados

Para reducir los posibles riesgos del uso de una SAS, Microsoft proporciona varias instrucciones:

  • Para distribuir de forma segura una SAS y evitar ataques de intermediario ("Man in the Middle"), use siempre HTTPS.
  • La SAS más segura es la delegación de usuarios. Úsela siempre que sea posible, ya que elimina la necesidad de almacenar la clave de la cuenta de almacenamiento en el código. Microsoft Entra ID debe usarse para administrar credenciales; puede que esta opción no sea posible para la solución.
  • Intente establecer la hora de expiración en el valor más pequeño que sea útil. Si una clave de SAS se pone en peligro, solo se podrá aprovechar durante un breve período de tiempo.
  • Aplique la regla de privilegios mínimos necesarios. Conceda solo el acceso necesario. Por ejemplo, en la aplicación, el acceso de solo lectura es suficiente.
  • Hay algunas situaciones en las que una SAS no es la solución correcta. Cuando el uso de una SAS suponga un riesgo inaceptable, cree un servicio de nivel intermedio para administrar los usuarios y su acceso al almacenamiento.

La forma más flexible y segura de usar una SAS de servicio o de cuenta consiste en asociar los tokens de SAS a una directiva de acceso almacenada. En una unidad posterior, explorará estas ventajas y cómo funcionan.