Limitar el borrado de blobs en Azure Storage con permisos muy específicos usando RBAC y conditions

Hace no mucho tiempo, necesitábamos crear un proceso que borrara ciertos blobs de unas rutas determinadas de unos storage accounts. Para ello creamos un rbac custom role que sólo permitiera listar los blobs y borrarlos.

Pero como a mí, y supongo que a más de uno como yo, cuando oye la palabra borrar pues le da un poco de “miedito” (jajaja). Y claro el permiso de borrar los blobs es para todo el storage account no sólo las carpeta que queremos borrar.


Entonces buscando, descubrimos una forma llamada Conditions, en la que aparte de asignar un rol, puedes especificar unas condiciones específicas de qué puedes hacer con ese permiso que has asignado.

Conditions actualmente solo esta disponible para roles custom y out-of-the-box que tienen permisos de tipo blob storage data actions y queue storage data actions. Estos roles out-of-the-box son:

  • Storage Blob Data Contributor
  • Storage Blob Data Owner
  • Storage Blob Data Reader
  • Storage Queue Data Contributor
  • Storage Queue Data Message Processor
  • Storage Queue Data Message Sender
  • Storage Queue Data Reader

Para más información sobre Conditions visitar la siguiente página:

https://learn.microsoft.com/en-us/azure/role-based-access-control/conditions-role-assignments-portal

Con un custom rol que sólo borré blobs y haciendo uso de Conditions, ya tenemos todos los ingredientes para poder crear nuestro proceso de manera segura.

Imaginemos que tenemos la siguiente estructura de carpetas y ficheros en un Storage Account:

Nosotros queremos que únicamente se pueda borrar los blobs de la carpeta PleaseDeleteMe.

Pongámonos manos a la obra, los pasos a seguir serían:

  1. Crear un custom rol que solo permita listar y borrar blobs. Lo más recomendable es crear el rol haciendo uso de Powershell. Para ello creamos un fichero llamado StorageBlobDeleteOperator.json con el siguiente contenido:

    Nosotros vamos a crear este rol a nivel de suscripción. Por ello en la línea 21 de este json deberéis sustituir [PUT_YOUR_SUBSCRIPTIONID_HERE] por vuestro id de vuestra suscripción.

    Vale una vez tenemos el json configurado, lo guardamos. En nuestro ejemplo, vamos a guardarlo en la ruta C:\customroles\StorageBlobDeleteOperator.json

  2. Ahora vamos a crear el custom rol usando el siguiente script de Powershell:

    En la línea 2 debes poner tu identificador del tenant.

    En la línea 3 debes de poner tu identificador de la suscripción.

    Por último debes en la línea 4 , la ruta donde esta el json con la definición del custom rol.

    En las líneas 7 y 8 nos identificamos y seleccionamos el contexto en la suscripción donde vamos a crear el rol.

    Por último, en la línea 11 vamos a crear el custom rol.

  3. Vale ya tenemos nuestro custom role creado. Vamos desde el portal de Azure al storage account donde queremos asignar el custom rol. Pulsamos en Access Control (IAM) –> + Add –> Add role assignment

  4. Ahora buscamos el rol que hemos creado, recordad Storage Blob Delete Operator. Seleccionamos el rol y pulsamos en Next.

  5. Seleccionamos a quien vamos a asignar el rol, ya sea usuario, service principal y managed identity. Por último pulsamos en Next.

  6. En este paso viene lo bueno, configurar las condiciones. Pulsamos en + Add condition

  7. Pulsamos en + Add action

  8. Seleccionamos la opción Delete a blob. Luego pulsamos en Select.

  1. Pulsamos en + Add expression
  1. Ponemos los siguientes valores:

    Aquí estamos diciendo, permitimos borrar blobs, únicamente en los cuales la ruta hacia ese blob empiece (sin importarme si esta en mayúsculas o minúsculas) por PleaseDeleteMe.

  2. Pulsamos en Save

  3. Por último pulsamos en Review + assign

Y ya sólo queda lo más importante, que es probar que funciona. Vamos en nuestro ejemplo, con el usuario al que le hemos asignado el permiso. Vamos a intentar borrar un blob en la carpeta PleaseDontDeleteMe, donde suponemos que no tenemos permisos para borrar:

Le damos a borrar:

Y efectivamente nos sale un bonito mensaje de error diciendo que no podemos borrar:

En cambio, si vamos a la ruta donde hemos dicho que podemos borrar:

Le damos a borrar:

Y un mensaje de borrado con éxito nos aparece:

Y hasta aquí la entrada del blog.

¡Hasta la próxima!