El servicio de cuentas de almacenamiento, contenedores y blobs en Azure es un buen sistema de almacenamiento para todas nuestras soluciones en Azure, con el paso del tiempo seguro que tenemos allí un buen montón de información. Pero toda esta información, si no tenemos en cuenta los niveles de acceso puede acabar siendo accesible públicamente. Vamos a entender el problema y ajustar el acceso en el Cybertruco de hoy.

azurevm2

 

Los blobs (Binary large object) son todos los datos no estructurados que podemos almacenar en las cuentas de almacenamiento en Azure, ahí se incluyen por ejemplo todo tipo de ficheros.
Para entender en qué pueden afectar los permisos que veremos, primero vamos a comentar rápidamente la estructura de estos recursos.

En un primer nivel a modo de raíz tenemos las cuentas de almacenamiento.Dentro de estas cuentas de almacenamiento tenemos los contenedores y dentro de ellos los blobs en si.

En este servicio encontramos tres tipos de acceso

  • Private - Este sería el modo por defecto y deshabilita el acceso anónimo
  • Blob - permite acceso no autenticado a un fichero siempre y cuando sepas el nombre del mismo
  • Container - también permite acceso público y además permite el listado de directorios

Lo primero que haremos será comprobar el acceso que tenemos definido, para ello podemos acceder a las cuentas de almacenamiento que tengamos y desde allí revisar la configuración de los diferentes contenedores de almacenamiento presentes.

El nivel de acceso de Blobs, sería el adecuado para por ejemplo una web, ya que si alguien sabe la ruta y nombre de un archivo puede acceder a él. En cambio para otro tipo de repositorio, este nivel es muy peligroso ya que puede permitir a una atacante a través del conocimiento a partir de links públicos de, primero entender tu estructura de almacenamiento a nivel de carpetas y segundo, de identificar el tipo de nomenclatura utilizada para los ficheros y de esta manera descubrir otros recursos a los que no debería tener acceso.

Por lo que el aviso es claro, si un fichero contiene información que no pondrías públicamente, no lo pongas en un contenedor con acceso de Blob.

Como decíamos antes, luego tenemos el acceso de "Container". En este caso el atacante únicamente tendría que conocer el nombre especificado al principio de la URL standard, *.blob.core.windows.net que corresponde a la cuenta de almacenamiento para tener acceso a todo el material. Si lo pensamos un poco entenderemos que realmente es sencillo encontrar ese tipo de repositorios con sencillas búsquedas ya que los nombres han de ser únicos entre todos los clientes.

El nombre en sí del "Container" ya solo debe ser único dentro de la cuenta de almacenamiento. Este se encuentra un nivel por debajo de la misma y no puede ser directamente listado lo cual hace que incluso cuentas de almacenamiento expuestas con el nivel de acceso "Container" tengan una cierta privacidad, pero una vez el atacante encuentre el nombre, podrá listar el contenido fácilmente con una llamada API. Tras esto obtendría desde el resultado en XML o JSON todas las urls de los ficheros del contenedor.

Si esto ocurriera, el atacante tendría acceso a esos ficheros aunque cambiáramos luego el nivel de acceso a "Blob", ya que seguiría conociendo la ruta a los mismos. Por lo cual el primer paso sería detectar si tenemos algún contenedor expuesto, esto lo podemos hacer a través del Azure Security Center o de Powershell como veremos aquí.

Conectando a Azure con Powershell

Como siempre ejecutaremos primero la conexión con el siguiente cmdlet

Connect-AzAccount

Si tenemos más de una subscripción la seleccionaremos con

Get-AzSubscription
Select-AzSubscription -Subscription "nombre de subscripción"

Configurar acceso a nivel de cuenta de almacenamiento con Powershell

Con Powershell, podemos comprobar y modificar fácilmente el nivel de acceso de nuestra cuenta de almacenamiento.

Para ello primero especificaremos en un par de variables el nombre de nuestra cuenta de almacenamiento y el nombre del grupo de recursos al que pertenece la misma

$rgName = "nombre de nuestro grupo de recursos"
$accountName = "nombre de nuestra cuenta de almacenamiento"

Para comprobar el nivel de acceso a nuestra cuenta de almacenamiento utilizaremos el cmdlet Get-AzStorageAccount comprobando la propiedad AllowBlobPublicAccess del objeto.

(Get-AzStorageAccount -ResourceGroupName $rgName -Name $accountName).AllowBlobPublicAccess

Modificando el nivel de acceso

En caso que queramos modificar el nivel de acceso, necesitaremos el cmdlet Set-AzStorageAccount para modificar la misma propiedad y denegar el acceso público a nivel de cuenta de almacenamiento.

Set-AzStorageAccount -ResourceGroupName $rgName `
-Name $accountName `
-AllowBlobPublicAccess $false

Una vez hecho esto podemos volver a comprobar que efectivamente el cambio está realizado. Ahora el nivel de acceso propio de los diferentes contenedores ya no tendrá efecto y cualquier acceso público no identificado será siempre rechazado. Con esto evitaremos problemas ya sea debido a errores o cambios intencionados a nivel de contenedor.

Configurar acceso a nivel de contenedor con Powershell

La configuracion a nivel de cuenta de almacenamiento como decíamos manda sobre la de sus contenedores, pero en el caso que queramos solo especificarlo a nivel de contenedor utilizaremos el cmdlet Set-AzStorageContainerAcl. Como antes especificamos los nombres del grupo de recursos, la cuenta de almacenamiento y en este caso también el nombre del.contenedor en variables

$rgName = "nombre de nuestro grupo de recursos"
$accountName = "nombre de nuestra cuenta de almacenamiento"
$containerName = "nombre de nuestro contenedor"

Primero hemos de obtener en una variable también el contexto de nuestra cuenta de almacenamiento a través de la propiedad Context de la cuenta de almacenamiento. Recordemos que el contexto en Azure contiene datos de la subscripción y el login para poder ejecutar como en este caso cmdlets más avanzados.

$storageAccount = Get-AzStorageAccount -ResourceGroupName $rgName -Name $accountName
$ctx = $storageAccount.Context

Una vez teniendo esto leemos el nivel de acceso del contenedor con

Get-AzStorageContainerAcl -Container $containerName -Context $ctx

De manera similar podemos cambiar ese acceso con

Set-AzStorageContainerAcl -Container $containerName -Permission Container -Context $ctx

Espero que os sea útil para evitar perdidas de información.

Mas info en

https://docs.microsoft.com/en-us/azure/storage/blobs/anonymous-read-access-prevent

https://docs.microsoft.com/en-us/azure/storage/blobs/anonymous-read-access-configure