Azure Storage Accounts son servicios fundamentales en Microsoft Azure que proporcionan almacenamiento en la nube escalable, seguro y altamente disponible para diversos tipos de datos, incluyendo blobs (binary large objects), files, queues y tables. Sirven como contenedores que agrupan estos distintos servicios de almacenamiento bajo un único namespace para facilitar la gestión.
Principales opciones de configuración:
Cada Storage Account debe tener un nombre único en todo Azure.
Cada Storage Account se despliega en una región o en una zona extendida de Azure.
Es posible seleccionar la versión premium de la cuenta de almacenamiento para mayor rendimiento.
Es posible elegir entre 4 tipos de redundancia para protegerse contra fallos de rack, disco y centro de datos.
Opciones de configuración de seguridad:
Require secure transfer for REST API operations: exigir TLS en cualquier comunicación con la cuenta de Storage.
Allows enabling anonymous access on individual containers: permite habilitar acceso anónimo en contenedores individuales; si no está, no será posible activarlo en el futuro.
Enable storage account key access: si no está habilitado, el acceso con Shared Keys quedará prohibido.
Minimum TLS version
Permitted scope for copy operations: permitir desde cualquier storage account, desde cualquier storage account del mismo Entra tenant o desde storage accounts con private endpoints en la misma red virtual.
Blob Storage options:
Allow cross-tenant replication
Access tier: Hot (datos de acceso frecuente), Cool y Cold (datos raramente accedidos)
Opciones de red:
Network access:
Allow from all networks
Allow from selected virtual networks and IP addresses
Disable public access and use private access
Private endpoints: permite una conexión privada a la cuenta de Storage desde una red virtual.
Opciones de protección de datos:
Point-in-time restore for containers: permite restaurar contenedores a un estado anterior.
Requiere que estén habilitados versioning, change feed y blob soft delete.
Enable soft delete for blobs: habilita un periodo de retención en días para blobs eliminados (incluso sobrescritos).
Enable soft delete for containers: habilita un periodo de retención en días para contenedores eliminados.
Enable soft delete for file shares: habilita un periodo de retención en días para file shares eliminados.
Enable versioning for blobs: mantiene versiones previas de tus blobs.
Enable blob change feed: conserva registros de creación, modificación y eliminación de blobs.
Enable version-level immutability support: permite establecer una política de retención basada en tiempo a nivel de cuenta que se aplicará a todas las versiones de blobs.
Version-level immutability support y point-in-time restore for containers no pueden habilitarse simultáneamente.
Opciones de cifrado:
Encryption type: es posible usar Microsoft-managed keys (MMK) o Customer-managed keys (CMK).
Enable infrastructure encryption: permite cifrar los datos doblemente “for more security”.
Static websites se sirven desde el contenedor especial $web a través de un endpoint específico por región, por ejemplo https://<account>.z13.web.core.windows.net/.
El contenedor $web puede reportar publicAccess: null vía la blob API, pero los archivos siguen siendo alcanzables a través del static site endpoint, por lo que dejar artefactos de config/IaC allí puede leak secrets.
Flujo rápido de auditoría:
# Identify storage accounts with static website hosting enabled
az storage blob service-properties show --account-name <acc-name> --auth-mode login
# Enumerate containers (including $web) and their public flags
az storage container list --account-name <acc-name> --auth-mode login
# List files served by the static site even when publicAccess is null
az storage blob list --container-name '$web' --account-name <acc-name> --auth-mode login
# Pull suspicious files directly (e.g., IaC tfvars containing secrets/SAS)
az storage blob download -c '$web' --name iac/terraform.tfvars --file /dev/stdout --account-name <acc-name> --auth-mode login
Localizar cuentas de almacenamiento que pueden exponer datos: az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'. Si allowBlobPublicAccess es false no puedes poner los contenedores como públicos.
Inspeccionar cuentas riesgosas para confirmar el indicador y otras configuraciones débiles: az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'.
Enumerar exposición a nivel de contenedor donde el flag esté habilitado:
az storage container list --account-name <acc> \
--query '[].{name:name, access:properties.publicAccess}'
"Blob": lecturas anónimas permitidas solo cuando se conoce el nombre del blob (sin listado).
"Container": listado anónimo + lectura de cada blob.
null: privado; se requiere autenticación.
Probar acceso sin credenciales:
Si publicAccess es Container, el listado anónimo funciona: curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list".
Para ambos Blob y Container, la descarga anónima del blob funciona cuando se conoce el nombre:
az storage blob download -c <container> -n <blob> --account-name <acc> --file /dev/stdout
# or via raw HTTP
curl "https://<acc>.blob.core.windows.net/<container>/<blob>"
Las cuentas de almacenamiento tienen claves de acceso que pueden usarse para acceder a ellas. Esto proporciona acceso completo a la cuenta de almacenamiento.
Es posible generar Claves compartidas firmadas con las claves de acceso para autorizar el acceso a ciertos recursos mediante una URL firmada.
Note
Ten en cuenta que la parte CanonicalizedResource representa el recurso del servicio de almacenamiento (URI). Y si alguna parte de la URL está codificada, también debe estar codificada dentro de CanonicalizedResource.
Note
Esto se usa por defecto con la cli az para autenticar solicitudes. Para que use las credenciales del principal de Entra ID indica el parámetro --auth-mode login.
Es posible generar una clave compartida para los servicios blob, queue y file firmando la siguiente información:
Las Firmas de acceso compartido (SAS) son URLs seguras y con tiempo limitado que conceden permisos específicos para acceder a recursos en una cuenta de Azure Storage sin exponer las claves de acceso de la cuenta. Mientras que las claves de acceso proporcionan acceso administrativo completo a todos los recursos, las SAS permiten un control granular al especificar permisos (como lectura o escritura) y definir una fecha de expiración.
SAS de delegación de usuario: Esto se crea a partir de un principal de Entra ID que firmará la SAS y delegará los permisos del usuario a la SAS. Solo puede usarse con blob and data lake storage (docs). Es posible revocar todas las SAS delegadas de usuario generadas.
Aunque es posible generar una SAS de delegación con permisos “mayores” a los que tiene el usuario, si el principal no los posee no funcionará (sin privesc).
SAS de servicio: Esta se firma usando una de las claves de acceso de la cuenta de almacenamiento. Puede emplearse para otorgar acceso a recursos específicos en un único servicio de almacenamiento. Si la clave se renueva, la SAS dejará de funcionar.
SAS de cuenta: También se firma con una de las claves de acceso de la cuenta de almacenamiento. Otorga acceso a recursos a través de los servicios de una cuenta de almacenamiento (Blob, Queue, Table, File) y puede incluir operaciones a nivel de servicio.
Al generar una SAS es necesario indicar los permisos que debe otorgar. Dependiendo del objeto sobre el que se genere la SAS, se pueden incluir permisos diferentes. Por ejemplo:
Azure Blob Storage ahora soporta el Protocolo de Transferencia de Archivos SSH (SFTP), permitiendo la transferencia y gestión segura de archivos directamente en Blob Storage sin requerir soluciones personalizadas o productos de terceros.
Soporte de protocolo: SFTP funciona con cuentas de Blob Storage configuradas con hierarchical namespace (HNS). Esto organiza los blobs en directorios y subdirectorios para facilitar la navegación.
Seguridad: SFTP utiliza identidades de usuario locales para la autenticación y no se integra con RBAC ni ABAC. Cada usuario local puede autenticarse mediante:
contraseñas generadas por Azure
pares de claves SSH públicas/privadas
Permisos granulares: Se pueden asignar permisos como Leer, Escribir, Eliminar y Listar a usuarios locales para hasta 100 contenedores.
Consideraciones de red: Las conexiones SFTP se realizan a través del puerto 22. Azure soporta configuraciones de red como firewalls, private endpoints o virtual networks para securizar el tráfico SFTP.
Hierarchical Namespace: HNS debe estar habilitado al crear la cuenta de almacenamiento.
Cifrado soportado: Requiere algoritmos criptográficos aprobados por Microsoft Security Development Lifecycle (SDL) (p.ej., rsa-sha2-256, ecdsa-sha2-nistp256).
Configuración de SFTP:
Habilitar SFTP en la cuenta de almacenamiento.
Crear identidades de usuario locales con permisos apropiados.
Configurar directorios home para los usuarios para definir su ubicación inicial dentro del contenedor.
az storage blob show –account-name –container-name –sas-token ‘se=2024-12-31T23%3A59%3A00Z&sp=racwdxyltfmei&sv=2022-11-02&sr=c&sig=ym%2Bu%2BQp5qqrPotIK5/rrm7EMMxZRwF/hMWLfK1VWy6E%3D’ –name ‘asd.txt’