Compartir vía


Creación de una SAS de delegación de usuarios para un contenedor o blob con Python

Una firma de acceso compartido (SAS) le permite conceder acceso limitado a los contenedores y blobs de la cuenta de almacenamiento. Cuando crea una SAS, especifica sus restricciones, incluidos los recursos de Azure Storage a los que puede acceder un cliente, los permisos que tiene en esos recursos y el tiempo durante el cual la SAS es válida.

Cada SAS se firma con una clave. Puede firmar una SAS de dos maneras:

  • Con una clave creada con las credenciales de Microsoft Entra. Una SAS firmada con credenciales de Microsoft Entra es una SAS de delegación de usuario. Un cliente que cree una SAS de delegación de usuarios debe tener asignado un rol RBAC de Azure que incluya la acción Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey. Para obtener más información, vea Creación de una SAS de delegación de usuarios.
  • Con la clave de la cuenta de almacenamiento. Tanto una SAS de servicio como una SAS de cuenta se firman con la clave de la cuenta de almacenamiento. El cliente que cree una SAS de servicio debe tener acceso directo a la clave de cuenta o asignársele el permiso Microsoft.Storage/storageAccounts/listkeys/action. Para obtener más información, vea Creación de una SAS de servicio o Creación de una SAS de cuenta.

Nota

Una SAS de delegación de usuario ofrece seguridad superior para una SAS firmada con la clave de la cuenta de almacenamiento. Microsoft recomienda el uso de una SAS de delegación de usuario siempre que sea posible. Para más información, consulte Concesión de acceso limitado a datos con firmas de acceso compartido (SAS).

En este artículo se muestra cómo usar las credenciales de Microsoft Entra para crear una SAS de delegación de usuarios para un contenedor o blob mediante la Biblioteca cliente de Azure Storage para Python.

Acerca de la SAS de delegación de usuarios

Un token de SAS para el acceso a un contenedor o blob se puede proteger mediante credenciales de Microsoft Entra o una clave de cuenta. Una SAS protegida con credenciales de Microsoft Entra se denomina SAS de delegación de usuarios, porque el token de OAuth 2.0 usado para firmar la SAS se solicita en nombre del usuario.

Microsoft recomienda usar credenciales de Microsoft Entra cuando sea posible como procedimiento recomendado de seguridad, en lugar de usar la clave de cuenta, que se puede poner en peligro más fácilmente. Cuando el diseño de la aplicación requiera firmas de acceso compartido, use credenciales de Microsoft Entra para crear una SAS de delegación de usuarios de cara a una seguridad superior. Para más información sobre la SAS de delegación de usuarios, consulte Creación de una SAS de delegación de usuario.

Precaución

Cualquier cliente que posea una SAS válida puede acceder a los datos de la cuenta de almacenamiento según lo permitido por esa SAS. Es importante proteger una SAS de uso malintencionado o no intencionado. Sea cauto al distribuir una SAS y tenga un plan para revocar una SAS en peligro.

Para obtener más información sobre las firmas de acceso compartido, consulte Otorgar acceso limitado a recursos de Azure Storage con firmas de acceso compartido (SAS).

Asignación de roles de Azure para el acceso a los datos

Cuando una entidad de seguridad de Microsoft Entra intenta acceder a los datos, esa entidad de seguridad debe tener permisos para el recurso. Si la entidad de seguridad es una identidad administrada en Azure o una cuenta de usuario de Microsoft Entra que ejecuta código en el entorno de desarrollo, se le debe asignar un rol de Azure que conceda acceso a los datos. Para obtener información sobre la asignación de permisos mediante Azure RBAC, consulte Asignación de un rol de Azure para acceder a datos de blobs.

Configuración del proyecto

Para trabajar con los ejemplos de código de este artículo, siga los pasos siguientes a fin de configurar el proyecto.

Instalar paquetes

Instale los siguientes paquetes mediante pip install:

pip install azure-storage-blob azure-identity

Configuración del código de la aplicación

Agregue las siguientes directivas import:

from azure.identity import DefaultAzureCredential
from azure.storage.blob import (
    BlobServiceClient,
    ContainerClient,
    BlobClient,
    BlobSasPermissions,
    ContainerSasPermissions,
    UserDelegationKey,
    generate_container_sas,
    generate_blob_sas
)

Obtención de una credencial de token autenticada

Para obtener una credencial de token que el código pueda usar para autorizar solicitudes para Blob Storage, cree una instancia de la clase DefaultAzureCredential. Para más información sobre el uso de la clase DefaultAzureCredential para autorizar a una identidad administrada el acceso a Blob Storage, consulte Biblioteca cliente de Azure Identity para Python.

En el fragmento de código siguiente se muestra cómo obtener la credencial de token autenticada y usarla para crear un cliente de servicio para Blob Storage:

# Construct the blob endpoint from the account name
account_url = "https://<storage-account-name>.blob.core.windows.net"

