Uso de directivas de acceso almacenadas para delegar el acceso a Azure Storage
Una firma de acceso compartido (SAS) es una forma segura de ofrecer acceso a los clientes sin tener que compartir las credenciales de Azure. Esta facilidad de uso incluye una desventaja. Cualquiera que tenga la SAS correcta puede acceder al archivo mientras aún sea válida. La única forma de revocar el acceso al almacenamiento es regenerar las claves de acceso. Esta regeneración exige actualizar todas las aplicaciones que usan la clave compartida anterior para que utilicen la nueva. Otra opción es asociar las SAS a una directiva de acceso almacenada.
Al agregar la funcionalidad de SAS a la aplicación, se puso de relieve la falta de flexibilidad de crear una SAS para cada imagen, cada una con sus propios controles de expiración y acceso. Quiere actualizar la aplicación para que use una directiva de acceso almacenada en el contenedor de almacenamiento. Con la directiva en vigor, quiere probar que puede actualizar la expiración y modificar todos los tokens de SAS creados.
En esta unidad, aprenderá lo siguiente:
- Usar una directiva de acceso almacenada.
- Usar la API de almacenamiento de C# para crear tokens de SAS asociados a la nueva directiva de acceso.
- Probar que los tokens de SAS se pueden cambiar mediante la actualización de la directiva de acceso almacenada en Azure Portal.
¿Qué son las directivas de acceso almacenadas?
Puede crear una directiva de acceso almacenada en cuatro tipos de recursos de almacenamiento:
- Contenedores de blob
- Recursos compartidos de archivos
- Colas
- Tablas
La directiva de acceso almacenada que se crea para un contenedor de blobs se puede usar en todos los blobs del contenedor y en el propio contenedor. La directiva de acceso almacenada se crea con las propiedades siguientes:
- Identificador: el nombre que se usa para hacer referencia a la directiva de acceso almacenada.
- Hora de inicio: un valor DateTimeOffset para la fecha y hora a la que se puede empezar a usar la directiva. Este valor puede ser NULL.
- Hora de expiración: un valor DateTimeOffset para la fecha y hora de expiración de la directiva. Después de este tiempo, se producirá un error en las solicitudes al almacenamiento con un mensaje de código de error 403.
- Permisos: la lista de permisos como cadena que puede ser uno o todos los de acdlrw.
Creación de directivas de acceso almacenadas
Puede crear una directiva de acceso almacenada con código de C# mediante Azure Portal o comandos de la CLI de Azure.
Con código C# de .NET
BlobSignedIdentifier identifier = new BlobSignedIdentifier
{
Id = "stored access policy identifier",
AccessPolicy = new BlobAccessPolicy
{
ExpiresOn = DateTimeOffset.UtcNow.AddHours(1),
Permissions = "rw"
}
};
blobContainer.SetAccessPolicy(permissions: new BlobSignedIdentifier[] { identifier });
Con el portal
En el portal, vaya a la cuenta de almacenamiento y, después, al contenedor de Blob Storage. A la izquierda, seleccione Directiva de acceso. Para agregar una nueva directiva de acceso almacenada, seleccione + Agregar directiva.
Después, puede especificar todos los parámetros necesarios.
Con comandos de la CLI de Azure
az storage container policy create \
--name <stored access policy identifier> \
--container-name <container name> \
--start <start time UTC datetime> \
--expiry <expiry time UTC datetime> \
--permissions <(a)dd, (c)reate, (d)elete, (l)ist, (r)ead, or (w)rite> \
--account-key <storage account key> \
--account-name <storage account name> \
Creación de tokens de SAS y asociación a directivas de acceso almacenadas
Ahora se va a asociar la directiva de acceso almacenada creada a los nuevos tokens de SAS necesarios. En la aplicación web de imágenes de diagnóstico de pacientes de la empresa, actualice el código existente para agregar el anterior. Después, en el método que crea el token de SAS, se hace referencia a la nueva directiva de acceso almacenada.
Todo el código existente necesario para crear el token de SAS es:
BlobSasBuilder sas = new BlobSasBuilder
{
BlobContainerName = blob.BlobContainerName,
BlobName = blob.Name,
Resource = "b",
ExpiresOn = DateTimeOffset.UtcNow.AddMinutes(1)
};
// Allow read access
sas.SetPermissions(BlobSasPermissions.Read);
y se puede reemplazar si se hace referencia a la nueva directiva de acceso.
// Create a user SAS that only allows reading for a minute
BlobSasBuilder sas = new BlobSasBuilder
{
Identifier = "stored access policy identifier"
};
Puede tener hasta cinco directivas de acceso almacenadas para un único contenedor de blobs.