mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['', 'src/pentesting-cloud/azure-security/az-services/az-stor
This commit is contained in:
@@ -4,47 +4,47 @@
|
||||
|
||||
## Azure SQL
|
||||
|
||||
Azure SQL è una famiglia di prodotti gestiti, sicuri e intelligenti che usano il **motore di database SQL Server nel cloud Azure**. Questo significa che non devi preoccuparti dell'amministrazione fisica dei tuoi server e puoi concentrarti sulla gestione dei tuoi dati.
|
||||
Azure SQL è una famiglia di prodotti gestiti, sicuri e intelligenti che utilizzano il **motore di database SQL Server nel cloud Azure**. Ciò significa che non devi preoccuparti dell'amministrazione fisica dei tuoi server e puoi concentrarti sulla gestione dei tuoi dati.
|
||||
|
||||
Azure SQL consiste in quattro offerte principali:
|
||||
Azure SQL comprende quattro offerte principali:
|
||||
|
||||
1. **Azure SQL Server**: Un server è necessario per il **deployment e la gestione** dei database SQL Server.
|
||||
2. **Azure SQL Database**: Questo è un servizio di database **completamente gestito**, che ti permette di ospitare database singoli nel cloud Azure.
|
||||
3. **Azure SQL Managed Instance**: Questo è per deployment su scala più ampia, a livello dell'intera istanza SQL Server.
|
||||
4. **Azure SQL Server on Azure VMs**: Questo è il meglio per architetture in cui vuoi **controllo sul sistema operativo **e sull'istanza SQL Server.
|
||||
1. **Azure SQL Server**: è necessario un server per la **distribuzione e la gestione** dei database SQL Server.
|
||||
2. **Azure SQL Database**: è un **servizio di database completamente gestito**, che consente di ospitare singoli database nel cloud Azure.
|
||||
3. **Azure SQL Managed Instance**: è destinato a deployment su scala più ampia, con ambito dell'intera istanza SQL Server.
|
||||
4. **Azure SQL Server su Azure VM**: è la scelta migliore per le architetture in cui desideri **il controllo sul sistema operativo **e sull'istanza SQL Server.
|
||||
|
||||
### SQL Server Security Features
|
||||
### Funzionalità di sicurezza di SQL Server
|
||||
|
||||
**Network access:**
|
||||
**Accesso di rete:**
|
||||
|
||||
- Public endpoint (può limitare l'accesso a specifiche reti).
|
||||
- Private endpoints.
|
||||
- È anche possibile restringere le connessioni in base ai nomi di dominio.
|
||||
- È anche possibile consentire ad Azure services di accedervi (ad esempio per usare il Query editor nel portal o per permettere a una Azure VM di connettersi).
|
||||
- Se un SQL Server ha *Allow Azure services and resources to access this server* impostato su "Enabled", Azure creerà automaticamente una hidden firewall rule che consente a tutto il traffico di rete proveniente da Azure di connettersi al SQL Server — incluse le risorse di qualsiasi tenant.
|
||||
- Questo significa che, se ottieni credenziali SQL valide, puoi connetterti al victim Azure SQL Server da una Azure VM all'interno del tuo tenant controllato dall'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 pubblico (è possibile limitare l'accesso a reti specifiche).
|
||||
- Endpoint privati.
|
||||
- È anche possibile limitare le connessioni in base ai nomi di dominio.
|
||||
- È anche possibile consentire ai servizi Azure di accedervi (ad esempio per utilizzare l'editor Query nel portale o consentire a una Azure VM di connettersi).
|
||||
- Se per un SQL Server *Allow Azure services and resources to access this server* è impostato su "Enabled", Azure crea automaticamente una regola firewall nascosta che consente a tutto il traffico di rete proveniente da Azure di connettersi al SQL Server, incluse le risorse di qualsiasi tenant.
|
||||
- Ciò significa che, se ottieni credenziali SQL valide, puoi connetterti al SQL Server Azure della vittima da una Azure VM all'interno di un tenant controllato dall'attaccante. [La documentazione MS lo spiega](https://learn.microsoft.com/en-us/azure/azure-sql/database/network-access-controls-overview?view=azuresql#allow-azure-services)
|
||||
|
||||
**Authentication Methods:**
|
||||
**Metodi di autenticazione:**
|
||||
|
||||
- Microsoft **Entra-only** authentication: Devi indicare i principal di Entra che avranno accesso al servizio.
|
||||
- **Both SQL and Microsoft Entra** authentication: Autenticazione SQL tradizionale con username e password insieme a Microsoft Entra.
|
||||
- **Only SQL** authentication: Consenti l'accesso solo tramite database users.
|
||||
- Autenticazione **solo Microsoft Entra**: devi indicare le identità Entra che avranno accesso al servizio.
|
||||
- Autenticazione **SQL e Microsoft Entra**: autenticazione SQL tradizionale con nome utente e password insieme a Microsoft Entra.
|
||||
- Autenticazione **solo SQL**: consente l'accesso esclusivamente tramite gli utenti del database.
|
||||
|
||||
Nota che se è consentita qualsiasi SQL auth, è necessario indicare un admin user (username + password) e se è selezionata l'auth Entra ID è anche necessario indicare almeno un principal con accesso admin.
|
||||
Nota che, se è consentita qualsiasi autenticazione SQL, è necessario indicare un utente amministratore (nome utente + password) e, se è selezionata l'autenticazione Entra ID, è inoltre necessario indicare almeno un'identità con accesso amministrativo.
|
||||
|
||||
**Encryption:**
|
||||
**Crittografia:**
|
||||
|
||||
- Si chiama “Transparent data encryption” e cifra database, backup e logs at rest.
|
||||
- Come sempre, per default viene usata una Azure managed key, ma potrebbe essere usata anche una customer managed encryption key (CMEK).
|
||||
**Managed Identities:**
|
||||
- Si chiama “Transparent data encryption” e crittografa database, backup e log quando sono inattivi.
|
||||
- Come sempre, per impostazione predefinita viene utilizzata una chiave gestita da Azure, ma può essere utilizzata anche una chiave di crittografia gestita dal cliente (CMEK).
|
||||
**Identità gestite:**
|
||||
|
||||
- È possibile assegnare system e user managed MIs.
|
||||
- Usate per accedere alla encryption key (se viene usata una CMEK) e ad altri servizi dai databases.
|
||||
- Per alcuni esempi dei servizi Azure che possono essere accessibili dal database, controlla [this page of the docs](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql)
|
||||
- Se viene assegnata più di una UMI, è possibile indicare quella di default da usare.
|
||||
- È possibile configurare una federated client identity per l'accesso cross-tenant.
|
||||
- È possibile assegnare MI gestite dal sistema e dall'utente.
|
||||
- Vengono utilizzate per accedere alla chiave di crittografia (se viene utilizzata una CMEK) e ad altri servizi dai database.
|
||||
- Per alcuni esempi di servizi Azure a cui è possibile accedere dal database, consulta [questa pagina della documentazione](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql)
|
||||
- Se viene assegnata più di una UMI, è possibile indicare quella predefinita da utilizzare.
|
||||
- È possibile configurare un'identità client federata per l'accesso cross-tenant.
|
||||
|
||||
Alcuni comandi per accedere alle info dentro una blob storage da un SQL database:
|
||||
Alcuni comandi per accedere alle informazioni all'interno di un Blob Storage da un database SQL:
|
||||
```sql
|
||||
-- Create a credential for the managed identity
|
||||
CREATE DATABASE SCOPED CREDENTIAL [ManagedIdentityCredential]
|
||||
@@ -71,58 +71,58 @@ GO
|
||||
```
|
||||
**Microsoft Defender:**
|
||||
|
||||
- Useful for “mitigating potential database vulnerabilities, and detecting anomalous activities”
|
||||
- We will talk about Defender in its own lesson (it can be enabled in several other Azure services)
|
||||
- Utile per “mitigare potenziali vulnerabilità dei database e rilevare attività anomale”
|
||||
- Parleremo di Defender in una lezione dedicata (può essere abilitato in diversi altri Azure services)
|
||||
|
||||
**Backups:**
|
||||
- La frequenza dei backup è gestita nelle policy di retention.
|
||||
- La frequenza dei backup è gestita nelle retention policies.
|
||||
|
||||
**Deleted databases:**
|
||||
- È possibile ripristinare DB che sono stati eliminati da backup esistenti.
|
||||
- È possibile ripristinare i DB eliminati dai backup esistenti.
|
||||
|
||||
## Azure SQL Database
|
||||
|
||||
**Azure SQL Database** is a **fully managed database platform as a service (PaaS)** che offre soluzioni di database relazionali scalabili e sicure. È costruito sulle più recenti tecnologie SQL Server ed elimina la necessità di gestire l'infrastruttura, rendendolo una scelta popolare per applicazioni cloud-based.
|
||||
**Azure SQL Database** è una **piattaforma di database completamente gestita come servizio (PaaS)** che fornisce soluzioni di database relazionali scalabili e sicure. È basato sulle tecnologie SQL Server più recenti ed elimina la necessità di gestire l'infrastruttura, rendendolo una scelta popolare per le applicazioni basate sul cloud.
|
||||
|
||||
Per creare un SQL database è necessario indicare il SQL server in cui verrà ospitato.
|
||||
Per creare un database SQL è necessario indicare il SQL server su cui verrà ospitato.
|
||||
|
||||
### SQL Database Security Features
|
||||
|
||||
- **Always Up-to-Date**: Esegue l'ultima versione stabile di SQL Server e riceve automaticamente nuove funzionalità e patch.
|
||||
- **Always Up-to-Date**: Esegue la versione stabile più recente di SQL Server e riceve automaticamente nuove funzionalità e patch.
|
||||
- **Inherited SQL Server security features:**
|
||||
- Authentication (SQL and/or Entra ID)
|
||||
- Assigned Managed Identities
|
||||
- Network restrictions
|
||||
- Encryption
|
||||
- Backups
|
||||
- Autenticazione (SQL e/o Entra ID)
|
||||
- Managed Identities assegnate
|
||||
- Restrizioni di rete
|
||||
- Crittografia
|
||||
- Backup
|
||||
- …
|
||||
- **Data redundancy:** Le opzioni sono local, zone, Geo o Geo-Zone redundant.
|
||||
- **Ledger:** Verifica crittograficamente l'integrità dei dati, garantendo che qualsiasi manomissione venga rilevata. Utile per organizzazioni finanziarie, mediche e qualsiasi organizzazione che gestisce dati sensibili.
|
||||
- **Data redundancy:** Le opzioni sono ridondanza locale, di zona, Geo o Geo-Zone.
|
||||
- **Ledger:** Verifica crittograficamente l'integrità dei dati, assicurando che qualsiasi manomissione venga rilevata. Utile per organizzazioni finanziarie, mediche e per qualsiasi organizzazione che gestisca dati sensibili.
|
||||
|
||||
|
||||
Un SQL database potrebbe far parte di un **elastic Pool**. Gli elastic pools sono una soluzione conveniente per gestire più database condividendo risorse di compute configurabili (eDTUs) e storage tra di essi, con un pricing basato solo sulle risorse allocate e non sul numero di database.
|
||||
Un database SQL può far parte di un **Elastic Pool**. Gli Elastic Pool sono una soluzione conveniente per gestire più database condividendo tra loro risorse di calcolo configurabili (eDTU) e risorse di storage, con un prezzo basato esclusivamente sulle risorse allocate e non sul numero di database.
|
||||
|
||||
#### Azure SQL Column Level Security (Masking) & Row Level Security
|
||||
|
||||
**Azure SQL's dynamic** data masking è una feature che aiuta a **proteggere le informazioni sensibili nascondendole** agli utenti non autorizzati. Invece di alterare i dati reali, maschera dinamicamente i dati mostrati, garantendo che dettagli sensibili come i numeri di carta di credito siano oscurati.
|
||||
Il **dynamic** data masking di **Azure SQL** è una funzionalità che aiuta a **proteggere le informazioni sensibili nascondendole** agli utenti non autorizzati. Invece di modificare i dati effettivi, applica dinamicamente il masking ai dati visualizzati, assicurando che dettagli sensibili come i numeri delle carte di credito siano oscurati.
|
||||
|
||||
Il **Dynamic Data Masking** influisce su tutti gli utenti tranne quelli che sono unmasked (questi utenti devono essere indicati) e gli amministratori. Ha l'opzione di configurazione che specifica quali utenti SQL sono esenti dal dynamic data masking, con **gli amministratori sempre esclusi**.
|
||||
Il **Dynamic Data Masking** si applica a tutti gli utenti tranne a quelli esclusi dal masking (questi utenti devono essere indicati) e agli amministratori. Dispone di un'opzione di configurazione che specifica quali utenti SQL sono esentati dal dynamic data masking, con gli **amministratori sempre esclusi**.
|
||||
|
||||
**Azure SQL Row Level Security (RLS)** è una feature che **controlla quali righe un utente può visualizzare o modificare**, garantendo che ogni utente veda solo i dati rilevanti per lui. Creando security policies con filter o block predicates, le organizzazioni possono applicare un access a granularità fine a livello di database.
|
||||
**Azure SQL Row Level Security (RLS)** è una funzionalità che **controlla quali righe un utente può visualizzare o modificare**, assicurando che ogni utente visualizzi solo i dati a lui pertinenti. Creando security policies con filter o block predicates, le organizzazioni possono applicare un accesso granulare a livello di database.
|
||||
|
||||
### Azure SQL Managed Instance
|
||||
|
||||
**Azure SQL Managed Instances** sono pensate per deployment su larga scala, scoped a una intera istanza SQL Server. Offrono una compatibilità vicina al 100% con il più recente SQL Server on-premises (Enterprise Edition) Database Engine, che fornisce una implementazione nativa di virtual network (VNet) che affronta le comuni preoccupazioni di sicurezza, e un modello di business favorevole per i clienti SQL Server on-premises.
|
||||
Le **Azure SQL Managed Instances** sono destinate a deployment su larga scala con ambito sull'intera istanza SQL Server. Forniscono una compatibilità quasi del 100% con il Database Engine dell'ultima versione di SQL Server on-premises (Enterprise Edition), includendo un'implementazione nativa della rete virtuale (VNet) che affronta le problematiche di sicurezza comuni e un modello di business vantaggioso per i clienti SQL Server on-premises.
|
||||
|
||||
### Azure SQL Virtual Machines
|
||||
|
||||
**Azure SQL Virtual Machines** permettono di **controllare il sistema operativo** e l'istanza SQL Server, poiché una VM verrà spawn nel servizio VM eseguendo il SQL server.
|
||||
Le **Azure SQL Virtual Machines** consentono di **controllare il sistema operativo** e l'istanza SQL Server, poiché nel servizio VM verrà creata una VM che esegue il SQL server.
|
||||
|
||||
Quando viene creata una SQL Virtual Machine è possibile **selezionare tutte le impostazioni della VM** (come mostrato nella lezione sulle VM) che ospiterà il SQL server.
|
||||
- Questo significa che la VM accederà a una o più VNet, potrebbe avere **Managed Identities attached** a essa, potrebbe avere file shares montate… rendendo un **pivoting from the SQL** alla VM super interessante.
|
||||
- Inoltre, è possibile configurare un app id e un secret per **permettere al SQL di accedere a uno specifico key vault**, che potrebbe contenere informazioni sensibili.
|
||||
- Ciò significa che la VM accederà ad alcune VNet, potrebbe avere **Managed Identities collegate** e potrebbe avere file share montate… rendendo un **pivoting dal SQL** alla VM molto interessante.
|
||||
- Inoltre, è possibile configurare un app id e un secret per **consentire al SQL di accedere a uno specifico key vault**, che potrebbe contenere informazioni sensibili.
|
||||
|
||||
È anche possibile configurare cose come **automatic SQL updates**, **automatic backups**, **Entra ID authentication** e la maggior parte delle feature degli altri servizi SQL.
|
||||
È inoltre possibile configurare funzionalità come **automatic SQL updates**, **automatic backups**, **Entra ID authentication** e la maggior parte delle funzionalità degli altri SQL services.
|
||||
|
||||
## Enumeration
|
||||
|
||||
@@ -261,7 +261,7 @@ Get-AzSqlVM
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
Inoltre, se vuoi enumerare i Dynamic Data Masking e le policy Row Level all'interno del database, puoi eseguire la query:
|
||||
Inoltre, se vuoi enumerare le policy di Dynamic Data Masking e Row Level all'interno del database, puoi eseguire una query:
|
||||
```sql
|
||||
--Enumerates the masked columns
|
||||
SELECT
|
||||
@@ -288,7 +288,7 @@ ON sp.object_id = sp2.object_id;
|
||||
```
|
||||
### Connettersi ed eseguire query SQL
|
||||
|
||||
Potresti trovare una stringa di connessione (contenente credenziali) dall'esempio [enumerating an Az WebApp](az-app-services.md):
|
||||
Potresti trovare una stringa di connessione (contenente credenziali) durante l'enumerazione di un Az WebApp:
|
||||
```bash
|
||||
function invoke-sql{
|
||||
param($query)
|
||||
@@ -307,11 +307,11 @@ $Connection.Close()
|
||||
|
||||
invoke-sql 'Select Distinct TABLE_NAME From information_schema.TABLES;'
|
||||
```
|
||||
Puoi anche usare sqlcmd per accedere al database. È importante sapere se il server consente connessioni pubbliche `az sql server show --name <server-name> --resource-group <resource-group>`, e anche se la regola del firewall permette al nostro IP di accedere:
|
||||
Puoi anche usare sqlcmd per accedere al database. È importante sapere se il server consente connessioni pubbliche `az sql server show --name <server-name> --resource-group <resource-group>`, e anche se la regola del firewall consente al nostro IP di accedere:
|
||||
```bash
|
||||
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>
|
||||
```
|
||||
## References
|
||||
## Riferimenti
|
||||
|
||||
- [https://learn.microsoft.com/en-us/azure/azure-sql/azure-sql-iaas-vs-paas-what-is-overview?view=azuresql](https://learn.microsoft.com/en-us/azure/azure-sql/azure-sql-iaas-vs-paas-what-is-overview?view=azuresql)
|
||||
- [https://learn.microsoft.com/en-us/azure/azure-sql/database/single-database-overview?view=azuresql](https://learn.microsoft.com/en-us/azure/azure-sql/database/single-database-overview?view=azuresql)
|
||||
|
||||
@@ -1,57 +1,57 @@
|
||||
# Az - Storage Accounts & Blobs
|
||||
# Az - Storage Accounts e Blobs
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Informazioni di base
|
||||
|
||||
Azure Storage Accounts sono servizi fondamentali in Microsoft Azure che forniscono cloud **storage scalabile, sicuro e altamente disponibile per vari tipi di dati**, inclusi blobs (binary large objects), files, queues e tables. Funzionano come contenitori che raggruppano insieme questi diversi storage services sotto un unico namespace per una facile gestione.
|
||||
Gli Azure Storage Accounts sono servizi fondamentali di Microsoft Azure che forniscono **storage cloud scalabile, sicuro e ad alta disponibilità per vari tipi di dati**, inclusi blob (binary large objects), file, code e tabelle. Servono come contenitori che raggruppano questi diversi servizi di storage sotto un singolo namespace per semplificarne la gestione.
|
||||
|
||||
**Opzioni principali di configurazione**:
|
||||
**Principali opzioni di configurazione**:
|
||||
|
||||
- Ogni storage account deve avere un **nome univoco in tutto Azure**.
|
||||
- Ogni storage account viene distribuito in una **region** o in una Azure extended zone
|
||||
- È possibile selezionare la versione **premium** dello storage account per prestazioni migliori
|
||||
- È possibile scegliere tra **4 tipi di redundancy per proteggersi** da failure di rack, drive e datacenter.
|
||||
- Ogni storage account viene distribuito in una **regione** o in una Azure extended zone.
|
||||
- È possibile selezionare la versione **premium** dello storage account per ottenere prestazioni migliori.
|
||||
- È possibile scegliere tra **4 tipi di ridondanza per proteggere** da **failure** di rack, drive e datacenter.
|
||||
|
||||
**Opzioni di configurazione della sicurezza**:
|
||||
|
||||
- **Require secure transfer for REST API operations**: Richiede TLS in qualsiasi comunicazione con lo storage
|
||||
- **Allows enabling anonymous access on individual containers**: In caso contrario, non sarà possibile abilitare l'anonimous access in futuro
|
||||
- **Enable storage account key access**: In caso contrario, l'accesso con Shared Keys sarà vietato
|
||||
- **Require secure transfer for REST API operations**: richiede TLS per qualsiasi comunicazione con lo storage.
|
||||
- **Allows enabling anonymous access on individual containers**: se disabilitato, non sarà possibile abilitare l'accesso anonimo in futuro.
|
||||
- **Enable storage account key access**: se disabilitato, l'accesso con Shared Keys sarà vietato.
|
||||
- **Minimum TLS version**
|
||||
- **Permitted scope for copy operations**: Consenti da qualsiasi storage account, da qualsiasi storage account dello stesso tenant Entra o da storage account con private endpoints nella stessa virtual network.
|
||||
- **Permitted scope for copy operations**: consente operazioni da qualsiasi storage account, da qualsiasi storage account dello stesso Entra tenant oppure da uno storage account con private endpoints nella stessa virtual network.
|
||||
|
||||
**Opzioni di Blob Storage**:
|
||||
|
||||
- **Allow cross-tenant replication**
|
||||
- **Access tier**: Hot (dati accessati frequentemente), Cool e Cold (raramente accessati)
|
||||
- **Access tier**: Hot (dati ad accesso frequente), Cool e Cold (dati consultati raramente).
|
||||
|
||||
**Opzioni di networking**:
|
||||
**Opzioni di rete**:
|
||||
|
||||
- **Network access**:
|
||||
- Consenti da tutte le network
|
||||
- Consenti da selezionate virtual networks e indirizzi IP
|
||||
- Disabilita l'accesso pubblico e usa l'accesso privato
|
||||
- **Private endpoints**: Consente una connessione privata allo storage account da una virtual network
|
||||
- Consenti da tutte le reti.
|
||||
- Consenti dalle virtual network e dagli indirizzi IP selezionati.
|
||||
- Disabilita l'accesso pubblico e utilizza l'accesso privato.
|
||||
- **Private endpoints**: consente una connessione privata allo storage account da una virtual network.
|
||||
|
||||
**Opzioni di protezione dei dati**:
|
||||
|
||||
- **Point-in-time restore for containers**: Consente di ripristinare i containers a uno stato precedente
|
||||
- **Point-in-time restore for containers**: consente di ripristinare i container a uno stato precedente.
|
||||
- Richiede che versioning, change feed e blob soft delete siano abilitati.
|
||||
- **Enable soft delete for blobs**: Abilita un retention period in giorni per i blobs eliminati (anche sovrascritti)
|
||||
- **Enable soft delete for containers**: Abilita un retention period in giorni per i containers eliminati
|
||||
- **Enable soft delete for file shares**: Abilita un retention period in giorni per i file shared eliminati
|
||||
- **Enable versioning for blobs**: Mantiene le versioni precedenti dei tuoi blobs
|
||||
- **Enable blob change feed**: Mantiene i log delle modifiche di create, modification e delete ai blobs
|
||||
- **Enable version-level immutability support**: Consente di impostare una retention policy basata sul tempo a livello di account che si applicherà a tutte le versioni dei blob.
|
||||
- Version-level immutability support e point-in-time restore for containers non possono essere abilitati simultaneamente.
|
||||
- **Enable soft delete for blobs**: abilita un periodo di conservazione in giorni per i blob eliminati (anche quelli sovrascritti).
|
||||
- **Enable soft delete for containers**: abilita un periodo di conservazione in giorni per i container eliminati.
|
||||
- **Enable soft delete for file shares**: abilita un periodo di conservazione in giorni per le file share eliminate.
|
||||
- **Enable versioning for blobs**: mantiene le versioni precedenti dei blob.
|
||||
- **Enable blob change feed**: conserva i log delle modifiche di creazione, modifica ed eliminazione dei blob.
|
||||
- **Enable version-level immutability support**: consente di impostare una retention policy basata sul tempo a livello di account, che verrà applicata a tutte le versioni dei blob.
|
||||
- Il supporto all'immutabilità a livello di versione e il point-in-time restore per i container non possono essere abilitati contemporaneamente.
|
||||
|
||||
**Opzioni di configurazione della crittografia**:
|
||||
|
||||
- **Encryption type**: È possibile usare Microsoft-managed keys (MMK) o Customer-managed keys (CMK)
|
||||
- **Enable infrastructure encryption**: Consente di doppiare la crittografia dei dati "for more security"
|
||||
- **Encryption type**: è possibile utilizzare chiavi gestite da Microsoft (MMK) o chiavi gestite dal cliente (CMK).
|
||||
- **Enable infrastructure encryption**: consente di crittografare due volte i dati «per una maggiore sicurezza».
|
||||
|
||||
### Storage endpoints
|
||||
### Endpoint di storage
|
||||
|
||||
| Storage Service | Endpoint |
|
||||
| --- | --- |
|
||||
@@ -64,19 +64,19 @@ Azure Storage Accounts sono servizi fondamentali in Microsoft Azure che fornisco
|
||||
|
||||
### Esposizione pubblica
|
||||
|
||||
Se "Allow Blob public access" è **abilitato** (disabilitato per default), quando si crea un container è possibile:
|
||||
Se **Allow Blob public access** è **abilitato** (disabilitato per impostazione predefinita), quando si crea un container è possibile:
|
||||
|
||||
- Dare **accesso pubblico per leggere i blobs** (devi conoscere il nome).
|
||||
- **List container blobs** e **leggerli**.
|
||||
- Renderlo completamente **privato**
|
||||
- Fornire **accesso pubblico alla lettura dei blob** (è necessario conoscerne il nome).
|
||||
- **Elencare i blob del container** e **leggerli**.
|
||||
- Renderlo completamente **privato**.
|
||||
|
||||
<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUfoetUnYBPWQpRrWNnnlbqWpl8Rdoaeg5uBrCVlvcNDlnKwQHjZe8nUb2SfPspBgbu-lCZLmUei-hFi_Jl2eKbaxUtBGTjdUSDmkrcwr90VZkmuMjk9tyh92p75btfyzGiUTa0-=s2048?key=m8TV59TrCFPlkiNnmhYx3aZt" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Esposizione del sito statico (`$web`) e secrets leaked
|
||||
### Esposizione del sito statico (`$web`) e secrets esposti
|
||||
|
||||
- I **siti statici** vengono serviti dal container speciale `$web` tramite un endpoint specifico per region come `https://<account>.z13.web.core.windows.net/`.
|
||||
- Il container `$web` può riportare `publicAccess: null` tramite la blob API, ma i file restano comunque raggiungibili attraverso l'endpoint del sito statico, quindi lasciare lì artifact di configurazione/IaC può leak secrets.
|
||||
- Flusso rapido di audit:
|
||||
- I **siti statici** vengono forniti dal container speciale `$web` tramite un endpoint specifico della regione, come `https://<account>.z13.web.core.windows.net/`.
|
||||
- Il container `$web` può restituire `publicAccess: null` tramite la blob API, ma i file sono comunque raggiungibili tramite l'endpoint del sito statico; pertanto, inserire lì artefatti di configurazione/IaC può causare il leak di secrets.
|
||||
- Workflow di audit rapido:
|
||||
```bash
|
||||
# Identify storage accounts with static website hosting enabled
|
||||
az storage blob service-properties show --account-name <acc-name> --auth-mode login
|
||||
@@ -87,19 +87,19 @@ 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
|
||||
```
|
||||
### Auditare l'esposizione anonima dei blob
|
||||
### Auditing dell'esposizione anonima dei blob
|
||||
|
||||
- **Individua gli storage account** che possono esporre dati: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Se `allowBlobPublicAccess` è `false` non puoi rendere i container public.
|
||||
- **Individua gli account di storage** che possono esporre dati: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Se `allowBlobPublicAccess` è `false`, non puoi rendere pubblici i container.
|
||||
- **Ispeziona gli account a rischio** per confermare il flag e altre impostazioni deboli: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
|
||||
- **Enumera l'esposizione a livello di container** dove il flag è abilitato:**
|
||||
- **Enumera l'esposizione a livello di container** quando il flag è abilitato:
|
||||
```bash
|
||||
az storage container list --account-name <acc> \
|
||||
--query '[].{name:name, access:properties.publicAccess}'
|
||||
```
|
||||
- `"Blob"`: letture anonime consentite **solo quando il nome del blob è noto** (nessun listing).
|
||||
- `"Container"`: **list + read** anonimi di ogni blob.
|
||||
- `"Container"`: **listing + lettura** anonimi di ogni blob.
|
||||
- `null`: privato; autenticazione richiesta.
|
||||
- **Dimostra l'accesso** senza credenziali:
|
||||
- **Dimostrare l'accesso** senza credenziali:
|
||||
- Se `publicAccess` è `Container`, il listing anonimo funziona: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
|
||||
- Sia per `Blob` che per `Container`, il download anonimo del blob funziona quando il nome è noto:
|
||||
```bash
|
||||
@@ -107,33 +107,33 @@ az storage blob download -c <container> -n <blob> --account-name <acc> --file /d
|
||||
# or via raw HTTP
|
||||
curl "https://<acc>.blob.core.windows.net/<container>/<blob>"
|
||||
```
|
||||
### Connect to Storage
|
||||
### Connessione allo Storage
|
||||
|
||||
Se trovi uno **storage** a cui puoi connetterti, puoi usare lo strumento [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) per farlo.
|
||||
|
||||
## Access to Storage <a href="#about-blob-storage" id="about-blob-storage"></a>
|
||||
## Accesso allo Storage <a href="#about-blob-storage" id="about-blob-storage"></a>
|
||||
|
||||
### RBAC
|
||||
|
||||
È possibile usare i principal di Entra ID con i **RBAC roles** per accedere agli storage account ed è il metodo consigliato.
|
||||
È possibile usare le identità di Entra ID con **ruoli RBAC** per accedere agli account di storage, ed è il metodo consigliato.
|
||||
|
||||
### Access Keys
|
||||
### Chiavi di accesso
|
||||
|
||||
Gli storage account hanno access keys che possono essere usate per accedervi. Questo fornisce f**ull access to the storage account.**
|
||||
Gli account di storage dispongono di chiavi di accesso che possono essere usate per accedervi. Questo fornisce **accesso completo all'account di storage.**
|
||||
|
||||
<figure><img src="../../../images/image (5).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### **Shared Keys & Lite Shared Keys**
|
||||
### **Shared Keys e Lite Shared Keys**
|
||||
|
||||
È possibile [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) firmate con le access keys per autorizzare l'accesso a determinate risorse tramite una signed URL.
|
||||
È possibile [**generare Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) firmate con le chiavi di accesso per autorizzare l'accesso a determinate risorse tramite una signed URL.
|
||||
|
||||
> [!NOTE]
|
||||
> Nota che la parte `CanonicalizedResource` rappresenta la risorsa dei storage services (URI). E se una parte nella URL è encoded, deve essere encoded anche all'interno di `CanonicalizedResource`.
|
||||
> Nota che la parte `CanonicalizedResource` rappresenta la risorsa dei servizi di storage (URI). Inoltre, se una parte dell'URL è codificata, deve essere codificata anche all'interno di `CanonicalizedResource`.
|
||||
|
||||
> [!NOTE]
|
||||
> Questo viene **used by default by `az` cli** per autenticare le richieste. Per far sì che usi le credenziali del principal di Entra ID indica il parametro `--auth-mode login`.
|
||||
> Questo viene **usato per impostazione predefinita da `az` cli** per autenticare le richieste. Per fare in modo che utilizzi le credenziali dell'identità di Entra ID, indica il parametro `--auth-mode login`.
|
||||
|
||||
- È possibile generate una **shared key for blob, queue and file services** firmando le seguenti informazioni:
|
||||
- È possibile generare una **shared key per i servizi blob, queue e file** firmando le seguenti informazioni:
|
||||
```bash
|
||||
StringToSign = VERB + "\n" +
|
||||
Content-Encoding + "\n" +
|
||||
@@ -150,7 +150,7 @@ Range + "\n" +
|
||||
CanonicalizedHeaders +
|
||||
CanonicalizedResource;
|
||||
```
|
||||
- È possibile generare una **shared key per table services** firmando le seguenti informazioni:
|
||||
- È possibile generare una **chiave condivisa per i table services** firmando le seguenti informazioni:
|
||||
```bash
|
||||
StringToSign = VERB + "\n" +
|
||||
Content-MD5 + "\n" +
|
||||
@@ -158,7 +158,7 @@ Content-Type + "\n" +
|
||||
Date + "\n" +
|
||||
CanonicalizedResource;
|
||||
```
|
||||
- È possibile generare una **lite shared key for blob, queue and file services** firmando le seguenti informazioni:
|
||||
- È possibile generare una **lite shared key per i servizi blob, queue e file** firmando le seguenti informazioni:
|
||||
```bash
|
||||
StringToSign = VERB + "\n" +
|
||||
Content-MD5 + "\n" +
|
||||
@@ -167,12 +167,12 @@ Date + "\n" +
|
||||
CanonicalizedHeaders +
|
||||
CanonicalizedResource;
|
||||
```
|
||||
- È possibile generare una **lite shared key for table services** firmando le seguenti informazioni:
|
||||
- È possibile generare una **lite shared key per i table services** firmando le seguenti informazioni:
|
||||
```bash
|
||||
StringToSign = Date + "\n"
|
||||
CanonicalizedResource
|
||||
```
|
||||
Poi, per usare la key, si può fare nell'Authorization header seguendo la sintassi:
|
||||
Quindi, per usare la chiave, è possibile farlo nell'header Authorization seguendo la sintassi:
|
||||
```bash
|
||||
Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>"
|
||||
#e.g.
|
||||
@@ -186,68 +186,68 @@ Content-Length: 0
|
||||
```
|
||||
### **Shared Access Signature** (SAS)
|
||||
|
||||
Shared Access Signatures (SAS) sono URL sicuri e a tempo limitato che **concedono permessi specifici per accedere a risorse** in un Azure Storage account senza esporre le access keys dell'account. Mentre le access keys forniscono accesso amministrativo completo a tutte le risorse, SAS consente un controllo granulare specificando i permessi (come read o write) e definendo un tempo di scadenza.
|
||||
Le Shared Access Signatures (SAS) sono URL sicuri e limitati nel tempo che **concedono autorizzazioni specifiche per accedere alle risorse** in un account Azure Storage senza esporre le access keys dell'account. Mentre le access keys forniscono accesso amministrativo completo a tutte le risorse, SAS consente un controllo granulare specificando le autorizzazioni (come read o write) e definendo un tempo di scadenza.
|
||||
|
||||
#### SAS Types
|
||||
#### Tipi di SAS
|
||||
|
||||
- **User delegation SAS**: Viene creato da un **Entra ID principal** che firmerà il SAS e delegherà i permessi dall'utente al SAS. Può essere usato solo con **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). È possibile **revocare** tutti i user delegated SAS generati.
|
||||
- Anche se è possibile generare un delegation SAS con "più" permessi di quelli dell'utente. Tuttavia, se il principal non li ha, non funzionerà (no privesc).
|
||||
- **Service SAS**: È firmato usando una delle **access keys** dello storage account. Può essere usato per concedere accesso a risorse specifiche in un singolo storage service. Se la key viene rinnovata, il SAS smetterà di funzionare.
|
||||
- **Account SAS**: È anch'esso firmato con una delle **access keys** dello storage account. Concede accesso a risorse attraverso i servizi di uno storage account (Blob, Queue, Table, File) e può includere operazioni a livello di service.
|
||||
- **User delegation SAS**: viene creato da un **principal Entra ID** che firmerà il SAS e delegherà le autorizzazioni dall'utente al SAS. Può essere utilizzato solo con **blob e data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). È possibile **revocare** tutti gli user delegated SAS generati.
|
||||
- Anche se è possibile generare un delegation SAS con "più" autorizzazioni rispetto a quelle possedute dall'utente, se il principal non dispone di tali autorizzazioni, il SAS non funzionerà (nessun privesc).
|
||||
- **Service SAS**: viene firmato utilizzando una delle **access keys** dell'account di storage. Può essere utilizzato per concedere l'accesso a risorse specifiche all'interno di un singolo servizio di storage. Se la key viene rinnovata, il SAS smetterà di funzionare.
|
||||
- **Account SAS**: viene anch'esso firmato con una delle **access keys** dell'account di storage. Concede l'accesso alle risorse tra i servizi di un account di storage (Blob, Queue, Table, File) e può includere operazioni a livello di servizio.
|
||||
|
||||
Un SAS URL firmato da una **access key** appare così:
|
||||
Un SAS URL firmato da una **access key** ha il seguente aspetto:
|
||||
|
||||
- `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`
|
||||
|
||||
Un SAS URL firmato come **user delegation** appare così:
|
||||
Un SAS URL firmato come **user delegation** ha il seguente aspetto:
|
||||
|
||||
- `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`
|
||||
|
||||
Nota alcuni **http params**:
|
||||
Notare alcuni **parametri http**:
|
||||
|
||||
- Il parametro **`se`** indica la **data di scadenza** del SAS
|
||||
- Il parametro **`sp`** indica i **permessi** del SAS
|
||||
- Il **`sig`** è la **signature** che valida il SAS
|
||||
- Il parametro **`sp`** indica le **autorizzazioni** del SAS
|
||||
- **`sig`** è la **firma** che convalida il SAS
|
||||
|
||||
#### SAS permissions
|
||||
#### Autorizzazioni SAS
|
||||
|
||||
Quando si genera un SAS è necessario indicare i permessi che deve concedere. A seconda dell'oggetto su cui viene generato il SAS, possono essere inclusi permessi diversi. Per esempio:
|
||||
Quando si genera un SAS è necessario indicare le autorizzazioni che deve concedere. A seconda dell'oggetto su cui viene generato il SAS, possono essere incluse autorizzazioni diverse. Ad esempio:
|
||||
|
||||
- (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
|
||||
## Supporto SFTP per Azure Blob Storage
|
||||
|
||||
Azure Blob Storage ora supporta lo SSH File Transfer Protocol (SFTP), consentendo il transfer sicuro dei file e la gestione direttamente su Blob Storage senza richiedere soluzioni custom o prodotti di terze parti.
|
||||
Azure Blob Storage ora supporta lo SSH File Transfer Protocol (SFTP), consentendo il trasferimento e la gestione sicuri dei file direttamente in Blob Storage senza richiedere soluzioni personalizzate o prodotti di terze parti.
|
||||
|
||||
### Key Features
|
||||
### Funzionalità principali
|
||||
|
||||
- Protocol Support: SFTP funziona con Blob Storage accounts configurati con hierarchical namespace (HNS). Questo organizza i blob in directory e sottodirectory per una navigazione più semplice.
|
||||
- Security: SFTP può usare identità di local user, ma supporta anche accesso basato su Microsoft Entra ID con Azure RBAC per l'autorizzazione. Questo significa che l'accesso può essere concesso con i normali Blob Storage data-plane roles invece di creare local SFTP users. I local users possono autenticarsi tramite:
|
||||
- Azure-generated passwords
|
||||
- Public-private SSH key pairs
|
||||
- Granular Permissions: Permessi come Read, Write, Delete e List possono essere assegnati ai local users per fino a 100 containers.
|
||||
- Networking Considerations: Le connessioni SFTP vengono effettuate tramite la porta 22. Azure supporta configurazioni di rete come firewalls, private endpoints o virtual networks per proteggere il traffico SFTP.
|
||||
- Supporto del protocollo: SFTP funziona con gli account Blob Storage configurati con hierarchical namespace (HNS). Questo organizza i blob in directory e sottodirectory per semplificare la navigazione.
|
||||
- Sicurezza: SFTP può utilizzare identità di utenti locali, ma supporta anche l'accesso basato su Microsoft Entra ID con Azure RBAC per l'autorizzazione. Ciò significa che l'accesso può essere concesso utilizzando i consueti ruoli data-plane di Blob Storage invece di creare utenti SFTP locali. Gli utenti locali possono autenticarsi tramite:
|
||||
- Password generate da Azure
|
||||
- Coppie di chiavi SSH pubblica-privata
|
||||
- Autorizzazioni granulari: autorizzazioni come Read, Write, Delete e List possono essere assegnate agli utenti locali per un massimo di 100 container.
|
||||
- Considerazioni di networking: le connessioni SFTP vengono effettuate tramite la porta 22. Azure supporta configurazioni di rete come firewall, private endpoint o virtual network per proteggere il traffico SFTP.
|
||||
|
||||
### Setup Requirements
|
||||
### Requisiti di configurazione
|
||||
|
||||
- Hierarchical Namespace: HNS deve essere abilitato quando si crea lo storage account.
|
||||
- Supported Encryption: Richiede algoritmi crittografici approvati dal Microsoft Security Development Lifecycle (SDL) (ad esempio, rsa-sha2-256, ecdsa-sha2-nistp256).
|
||||
- SFTP Configuration:
|
||||
- Abilita SFTP sullo storage account.
|
||||
- Per l'accesso local-user, crea local user identities con i permessi appropriati.
|
||||
- Per i local users, configura home directories per definire la loro posizione iniziale all'interno del container.
|
||||
- Hierarchical Namespace: HNS deve essere abilitato durante la creazione dell'account di storage.
|
||||
- Crittografia supportata: richiede algoritmi crittografici approvati dal Microsoft Security Development Lifecycle (SDL) (ad esempio, rsa-sha2-256, ecdsa-sha2-nistp256).
|
||||
- Configurazione SFTP:
|
||||
- Abilitare SFTP sull'account di storage.
|
||||
- Per l'accesso tramite utenti locali, creare identità di utenti locali con le autorizzazioni appropriate.
|
||||
- Per gli utenti locali, configurare le home directory per definire la posizione iniziale all'interno del container.
|
||||
|
||||
### Permissions
|
||||
### Autorizzazioni
|
||||
|
||||
| Permission | Symbol | Description |
|
||||
| Autorizzazione | Simbolo | Descrizione |
|
||||
| ---------------------- | ------ | ------------------------------------ |
|
||||
| **Read** | `r` | Leggere il contenuto del file. |
|
||||
| **Write** | `w` | Caricare file e creare directory. |
|
||||
| **Read** | `r` | Leggere il contenuto dei file. |
|
||||
| **Write** | `w` | Caricare file e creare directory. |
|
||||
| **List** | `l` | Elencare il contenuto delle directory. |
|
||||
| **Delete** | `d` | Eliminare file o directory. |
|
||||
| **Create** | `c` | Creare file o directory. |
|
||||
| **Modify Ownership** | `o` | Cambiare l'utente o il gruppo proprietario. |
|
||||
| **Modify Permissions** | `p` | Cambiare gli ACL su file o directory. |
|
||||
| **Delete** | `d` | Eliminare file o directory. |
|
||||
| **Create** | `c` | Creare file o directory. |
|
||||
| **Modify Ownership** | `o` | Modificare l'utente o il gruppo proprietario. |
|
||||
| **Modify Permissions** | `p` | Modificare gli ACL su file o directory. |
|
||||
|
||||
## Enumeration
|
||||
|
||||
@@ -379,7 +379,7 @@ az storage account local-user list \
|
||||
{{#tab name="Az PowerShell" }}
|
||||
|
||||
<details>
|
||||
<summary>Enumerazione Az PowerShell</summary>
|
||||
<summary>Enumerazione di Az PowerShell</summary>
|
||||
```powershell
|
||||
# Get storage accounts
|
||||
Get-AzStorageAccount | fl
|
||||
@@ -454,13 +454,13 @@ az-file-shares.md
|
||||
../az-privilege-escalation/az-storage-privesc.md
|
||||
{{#endref}}
|
||||
|
||||
## Post Exploitation
|
||||
## Post-exploitation
|
||||
|
||||
{{#ref}}
|
||||
../az-post-exploitation/az-blob-storage-post-exploitation.md
|
||||
{{#endref}}
|
||||
|
||||
## Persistence
|
||||
## Persistenza
|
||||
|
||||
{{#ref}}
|
||||
../az-persistence/az-storage-persistence.md
|
||||
|
||||
Reference in New Issue
Block a user