Translated ['', 'src/pentesting-cloud/azure-security/az-services/az-sql.

This commit is contained in:
Translator
2026-07-17 06:09:51 +00:00
parent 9c2def60aa
commit 9e87349d62
2 changed files with 145 additions and 145 deletions
@@ -4,47 +4,47 @@
## Azure SQL
Azure SQL es una familia de productos administrados, seguros e inteligentes que usan el **motor de base de datos SQL Server en la nube de Azure**. Esto significa que no tienes que preocuparte por la administración física de tus servidores, y puedes centrarte en gestionar tus datos.
Azure SQL es una familia de productos administrados, seguros e inteligentes que utilizan el **motor de base de datos de SQL Server en la nube de Azure**. Esto significa que no tienes que preocuparte por la administración física de tus servidores y puedes concentrarte en gestionar tus datos.
Azure SQL consta de cuatro ofertas principales:
1. **Azure SQL Server**: Se necesita un servidor para la **implementación y administración** de bases de datos SQL Server.
2. **Azure SQL Database**: Este es un **servicio de base de datos totalmente administrado**, que te permite alojar bases de datos individuales en la nube de Azure.
3. **Azure SQL Managed Instance**: Esto es para implementaciones a mayor escala, de toda la instancia de SQL Server.
4. **Azure SQL Server on Azure VMs**: Esto es mejor para arquitecturas en las que quieres **control sobre el sistema operativo **y la instancia de SQL Server.
1. **Azure SQL Server**: Se necesita un servidor para el **despliegue y la gestión** de bases de datos de SQL Server.
2. **Azure SQL Database**: Es un **servicio de base de datos completamente administrado**, que permite alojar bases de datos individuales en la nube de Azure.
3. **Azure SQL Managed Instance**: Está destinado a despliegues de mayor escala con el alcance de una instancia completa de SQL Server.
4. **Azure SQL Server on Azure VMs**: Es la mejor opción para arquitecturas en las que se desea tener **control sobre el sistema operativo **y la instancia de SQL Server.
### SQL Server Security Features
### Características de seguridad de SQL Server
**Network access:**
**Acceso de red:**
- Public endpoint (can limit access to specific networks).
- Private endpoints.
- También es posible restringir conexiones basadas en nombres de dominio.
- También es posible permitir que Azure services accedan a él (como usar el Query editor en el portal o permitir que una Azure VM se conecte).
- Si un SQL Server tiene *Allow Azure services and resources to access this server* configurado en "Enabled", Azure creará automáticamente una hidden firewall rule que permite que todo el tráfico de red originado desde Azure se conecte al SQL Server incluyendo recursos de cualquier tenant.
- Esto significa que si obtienes credenciales válidas de SQL, puedes conectarte al victim Azure SQL Server desde una Azure VM dentro de tu propio tenant controlado por el attacker. [The MS docs explains this](https://learn.microsoft.com/en-us/azure/azure-sql/database/network-access-controls-overview?view=azuresql#allow-azure-services)
- Endpoint público (puede limitar el acceso a redes específicas).
- Endpoints privados.
- También es posible restringir las conexiones según los nombres de dominio.
- También es posible permitir que los servicios de Azure accedan a él (por ejemplo, para utilizar Query editor en el portal o permitir que una Azure VM se conecte).
- Si un SQL Server tiene configurada como "Enabled" la opción *Allow Azure services and resources to access this server*, Azure creará automáticamente una regla de firewall oculta que permite que todo el tráfico de red originado en Azure se conecte al SQL Server, incluidos los recursos de cualquier tenant.
- Esto significa que, si obtienes credenciales SQL válidas, puedes conectarte al Azure SQL Server de la víctima desde una Azure VM dentro de tu propio tenant controlado por el atacante. [The MS docs explica esto](https://learn.microsoft.com/en-us/azure/azure-sql/database/network-access-controls-overview?view=azuresql#allow-azure-services)
**Authentication Methods:**
**Métodos de autenticación:**
- Microsoft **Entra-only** authentication: Necesitas indicar los Entra principals que tendrán acceso al service.
- **Both SQL and Microsoft Entra** authentication: Autenticación SQL tradicional con username y password junto con Microsoft Entra.
- **Only SQL** authentication: Solo permitir acceso mediante database users.
- Autenticación **solo de Microsoft Entra**: Debes indicar las entidades de Entra que tendrán acceso al servicio.
- Autenticación **SQL y Microsoft Entra**: Autenticación SQL tradicional con nombre de usuario y contraseña junto con Microsoft Entra.
- Autenticación **solo SQL**: Solo permite el acceso mediante usuarios de la base de datos.
Ten en cuenta que si se permite cualquier SQL auth, se necesita indicar un admin user (username + password) y si se selecciona Entra ID auth, también es necesario indicar al menos un principal con admin access.
Ten en cuenta que, si se permite cualquier autenticación SQL, es necesario indicar un usuario administrador (nombre de usuario + contraseña), y si se selecciona la autenticación de Entra ID, también es necesario indicar al menos una entidad con acceso de administrador.
**Encryption:**
**Cifrado:**
- Se llama “Transparent data encryption” y cifra databases, backups y logs at rest.
- Como siempre, por defecto se usa una Azure managed key, pero también podría usarse una customer managed encryption key (CMEK).
- Se denomina “Transparent data encryption” y cifra las bases de datos, las copias de seguridad y los logs en reposo.
- Como siempre, se utiliza una clave administrada por Azure de forma predeterminada, pero también se podría utilizar una clave de cifrado administrada por el cliente (CMEK).
**Managed Identities:**
- Es posible asignar system y user managed MIs.
- Se usa para acceder a la encryption key (si se usa una CMEK) y a otros servicios desde las databases.
- Para algunos ejemplos de los Azure services a los que se puede acceder desde la database, consulta [this page of the docs](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql)
- Si se asigna más de una UMI, es posible indicar la default one to use.
- Es posible configurar una federated client identity para cross-tenant access.
- Es posible asignar MIs administradas por el sistema y por el usuario.
- Se utilizan para acceder a la clave de cifrado (si se utiliza una CMEK) y a otros servicios desde las bases de datos.
- Para ver algunos ejemplos de los servicios de Azure a los que se puede acceder desde la base de datos, consulta [this page of the docs](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql)
- Si se asigna más de una UMI, es posible indicar cuál utilizar de forma predeterminada.
- Es posible configurar una identidad de cliente federada para el acceso cross-tenant.
Some commands to access info inside a blob storage from a SQL database:
Algunos comandos para acceder a información dentro de un Blob Storage desde una base de datos SQL:
```sql
-- Create a credential for the managed identity
CREATE DATABASE SCOPED CREDENTIAL [ManagedIdentityCredential]
@@ -71,60 +71,60 @@ GO
```
**Microsoft Defender:**
- Útil para “mitigar posibles vulnerabilidades de la base de datos y detectar actividades anómalas”
- Útil para “mitigar posibles vulnerabilidades de bases de datos y detectar actividades anómalas”
- Hablaremos de Defender en su propia lección (se puede habilitar en varios otros servicios de Azure)
**Backups:**
- La frecuencia de backup se gestiona en las políticas de retención.
- La frecuencia de los backups se gestiona en las retention policies.
**Deleted databases:**
- Es posible restaurar DBs que han sido borradas desde backups existentes.
- Es posible restaurar DBs que se hayan eliminado a partir de backups existentes.
## Azure SQL Database
**Azure SQL Database** es una **plataforma de base de datos completamente gestionada como servicio (PaaS)** que proporciona soluciones de base de datos relacional escalables y seguras. Está basada en las últimas tecnologías de SQL Server y elimina la necesidad de gestionar infraestructura, lo que la convierte en una opción popular para aplicaciones basadas en cloud.
**Azure SQL Database** es una **plataforma de base de datos completamente administrada como servicio (PaaS)** que proporciona soluciones de bases de datos relacionales escalables y seguras. Está basada en las tecnologías más recientes de SQL Server y elimina la necesidad de gestionar la infraestructura, por lo que es una opción popular para aplicaciones basadas en cloud.
Para crear una SQL database es necesario indicar el SQL server donde se aloja.
Para crear una base de datos SQL es necesario indicar el SQL server donde estará alojada.
### SQL Database Security Features
- **Always Up-to-Date**: Se ejecuta sobre la última versión estable de SQL Server y recibe nuevas features y patches automáticamente.
- **Always Up-to-Date**: Se ejecuta en la última versión estable de SQL Server y recibe automáticamente nuevas funcionalidades y parches.
- **Inherited SQL Server security features:**
- Authentication (SQL and/or Entra ID)
- Authentication (SQL y/o Entra ID)
- Assigned Managed Identities
- Network restrictions
- Encryption
- Backups
-
- **Data redundancy:** Las opciones son local, zone, Geo o Geo-Zone redundant.
- **Ledger:** Verifica criptográficamente la integridad de los datos, asegurando que cualquier manipulación sea detectada. Útil para organizaciones financieras, médicas y cualquier organización que gestione datos sensibles.
- **Ledger:** Verifica criptográficamente la integridad de los datos, garantizando que se detecte cualquier manipulación. Es útil para organizaciones financieras, médicas y cualquier organización que gestione datos sensibles.
Una SQL database podría formar parte de un **elastic Pool**. Los elastic pools son una solución rentable para gestionar múltiples bases de datos compartiendo recursos configurables de compute (eDTUs) y storage entre ellas, con precios basados únicamente en los recursos asignados y no en el número de bases de datos.
Una base de datos SQL puede formar parte de un **elastic Pool**. Los elastic pools son una solución rentable para gestionar varias bases de datos mediante el uso compartido de recursos de compute (eDTUs) y almacenamiento configurables, con un precio basado únicamente en los recursos asignados y no en el número de bases de datos.
#### Azure SQL Column Level Security (Masking) & Row Level Security
**Azure SQL's dynamic** data masking es una feature que ayuda a **proteger información sensible ocultándola** a usuarios no autorizados. En lugar de alterar los datos reales, enmascara dinámicamente los datos mostrados, asegurando que detalles sensibles como números de tarjeta de crédito queden ocultos.
El **dynamic** data masking de **Azure SQL** es una funcionalidad que ayuda a **proteger la información sensible ocultándola** a usuarios no autorizados. En lugar de modificar los datos reales, enmascara dinámicamente los datos mostrados, garantizando que los detalles sensibles, como los números de tarjetas de crédito, queden ocultos.
**Dynamic Data Masking** afecta a todos los usuarios excepto a los que están unmasked (estos usuarios deben ser indicados) y a los administradores. Tiene la opción de configuración que especifica qué usuarios SQL están exentos del dynamic data masking, con **administrators siempre excluidos**.
El **Dynamic Data Masking** afecta a todos los usuarios excepto a aquellos que están unmasked (estos usuarios deben indicarse) y a los administradores. Cuenta con una opción de configuración que especifica qué usuarios SQL están exentos del dynamic data masking, y los **administradores siempre están excluidos**.
**Azure SQL Row Level Security (RLS)** es una feature que **controla qué filas puede ver o modificar un usuario**, asegurando que cada usuario solo vea los datos relevantes para él. Mediante la creación de security policies con filter o block predicates, las organizaciones pueden aplicar acceso granular a nivel de database.
**Azure SQL Row Level Security (RLS)** es una funcionalidad que **controla qué filas puede ver o modificar un usuario**, garantizando que cada usuario solo vea los datos relevantes para él. Mediante la creación de security policies con filter o block predicates, las organizaciones pueden aplicar un control de acceso detallado a nivel de base de datos.
### Azure SQL Managed Instance
**Azure SQL Managed Instances** son para despliegues a mayor escala, para toda la instancia de SQL Server. Proporciona una compatibilidad cercana al 100% con la última SQL Server on-premises (Enterprise Edition) Database Engine, lo que ofrece una implementación nativa en virtual network (VNet) que aborda preocupaciones comunes de seguridad, y un modelo de negocio favorable para clientes de SQL Server on-premises.
**Azure SQL Managed Instances** está diseñado para deployments de mayor escala con el alcance de una instancia completa de SQL Server. Proporciona una compatibilidad cercana al 100 % con el Database Engine de SQL Server on-premises más reciente (Enterprise Edition), ofrece una implementación nativa en una virtual network (VNet) que aborda problemas de seguridad comunes y un modelo de negocio favorable para los clientes de SQL Server on-premises.
### Azure SQL Virtual Machines
**Azure SQL Virtual Machines** permite **controlar el operating system** y la instancia de SQL Server, ya que se creará una VM en el servicio de VM ejecutando el SQL server.
**Azure SQL Virtual Machines** permite **controlar el sistema operativo** y la instancia de SQL Server, ya que se creará una VM en el servicio de VM que ejecuta el SQL server.
Cuando se crea una SQL Virtual Machine es posible **seleccionar todos los settings de la VM** (como se muestra en la lección de VM) que alojará el SQL server.
- Esto significa que la VM accederá a alguna(s) VNet(s), podría tener **Managed Identities attached** a ella, podría tener file shares montados… lo que hace que el **pivoting from the SQL** a la VM sea súper interesante.
- Además, es posible configurar un app id y secret para **permitir que el SQL acceda a un specific key vault**, que podría contener información sensible.
Al crear una SQL Virtual Machine es posible **seleccionar todos los ajustes de la VM** (como se muestra en la lección de VM) que alojará el SQL server.
- Esto significa que la VM accederá a alguna(s) VNet(s), podría tener **Managed Identities asociadas**, podría tener file shares montados… lo que hace que un **pivoting desde el SQL** hacia la VM sea muy interesante.
- Además, es posible configurar un app id y un secret para **permitir que el SQL acceda a un key vault específico**, que podría contener información sensible.
También es posible configurar cosas como **automatic SQL updates**, **automatic backups**, **Entra ID authentication** y la mayoría de las features de los otros servicios de SQL.
También es posible configurar elementos como **automatic SQL updates**, **automatic backups**, **Entra ID authentication** y la mayoría de las funcionalidades de los otros servicios SQL.
## Enumeration
## Enumeración
{{#tabs}}
{{#tab name="az cli"}}
@@ -286,9 +286,9 @@ JOIN sys.security_predicates AS sp2
ON sp.object_id = sp2.object_id;
```
### Conectar y ejecutar consultas SQL
### Conectarse y ejecutar consultas SQL
Podrías encontrar una cadena de conexión (que contiene credenciales) a partir de un ejemplo de [enumerating an Az WebApp](az-app-services.md):
Podrías encontrar una cadena de conexión (que contiene credenciales) en el ejemplo de [enumeración de una Az WebApp](az-app-services.md):
```bash
function invoke-sql{
param($query)
@@ -307,7 +307,7 @@ $Connection.Close()
invoke-sql 'Select Distinct TABLE_NAME From information_schema.TABLES;'
```
También puedes usar sqlcmd para acceder a la base de datos. Es importante saber si el servidor permite conexiones públicas `az sql server show --name <server-name> --resource-group <resource-group>`, y también si la regla del firewall permite que nuestra IP acceda:
También puedes usar sqlcmd para acceder a la base de datos. Es importante saber si el servidor permite conexiones públicas `az sql server show --name <server-name> --resource-group <resource-group>` y también si la regla del firewall permite que nuestra IP acceda:
```bash
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>
```
@@ -318,19 +318,19 @@ sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passwork
- [https://learn.microsoft.com/en-us/azure/azure-sql/managed-instance/sql-managed-instance-paas-overview?view=azuresql](https://learn.microsoft.com/en-us/azure/azure-sql/managed-instance/sql-managed-instance-paas-overview?view=azuresql)
- [https://learn.microsoft.com/en-us/azure/azure-sql/virtual-machines/windows/sql-server-on-azure-vm-iaas-what-is-overview?view=azuresql](https://learn.microsoft.com/en-us/azure/azure-sql/virtual-machines/windows/sql-server-on-azure-vm-iaas-what-is-overview?view=azuresql)
## Escalada de Privilegios
## Escalada de privilegios
{{#ref}}
../az-privilege-escalation/az-sql-privesc.md
{{#endref}}
## Post Exploitation
## Post-explotación
{{#ref}}
../az-post-exploitation/az-sql-post-exploitation.md
{{#endref}}
### Persistence
### Persistencia
{{#ref}}
../az-persistence/az-sql-persistence.md
@@ -4,52 +4,52 @@
## Información básica
Azure Storage Accounts son servicios fundamentales en Microsoft Azure que proporcionan almacenamiento cloud escalable, seguro y de alta disponibilidad para **varios 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.
Azure Storage Accounts son servicios fundamentales de Microsoft Azure que proporcionan **storage escalable, seguro y altamente disponible para varios tipos de datos**, incluidos blobs (binary large objects), files, queues y tables. Funcionan como contenedores que agrupan estos diferentes servicios de storage bajo un único namespace para facilitar su administración.
**Opciones principales de configuración**:
**Principales opciones de configuración**:
- Cada storage account debe tener un **nombre único en todo Azure**.
- Cada storage account se despliega en una **region** o en una Azure extended zone
- Es posible seleccionar la versión **premium** de la storage account para mejor rendimiento
- Es posible elegir entre **4 tipos de redundancy para proteger** contra fallos de rack, drive y datacenter **failures**.
- Cada storage account se implementa en una **región** o en una extended zone de Azure
- Es posible seleccionar la versión **premium** del storage account para obtener un mejor rendimiento
- Es posible seleccionar entre **4 tipos de redundancia para protegerse** contra **fallos** de racks, drives y datacenters.
**Opciones de configuración de seguridad**:
- **Require secure transfer for REST API operations**: Require TLS en cualquier comunicación con el storage
- **Allows enabling anonymous access on individual containers**: Si no, no será posible habilitar anonymous access en el futuro
- **Enable storage account key access**: Si no, el acceso con Shared Keys estará prohibido
- **Require secure transfer for REST API operations**: Requiere TLS en cualquier comunicación con el storage
- **Allows enabling anonymous access on individual containers**: Si no se habilita, no será posible activar el acceso anónimo en el futuro
- **Enable storage account key access**: Si no se habilita, el acceso con Shared Keys estará 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 account con private endpoints en la misma virtual network.
- **Permitted scope for copy operations**: Permite realizar copias desde cualquier storage account, desde cualquier storage account del mismo Entra tenant o desde un storage account con private endpoints en la misma virtual network.
**Opciones de Blob Storage**:
- **Allow cross-tenant replication**
- **Access tier**: Hot (datos accedidos frecuentemente), Cool y Cold (datos accedidos raramente)
- **Access tier**: Hot (datos a los que se accede frecuentemente), Cool y Cold (datos a los que se accede raramente)
**Opciones de networking**:
- **Network access**:
- Permitir desde todas las networks
- Permitir desde virtual networks e IP addresses seleccionadas
- Deshabilitar el acceso público y usar private access
- **Private endpoints**: Permite una conexión privada a la storage account desde una virtual network
- Permitir desde virtual networks y direcciones IP seleccionadas
- Deshabilitar el acceso público y usar acceso privado
- **Private endpoints**: Permite una conexión privada al storage account desde una virtual network
**Opciones de protección de datos**:
- **Point-in-time restore for containers**: Permite restaurar containers a un estado anterior
- Requiere que versioning, change feed y blob soft delete estén habilitados.
- **Enable soft delete for blobs**: Habilita un periodo de retención en días para blobs eliminados (incluso si fueron sobrescritos)
- **Enable soft delete for containers**: Habilita un periodo de retención en días para containers eliminados
- **Enable soft delete for file shares**: Habilita un periodo de retención en días para file shared eliminados
- **Enable soft delete for blobs**: Habilita un periodo de retención en días para los blobs eliminados (incluso los sobrescritos)
- **Enable soft delete for containers**: Habilita un periodo de retención en días para los containers eliminados
- **Enable soft delete for file shares**: Habilita un periodo de retención en días para los file shares eliminados
- **Enable versioning for blobs**: Mantiene versiones anteriores de tus blobs
- **Enable blob change feed**: Mantiene logs de create, modificación y delete changes a blobs
- **Enable version-level immutability support**: Permite establecer una política de retención basada en tiempo a nivel de account que se aplicará a todas las versiones de blobs.
- Version-level immutability support y point-in-time restore for containers no pueden habilitarse al mismo tiempo.
- **Enable blob change feed**: Conserva logs de los cambios de creación, modificación y eliminación de los blobs
- **Enable version-level immutability support**: Permite establecer una política de retención basada en tiempo a nivel de account que se aplicará a todas las versiones de los blobs.
- Version-level immutability support y point-in-time restore for containers no pueden habilitarse simultáneamente.
**Opciones de configuración de encryption**:
- **Encryption type**: Es posible usar Microsoft-managed keys (MMK) o Customer-managed keys (CMK)
- **Enable infrastructure encryption**: Permite double encrypt the data "for more security"
- **Encryption type**: Es posible usar claves gestionadas por Microsoft (MMK) o claves gestionadas por el cliente (CMK)
- **Enable infrastructure encryption**: Permite cifrar los datos dos veces "para obtener más seguridad"
### Storage endpoints
@@ -64,19 +64,19 @@ Azure Storage Accounts son servicios fundamentales en Microsoft Azure que propor
### Exposición pública
Si "Allow Blob public access" está **habilitado** (deshabilitado por defecto), al crear un container es posible:
Si **Allow Blob public access** está **habilitado** (deshabilitado por defecto), al crear un container es posible:
- Dar **public access para leer blobs** (necesitas saber el nombre).
- **List container blobs** y **leerlos**.
- Hacerlo completamente **private**
- Dar **acceso público para leer blobs** (es necesario conocer el nombre).
- **Listar los blobs del container** y **leerlos**.
- Hacerlo completamente **privado**
<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUfoetUnYBPWQpRrWNnnlbqWpl8Rdoaeg5uBrCVlvcNDlnKwQHjZe8nUb2SfPspBgbu-lCZLmUei-hFi_Jl2eKbaxUtBGTjdUSDmkrcwr90VZkmuMjk9tyh92p75btfyzGiUTa0-=s2048?key=m8TV59TrCFPlkiNnmhYx3aZt" alt=""><figcaption></figcaption></figure>
### Exposición de static website (`$web`) y leaked secrets
### Exposición de Static website (`$web`) y secretos leaked
- **Static websites** se sirven desde el container especial `$web` a través de un endpoint específico de la region como `https://<account>.z13.web.core.windows.net/`.
- El container `$web` puede reportar `publicAccess: null` mediante la blob API, pero los archivos siguen siendo accesibles a través del static site endpoint, así que dejar allí artefactos de config/IaC puede leak secrets.
- Quick audit workflow:
- Los **Static websites** se sirven desde el container especial `$web` mediante un endpoint específico de la región, como `https://<account>.z13.web.core.windows.net/`.
- El container `$web` puede mostrar `publicAccess: null` a través de la API de blobs, pero los archivos siguen siendo accesibles mediante el endpoint del sitio estático, por lo que almacenar allí artefactos de configuración/IaC puede leakear secretos.
- Flujo de auditoría rápido:
```bash
# Identify storage accounts with static website hosting enabled
az storage blob service-properties show --account-name <acc-name> --auth-mode login
@@ -87,53 +87,53 @@ az storage blob list --container-name '$web' --account-name <acc-name> --auth-mo
# 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
```
### Auditing anonymous blob exposure
### Auditoría de exposición anónima de blobs
- **Localiza cuentas de almacenamiento** que pueden exponer datos: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Si `allowBlobPublicAccess` es `false` no puedes hacer públicos los containers.
- **Inspecciona cuentas de riesgo** para confirmar el flag y otras configuraciones débiles: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
- **Enumera la exposición a nivel de container** donde el flag está habilitado:
- **Localiza cuentas de almacenamiento** que puedan exponer datos: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Si `allowBlobPublicAccess` es `false`, no puedes hacer públicos los contenedores.
- **Inspecciona las cuentas de riesgo** para confirmar el indicador y otras configuraciones débiles: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
- **Enumera la exposición a nivel de contenedor** cuando el indicador esté habilitado:
```bash
az storage container list --account-name <acc> \
--query '[].{name:name, access:properties.publicAccess}'
```
- `"Blob"`: se permiten lecturas anónimas **solo cuando el nombre del blob es conocido** (sin listado).
- `"Container"`: **listado + lectura** anónimos de cada blob.
- `"Blob"`: lecturas anónimas permitidas **solo cuando se conoce el nombre del blob** (sin listado).
- `"Container"`: **listado + lectura anónimos** de cada blob.
- `null`: privado; se requiere autenticación.
- **Demuestra acceso** sin credenciales:
- **Demostrar el 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 `Blob` y `Container`, la descarga anónima del blob funciona cuando se conoce el nombre:
- Tanto para `Blob` como para `Container`, la descarga anónima del blob funciona cuando se conoce el nombre:
```bash
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>"
```
### Connect to Storage
### Conectarse al almacenamiento
Si encuentras algún **storage** al que puedas conectarte, podrías usar la herramienta [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) para hacerlo.
Si encuentras algún **almacenamiento** al que puedas conectarte, puedes usar la herramienta [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) para hacerlo.
## Access to Storage <a href="#about-blob-storage" id="about-blob-storage"></a>
## Acceso al almacenamiento <a href="#about-blob-storage" id="about-blob-storage"></a>
### RBAC
Es posible usar Entra ID principals con **RBAC roles** para acceder a storage accounts y es la forma recomendada.
Es posible usar identidades de Entra ID con **roles RBAC** para acceder a las cuentas de almacenamiento, y es la forma recomendada.
### Access Keys
### Claves de acceso
Las storage accounts tienen access keys que pueden usarse para acceder a ellas. Esto proporciona f**ull access to the storage account.**
Las cuentas de almacenamiento tienen claves de acceso que se pueden usar para acceder a ellas. Esto proporciona un acceso t**otal a la cuenta de almacenamiento.**
<figure><img src="../../../images/image (5).png" alt=""><figcaption></figcaption></figure>
### **Shared Keys & Lite Shared Keys**
Es posible [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) firmadas con las access keys para autorizar el acceso a ciertos recursos mediante una signed URL.
Es posible [**generar Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) firmadas con las claves de acceso para autorizar el acceso a determinados recursos mediante una URL firmada.
> [!NOTE]
> Ten en cuenta que la parte `CanonicalizedResource` representa el storage services resource (URI). Y si alguna parte de la URL está codificada, también debe estar codificada dentro de `CanonicalizedResource`.
> Ten en cuenta que la parte `CanonicalizedResource` representa el recurso de los servicios de almacenamiento (URI). Y si alguna parte de la URL está codificada, también debe codificarse dentro de `CanonicalizedResource`.
> [!NOTE]
> Esto se usa **by default by `az` cli** para autenticar requests. Para hacer que use las credenciales del Entra ID principal indica el param `--auth-mode login`.
> Esto lo utiliza **az cli** de forma predeterminada para autenticar las solicitudes. Para que use las credenciales de la identidad de Entra ID, indica el parámetro `--auth-mode login`.
- Es posible generar una **shared key para blob, queue y file services** firmando la siguiente información:
- Es posible generar una **shared key para los servicios de blobs, queues y files** firmando la siguiente información:
```bash
StringToSign = VERB + "\n" +
Content-Encoding + "\n" +
@@ -150,7 +150,7 @@ Range + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
- Es posible generar una **shared key para table services** firmando la siguiente información:
- Es posible generar una **shared key para los servicios de tabla** firmando la siguiente información:
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
@@ -158,7 +158,7 @@ Content-Type + "\n" +
Date + "\n" +
CanonicalizedResource;
```
- Es posible generar una **lite shared key para blob, queue y file services** firmando la siguiente información:
- Es posible generar una **lite shared key para los servicios blob, queue y file** firmando la siguiente información:
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
@@ -167,12 +167,12 @@ Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
- Es posible generar una **lite shared key for table services** firmando la siguiente información:
- Es posible generar una **clave compartida lite para servicios de tablas** firmando la siguiente información:
```bash
StringToSign = Date + "\n"
CanonicalizedResource
```
Entonces, para usar la key, se puede hacer en el header Authorization siguiendo la sintaxis:
Luego, para usar la clave, puede hacerse en el header `Authorization` siguiendo la sintaxis:
```bash
Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>"
#e.g.
@@ -186,76 +186,76 @@ Content-Length: 0
```
### **Shared Access Signature** (SAS)
Shared Access Signatures (SAS) son URLs seguras y limitadas en el tiempo que **grant specific permissions to access resource**s en una Azure Storage account sin exponer las access keys de la cuenta. Mientras que las access keys proporcionan acceso administrativo completo a todos los recursos, SAS permite un control granular al especificar permisos (como read o write) y definir un tiempo de expiración.
Las Shared Access Signatures (SAS) son URLs seguras y limitadas en el tiempo que **otorgan 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, SAS permite un control granular al especificar permisos (como lectura o escritura) y definir un tiempo de expiración.
#### SAS Types
#### Tipos de SAS
- **User delegation SAS**: Se crea a partir de un **Entra ID principal** que firmará el SAS y delegará los permisos del usuario al SAS. Solo puede usarse con **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Es posible **revoke** todos los user delegated SAS generados.
- Incluso si es posible generar un delegation SAS con "más" permisos que los que tiene el usuario. Sin embargo, si el principal no los tiene, no funcionará (no privesc).
- **Service SAS**: Se firma usando una de las **access keys** de la storage account. Puede usarse para conceder acceso a recursos específicos en un único storage service. Si la key se renueva, el SAS dejará de funcionar.
- **Account SAS**: También se firma con una de las **access keys** de la storage account. Concede acceso a recursos en varios services de la storage account (Blob, Queue, Table, File) y puede incluir operaciones a nivel de service.
- **User delegation SAS**: 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 utilizarse con **blob y data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Es posible **revocar** todas las SAS delegadas de usuario generadas.
- Aunque es posible generar una delegation SAS con "más" permisos de los que tiene el usuario, si el principal no dispone de ellos, no funcionará (no hay privesc).
- **Service SAS**: Se firma utilizando una de las **claves de acceso** de la cuenta de almacenamiento. Puede utilizarse para conceder acceso a recursos específicos en un único servicio de almacenamiento. Si se renueva la clave, la SAS dejará de funcionar.
- **Account SAS**: También se firma con una de las **claves de acceso** de la cuenta de almacenamiento. Concede acceso a recursos de varios servicios de una cuenta de almacenamiento (Blob, Queue, Table, File) y puede incluir operaciones a nivel de servicio.
A SAS URL firmada por una **access key** se ve así:
Una URL SAS firmada mediante una **clave de acceso** tiene este aspecto:
- `https://<container_name>.blob.core.windows.net/newcontainer?sp=r&st=2021-09-26T18:15:21Z&se=2021-10-27T02:14:21Z&spr=https&sv=2021-07-08&sr=c&sig=7S%2BZySOgy4aA3Dk0V1cJyTSIf1cW%2Fu3WFkhHV32%2B4PE%3D`
Una SAS URL firmada como **user delegation** se ve así:
Una URL SAS firmada como **user delegation** tiene este aspecto:
- `https://<container_name>.blob.core.windows.net/testing-container?sp=r&st=2024-11-22T15:07:40Z&se=2024-11-22T23:07:40Z&skoid=d77c71a1-96e7-483d-bd51-bd753aa66e62&sktid=fdd066e1-ee37-49bc-b08f-d0e152119b04&skt=2024-11-22T15:07:40Z&ske=2024-11-22T23:07:40Z&sks=b&skv=2022-11-02&spr=https&sv=2022-11-02&sr=c&sig=7s5dJyeE6klUNRulUj9TNL0tMj2K7mtxyRc97xbYDqs%3D`
Note algunos **http params**:
Ten en cuenta algunos **parámetros http**:
- El parámetro **`se`** indica la **expiration date** del SAS
- El parámetro **`sp`** indica los **permissions** del SAS
- **`sig`** es la **signature** que valida el SAS
- El parámetro **`se`** indica la **fecha de expiración** de la SAS
- El parámetro **`sp`** indica los **permisos** de la SAS
- **`sig`** es la **firma** que valida la SAS
#### SAS permissions
#### Permisos de SAS
Al generar un SAS, es necesario indicar los permisos que debe conceder. Dependiendo del objeto sobre el que se genere el SAS, pueden incluirse permisos distintos. Por ejemplo:
Al generar una SAS, es necesario indicar los permisos que debe conceder. Dependiendo del objeto sobre el que se genere la SAS, pueden incluirse diferentes permisos. Por ejemplo:
- (a)dd, (c)reate, (d)elete, (e)xecute, (f)ilter_by_tags, (i)set_immutability_policy, (l)ist, (m)ove, (r)ead, (t)ag, (w)rite, (x)delete_previous_version, (y)permanent_delete
## SFTP Support for Azure Blob Storage
## Compatibilidad con SFTP para Azure Blob Storage
Azure Blob Storage ahora soporta el SSH File Transfer Protocol (SFTP), lo que permite la transferencia segura de archivos y su gestión directamente en Blob Storage sin requerir soluciones personalizadas ni productos de terceros.
Azure Blob Storage ahora admite el SSH File Transfer Protocol (SFTP), lo que permite transferir y gestionar archivos de forma segura directamente en Blob Storage sin necesidad de soluciones personalizadas ni productos de terceros.
### Key Features
### Características principales
- Protocol Support: SFTP funciona con Blob Storage accounts configuradas con hierarchical namespace (HNS). Esto organiza blobs en directories y subdirectories para facilitar la navegación.
- Security: SFTP puede usar local user identities, pero también soporta acceso basado en Microsoft Entra ID con Azure RBAC para authorization. Esto significa que el acceso puede concederse con los roles habituales de Blob Storage data-plane en lugar de crear local SFTP users. Los local users pueden autenticarse mediante:
- Azure-generated passwords
- Public-private SSH key pairs
- Granular Permissions: Se pueden asignar permisos como Read, Write, Delete y List a local users para hasta 100 containers.
- Networking Considerations: Las conexiones SFTP se realizan a través del puerto 22. Azure soporta configuraciones de network como firewalls, private endpoints o virtual networks para proteger el tráfico SFTP.
- Compatibilidad con protocolos: 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 puede utilizar identidades de usuarios locales, pero también admite acceso basado en Microsoft Entra ID con Azure RBAC para la autorización. Esto significa que el acceso puede concederse mediante los roles habituales del data-plane de Blob Storage en lugar de crear usuarios locales de SFTP. Los usuarios locales pueden autenticarse mediante:
- Contraseñas generadas por Azure
- Pares de claves SSH públicas y privadas
- Permisos granulares: Se pueden asignar permisos como Read, Write, Delete y List a usuarios locales para hasta 100 contenedores.
- Consideraciones de red: Las conexiones SFTP se realizan a través del puerto 22. Azure admite configuraciones de red como firewalls, private endpoints o redes virtuales para proteger el tráfico SFTP.
### Setup Requirements
### Requisitos de configuración
- Hierarchical Namespace: HNS debe estar habilitado al crear la storage account.
- Supported Encryption: Requiere algoritmos criptográficos aprobados por Microsoft Security Development Lifecycle (SDL) (p. ej., rsa-sha2-256, ecdsa-sha2-nistp256).
- SFTP Configuration:
- Habilitar SFTP en la storage account.
- Para acceso de local-user, crear local user identities con los permisos adecuados.
- Para local users, configurar home directories para definir su ubicación inicial dentro del container.
- Hierarchical Namespace: HNS debe habilitarse al crear la cuenta de almacenamiento.
- Cifrado compatible: Requiere algoritmos criptográficos aprobados por Microsoft Security Development Lifecycle (SDL) (por ejemplo, rsa-sha2-256, ecdsa-sha2-nistp256).
- Configuración de SFTP:
- Habilitar SFTP en la cuenta de almacenamiento.
- Para el acceso de usuarios locales, crear identidades de usuarios locales con los permisos adecuados.
- Para los usuarios locales, configurar los directorios de inicio para definir su ubicación inicial dentro del contenedor.
### Permissions
### Permisos
| Permission | Symbol | Description |
| ---------------------- | ------ | ------------------------------------ |
| **Read** | `r` | Read file content. |
| **Write** | `w` | Upload files and create directories. |
| **List** | `l` | List contents of directories. |
| **Delete** | `d` | Delete files or directories. |
| **Create** | `c` | Create files or directories. |
| **Modify Ownership** | `o` | Change the owning user or group. |
| **Modify Permissions** | `p` | Change ACLs on files or directories. |
| Permiso | Símbolo | Descripción |
| ------------------------------- | ------- | ---------------------------------------- |
| **Read** | `r` | Leer el contenido de los archivos. |
| **Write** | `w` | Cargar archivos y crear directorios. |
| **List** | `l` | Enumerar el contenido de los directorios.|
| **Delete** | `d` | Eliminar archivos o directorios. |
| **Create** | `c` | Crear archivos o directorios. |
| **Modify Ownership** | `o` | Cambiar el usuario o grupo propietario. |
| **Modify Permissions** | `p` | Cambiar las ACL de archivos o directorios.|
## Enumeration
## Enumeración
{{#tabs }}
{{#tab name="az cli" }}
<details>
<summary>az cli enumeration</summary>
<summary>enumeración de az cli</summary>
```bash
# Get storage accounts
az storage account list #Get the account name from here