#Create a BlobServiceClient object using DefaultAzureCredential
blob_service_client = BlobServiceClient(account_url, credential=DefaultAzureCredential())

Para más información sobre cómo autorizar el acceso a Blob Storage desde las aplicaciones con el SDK de Python, consulte Autenticación de aplicaciones Python en servicios de Azure.

Obtención de la clave de delegación de usuario

Cada SAS se firma con una clave. Para crear una SAS de delegación de usuarios, primero debe solicitar una clave de delegación de usuario, que se usará para firmar la SAS. La clave de delegación de usuarios es análoga a la clave de cuenta usada para firmar una SAS de servicio o una SAS de cuenta, excepto en que se basa en las credenciales de Microsoft Entra. Cuando un cliente solicita una clave de delegación de usuario mediante un token de OAuth 2.0, Blob Storage devuelve la clave de delegación de usuario en nombre del usuario.

Una vez que tenga la clave de delegación de usuario, puede usar esa clave para crear cualquier número de firmas de acceso compartido de delegación de usuarios durante la vigencia de la clave. La clave de delegación de usuarios es independiente del token de OAuth 2.0 que se usa para adquirirla, por lo que no es necesario renovar el token siempre y cuando la clave siga siendo válida. Puede especificar el período de tiempo que la clave sigue siendo válida, hasta un máximo de siete días.

Use uno de los métodos siguientes para solicitar la clave de delegación de usuario:

En el siguiente ejemplo de código se muestra cómo solicitar la clave de delegación de usuarios:

def request_user_delegation_key(self, blob_service_client: BlobServiceClient) -> UserDelegationKey:
    # Get a user delegation key that's valid for 1 day
    delegation_key_start_time = datetime.datetime.now(datetime.timezone.utc)
    delegation_key_expiry_time = delegation_key_start_time + datetime.timedelta(days=1)

    user_delegation_key = blob_service_client.get_user_delegation_key(
        key_start_time=delegation_key_start_time,
        key_expiry_time=delegation_key_expiry_time
    )

    return user_delegation_key

Creación de una SAS de delegación de usuario

Puede crear una SAS de delegación de usuarios para un contenedor o blob, en función de las necesidades de la aplicación.

Una vez que haya obtenido la clave de delegación de usuarios, puede crear una SAS de delegación de usuarios. Puede crear una SAS de delegación de usuarios para delegar el acceso limitado a un recurso de contenedor con el método siguiente:

La clave de delegación de usuarios para firmar la SAS se pasa al método como el argumento user_delegation_key. Los permisos otorgados se pasan al método como el argumento permission y se definen en la clase ContainerSasPermissions.

En el siguiente ejemplo de código se muestra cómo generar una SAS de delegación de usuarios para un contenedor:

def create_user_delegation_sas_container(self, container_client: ContainerClient, user_delegation_key: UserDelegationKey):
    # Create a SAS token that's valid for one day, as an example
    start_time = datetime.datetime.now(datetime.timezone.utc)
    expiry_time = start_time + datetime.timedelta(days=1)

    sas_token = generate_container_sas(
        account_name=container_client.account_name,
        container_name=container_client.container_name,
        user_delegation_key=user_delegation_key,
        permission=ContainerSasPermissions(read=True),
        expiry=expiry_time,
        start=start_time
    )

    return sas_token

Usar una SAS de delegación de usuarios para autorizar un objeto de cliente

Puede usar una SAS de delegación de usuarios para autorizar a un objeto de cliente a realizar operaciones en un contenedor o blob en función de los permisos concedidos por la SAS.

En el siguiente ejemplo de código, se muestra cómo usar la SAS de delegación de usuarios creada en el ejemplo anterior para autorizar un objeto ContainerClient. Este objeto de cliente se puede usar para realizar operaciones en el recurso de contenedor en función de los permisos concedidos por la SAS.

# The SAS token string can be appended to the resource URL with a ? delimiter
# or passed as the credential argument to the client constructor
sas_url = f"{container_client.url}?{sas_token}"

# Create a ContainerClient object with SAS authorization
container_client_sas = ContainerClient.from_container_url(container_url=sas_url)

Recursos

Para más información sobre cómo crear una SAS de delegación de usuarios con la biblioteca cliente de Azure Blob Storage para Python, consulte los siguientes recursos.

Ejemplos de código

Operaciones de API REST

El SDK de Azure para Python contiene bibliotecas que se crean a partir de la API REST de Azure, lo que le permite interactuar con las operaciones de API REST a través de paradigmas conocidos de Python. El método de biblioteca cliente para obtener una clave de delegación de usuarios usa las siguientes operaciones de la API de REST:

Recursos de la biblioteca cliente

Consulte también

  • Este artículo forma parte de la guía para desarrolladores de Blob Storage para Python. Para más información, consulte la lista completa de artículos de la guía para desarrolladores en Compilación de la aplicación de Python.