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

This commit is contained in:
Translator
2026-07-17 06:09:55 +00:00
parent c630d5243d
commit 37e8193622
2 changed files with 155 additions and 155 deletions
@@ -4,47 +4,47 @@
## Azure SQL
Azure SQL — це сімейство керованих, безпечних і інтелектуальних продуктів, які використовують **SQL Server database engine в Azure cloud**. Це означає, що вам не потрібно турбуватися про фізичне адміністрування ваших серверів, і ви можете зосередитися на керуванні вашими даними.
Azure SQL — це сімейство керованих, безпечних та інтелектуальних продуктів, які використовують **SQL Server database engine в Azure cloud**. Це означає, що вам не потрібно турбуватися про фізичне адміністрування серверів, і ви можете зосередитися на керуванні даними.
Azure SQL складається з чотирьох основних пропозицій:
1. **Azure SQL Server**: Сервер потрібен для **розгортання та керування** SQL Server databases.
2. **Azure SQL Database**: Це **повністю керований database service**, який дозволяє розміщувати окремі databases в Azure cloud.
3. **Azure SQL Managed Instance**: Це для більших за масштабом розгортань у межах всього SQL Server instance-scoped.
4. **Azure SQL Server on Azure VMs**: Це найкраще для архітектур, де ви хочете **контроль над operating system **і SQL Server instance.
1. **Azure SQL Server**: Сервер потрібен для **розгортання та керування** базами даних SQL Server.
2. **Azure SQL Database**: Це **повністю керований сервіс баз даних**, який дає змогу розміщувати окремі бази даних в Azure cloud.
3. **Azure SQL Managed Instance**: Призначено для розгортань більших масштабів, які охоплюють весь екземпляр SQL Server.
4. **Azure SQL Server on Azure VMs**: Найкраще підходить для архітектур, у яких потрібен **контроль над операційною системою **та екземпляром SQL Server.
### SQL Server Security Features
**Network access:**
- Public endpoint (можна обмежити доступ до певних networks).
- Public endpoint (можна обмежити доступ до певних мереж).
- Private endpoints.
- Також можна обмежити connections на основі domain names.
- Також можна дозволити Azure services доступатися до нього (наприклад, щоб використовувати Query editor у portal або дозволити Azure VM підключатися).
- Якщо в SQL Server для *Allow Azure services and resources to access this server* встановлено "Enabled", Azure автоматично створить приховане firewall rule, яке дозволяє весь network traffic, що походить з Azure, підключатися до SQL Server — включно з resources з будь-якого tenant.
- Це означає, що якщо ви отримаєте valid SQL credentials, ви можете підключитися до victim Azure SQL Server з Azure VM у вашому власному attackercontrolled tenant. [The MS docs explains this](https://learn.microsoft.com/en-us/azure/azure-sql/database/network-access-controls-overview?view=azuresql#allow-azure-services)
- Також можна обмежити підключення на основі доменних імен.
- Також можна дозволити Azure services отримувати до нього доступ (наприклад, для використання Query editor на порталі або підключення Azure VM).
- Якщо для SQL Server параметр *Allow Azure services and resources to access this server* встановлено на "Enabled", Azure автоматично створить приховане правило firewall, яке дозволяє всьому мережевому трафіку, що походить з Azure, підключатися до SQL Server — зокрема ресурсам із будь-якого tenant.
- Це означає, що якщо ви отримаєте дійсні SQL credentials, то зможете підключитися до Azure SQL Server жертви з Azure VM у власному tenant, контрольованому 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)
**Authentication Methods:**
- Microsoft **Entra-only** authentication: Вам потрібно вказати Entra principals, які матимуть доступ до service.
- **Both SQL and Microsoft Entra** authentication: Traditional SQL authentication з username and password разом із Microsoft Entra.
- **Only SQL** authentication: Дозволити доступ лише через database users.
- Аутентифікація лише через Microsoft **Entra**: потрібно вказати Entra principals, які матимуть доступ до сервісу.
- Аутентифікація через **SQL і Microsoft Entra**: традиційна SQL-аутентифікація з іменем користувача та паролем разом із Microsoft Entra.
- Аутентифікація **лише через SQL**: дозволяється доступ лише через користувачів бази даних.
Зверніть увагу, що якщо дозволено будь-який SQL auth, потрібно вказати admin user (username + password), а якщо вибрано Entra ID auth, також потрібно вказати щонайменше один principal з admin access.
Зверніть увагу, що якщо дозволено будь-яку SQL auth, потрібно вказати admin user (ім’я користувача + пароль), а якщо вибрано Entra ID auth, також потрібно вказати щонайменше один principal з admin access.
**Encryption:**
- Це називається “Transparent data encryption”, і воно encrypts databases, backups, and logs at rest.
- Це називається “Transparent data encryption”, і вона шифрує бази даних, резервні копії та логи у стані спокою.
- Як завжди, за замовчуванням використовується Azure managed key, але також можна використовувати customer managed encryption key (CMEK).
**Managed Identities:**
- Можна призначати system and user managed MIs.
- Використовується для доступу до encryption key (якщо використовується CMEK) та інших services з databases.
- Для деяких прикладів Azure services, до яких можна отримати доступ із database, перегляньте [this page of the docs](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql)
- Якщо призначено більше ніж один UMI, можна вказати default one to use.
- Можна призначати system і user managed MIs.
- Використовуються для доступу до encryption key (якщо використовується CMEK) та інших сервісів із баз даних.
- Приклади Azure services, до яких можна отримати доступ із бази даних, наведено на [this page of the docs](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql)
- Якщо призначено більше одного UMI, можна вказати типовий для використання.
- Можна налаштувати federated client identity для cross-tenant access.
Some commands to access info inside a blob storage from a SQL database:
Деякі команди для доступу до інформації всередині blob storage з SQL database:
```sql
-- Create a credential for the managed identity
CREATE DATABASE SCOPED CREDENTIAL [ManagedIdentityCredential]
@@ -71,58 +71,58 @@ GO
```
**Microsoft Defender:**
- Корисний для “mitigating potential database vulnerabilities, and detecting anomalous activities”
- Про Defender ми поговоримо в окремому уроці (його можна увімкнути в кількох інших Azure services)
- Корисний для «пом’якшення потенційних вразливостей баз даних і виявлення аномальної активності»
- Ми розглянемо Defender в окремому уроці (його можна ввімкнути в кількох інших Azure-сервісах)
**Backups:**
- Частота backup керується в retention policies.
- Частота створення резервних копій керується політиками зберігання.
**Deleted databases:**
- Можна restore DBs, які були deleted, з наявних backups.
- Можна відновити DB, які були видалені, з наявних резервних копій.
## Azure SQL Database
**Azure SQL Database** — це **fully managed database platform as a service (PaaS)**, яка надає масштабовані та безпечні relational database рішення. Вона побудована на найновіших SQL Server technologies і усуває потребу в infrastructure management, що робить її популярним вибором для cloud-based applications.
**Azure SQL Database** — це **повністю керована database platform as a service (PaaS)**, яка надає масштабовані та безпечні реляційні рішення для баз даних. Вона побудована на найновіших технологіях SQL Server і усуває потребу в керуванні інфраструктурою, що робить її популярним вибором для cloud-based applications.
Щоб створити SQL database, потрібно вказати SQL server, на якому вона буде hosted.
Щоб створити SQL database, потрібно вказати SQL server, на якому вона буде розміщена.
### SQL Database Security Features
- **Always Up-to-Date**: Працює на найновішій stable версії SQL Server і автоматично отримує нові features та patches.
- **Always Up-to-Date**: працює на останній стабільній версії SQL Server і автоматично отримує нові функції та patches.
- **Inherited SQL Server security features:**
- Authentication (SQL and/or Entra ID)
- Authentication (SQL та/або Entra ID)
- Assigned Managed Identities
- Network restrictions
- Encryption
- Backups
-
- **Data redundancy:** Опції: local, zone, Geo або Geo-Zone redundant.
- **Ledger:** Cryptographically verifies integrity of data, ensuring that any tampering is detected. Корисно для financial, medical і будь-якої organization, що керує sensitive data.
- **Data redundancy:** доступні варіанти локальної, зональної, Geo або Geo-Zone redundancy.
- **Ledger:** криптографічно перевіряє цілісність даних, гарантуючи виявлення будь-якого tampering. Корисно для фінансових, медичних та будь-яких організацій, які працюють із чутливими даними.
SQL database може бути частиною **elastic Pool**. Elastic pools — це cost-effective рішення для керування кількома databases шляхом спільного використання configurable compute (eDTUs) і storage resources між ними, з pricing, що базується лише на allocated resources, а не на number of databases.
SQL database може бути частиною **elastic Pool**. Elastic pools — це економічно ефективне рішення для керування кількома базами даних шляхом спільного використання налаштованих обчислювальних ресурсів (eDTUs) і сховища, при цьому ціна залежить лише від виділених ресурсів, а не від кількості баз даних.
#### Azure SQL Column Level Security (Masking) & Row Level Security
**Azure SQL's dynamic** data masking — це feature, яка допомагає **protect sensitive information by hiding it** від unauthorized users. Замість зміни actual data, вона динамічно masks displayed data, забезпечуючи, що sensitive details, як-от credit card numbers, приховані.
**Azure SQL's dynamic** data masking — це функція, яка допомагає **захистити чутливу інформацію, приховуючи її** від неавторизованих користувачів. Замість зміни фактичних даних вона динамічно маскує відображувані дані, гарантуючи, що такі чутливі відомості, як номери кредитних карток, будуть приховані.
**Dynamic Data Masking** affects to all users except the ones that are unmasked (these users need to be indicated) and administrators. It has the configuration option that specifies which SQL users are exempt from dynamic data masking, with **administrators always excluded**.
**Dynamic Data Masking** застосовується до всіх користувачів, крім тих, для кого masking вимкнено (таких користувачів потрібно вказати), і адміністраторів. Існує параметр конфігурації, який визначає, які SQL users звільняються від dynamic data masking, причому **адміністратори завжди виключаються**.
**Azure SQL Row Level Security (RLS)** — це feature, яка **controls which rows a user can view or modify**, забезпечуючи, що кожен user бачить only the data relevant to them. Створюючи security policies з filter або block predicates, organizations можуть enforce fine-grained access на database level.
**Azure SQL Row Level Security (RLS)** — це функція, яка **контролює, які рядки користувач може переглядати або змінювати**, гарантуючи, що кожен користувач бачить лише релевантні для нього дані. Створюючи security policies із filter або block predicates, організації можуть застосовувати детальний контроль доступу на рівні database.
### Azure SQL Managed Instance
**Azure SQL Managed Instances** призначені для larger scale, entire SQL Server instance-scoped deployments. Вони надають near 100% compatibility з latest SQL Server on-premises (Enterprise Edition) Database Engine, що provides native virtual network (VNet) implementation, яка addresses common security concerns, і business model, favorable for on-premises SQL Server customers.
**Azure SQL Managed Instances** призначені для розгортань більшого масштабу, охоплюючи весь instance-scoped SQL Server. Вони забезпечують майже 100% сумісність із найновішим локальним SQL Server (Enterprise Edition) Database Engine, надають нативну реалізацію virtual network (VNet), яка вирішує поширені security concerns, а також бізнес-модель, вигідну для клієнтів локального SQL Server.
### Azure SQL Virtual Machines
**Azure SQL Virtual Machines** дозволяють **control the operating system** і SQL Server instance, оскільки VM буде spawn у VM service з running SQL server.
**Azure SQL Virtual Machines** дозволяють **контролювати операційну систему** та instance SQL Server, оскільки у VM service буде створено VM із запущеним SQL server.
Коли створюється SQL Virtual Machine, можна **selected all the settings of the VM** (як показано в VM lesson), яка буде hosting SQL server.
- Це означає, що VM буде accessing some VNet(s), може мати до неї **Managed Identities attached**, може мати file shares mounted… що робить **pivoting from the SQL** до VM дуже цікавим.
- Крім того, можна configure app id and secret, щоб **allow the SQL to access an specific key vault**, який може містити sensitive info.
Під час створення SQL Virtual Machine можна **вибрати всі налаштування VM** (як показано в уроці про VM), яка розміщуватиме SQL server.
- Це означає, що VM матиме доступ до певних VNet(s), до неї можуть бути **приєднані Managed Identities**, на ній можуть бути змонтовані file shares… що робить **pivoting із SQL** до VM дуже цікавим.
- Крім того, можна налаштувати app id і secret, щоб **дозволити SQL отримувати доступ до певного key vault**, який може містити чутливу інформацію.
Також можна configure такі речі, як **automatic SQL updates**, **automatic backups**, **Entra ID authentication** і більшість features інших SQL services.
Також можна налаштувати такі функції, як **automatic SQL updates**, **automatic backups**, **Entra ID authentication** і більшість функцій інших SQL-сервісів.
## Enumeration
@@ -261,7 +261,7 @@ Get-AzSqlVM
{{#endtab}}
{{#endtabs}}
Крім того, якщо ви хочете перерахувати Dynamic Data Masking і Row Level policies у межах database, ви можете виконати запит:
Крім того, якщо ви хочете перелічити Dynamic Data Masking і політики Row Level у базі даних, ви можете виконати запит:
```sql
--Enumerates the masked columns
SELECT
@@ -288,7 +288,7 @@ ON sp.object_id = sp2.object_id;
```
### Підключення та виконання SQL-запитів
Ви можете знайти рядок підключення (що містить credentials) з прикладу [enumerating an Az WebApp](az-app-services.md):
Ви можете знайти рядок підключення (що містить облікові дані) у прикладі [перерахування Az WebApp](az-app-services.md):
```bash
function invoke-sql{
param($query)
@@ -307,18 +307,18 @@ $Connection.Close()
invoke-sql 'Select Distinct TABLE_NAME From information_schema.TABLES;'
```
Також можна використовувати sqlcmd для доступу до бази даних. Важливо знати, чи сервер дозволяє публічні з’єднання `az sql server show --name <server-name> --resource-group <resource-group>`, а також чи правило firewall дозволяє нашій IP-адресі доступ:
Ви також можете використовувати sqlcmd для доступу до бази даних. Важливо дізнатися, чи дозволяє сервер публічні підключення `az sql server show --name <server-name> --resource-group <resource-group>`, а також чи дозволяє правило firewall нашій IP-адресі підключатися:
```bash
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>
```
## References
## Посилання
- [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)
- [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)
## Підвищення привілеїв
## Ескалація привілеїв
{{#ref}}
../az-privilege-escalation/az-sql-privesc.md
@@ -2,54 +2,54 @@
{{#include ../../../banners/hacktricks-training.md}}
## Basic Information
## Основна інформація
Azure Storage Accounts є фундаментальними сервісами в Microsoft Azure, що надають масштабоване, безпечне та високо доступне cloud **storage for various data types**, including blobs (binary large objects), files, queues, and tables. Вони слугують контейнерами, які обєднують ці різні storage services під одним namespace для зручного керування.
Azure Storage Accounts — це фундаментальні сервіси Microsoft Azure, які забезпечують масштабоване, безпечне та високодоступне cloud **сховище для різних типів даних**, зокрема blobs (великих бінарних об'єктів), файлів, черг і таблиць. Вони слугують контейнерами, що об'єднують ці різні служби сховища в єдиному namespace для зручного керування.
**Main configuration options**:
**Основні параметри конфігурації**:
- Every storage account must have a **uniq name across all Azure**.
- Every storage account is deployed in a **region** or in an Azure extended zone
- It's possible to select the **premium** version of the storage account for better performance
- It's possible to select among **4 types of redundancy to protect** against rack, drive and datacenter **failures**.
- Кожен storage account повинен мати **унікальне ім'я в усіх Azure**.
- Кожен storage account розгортається в **регіоні** або в розширеній зоні Azure
- Можна вибрати **premium**-версію storage account для кращої продуктивності
- Можна вибрати один із **4 типів надлишковості для захисту** від **відмов** стійок, дисків і дата-центрів.
**Security configuration options**:
**Параметри конфігурації безпеки**:
- **Require secure transfer for REST API operations**: Require TLS in any communication with the storage
- **Allows enabling anonymous access on individual containers**: If not, it won't be possible to enable anonymous access in the future
- **Enable storage account key access**: If not, access with Shared Keys will be forbidden
- **Require secure transfer for REST API operations**: вимагати TLS для будь-якого обміну даними зі сховищем
- **Allows enabling anonymous access on individual containers**: якщо вимкнено, у майбутньому буде неможливо ввімкнути анонімний доступ
- **Enable storage account key access**: якщо вимкнено, доступ за допомогою Shared Keys буде заборонено
- **Minimum TLS version**
- **Permitted scope for copy operations**: Allow from any storage account, from any storage account from the same Entra tenant or from storage account with private endpoints in the same virtual network.
- **Permitted scope for copy operations**: дозволити з будь-якого storage account, з будь-якого storage account у тому самому Entra tenant або зі storage account із private endpoints у тій самій virtual network.
**Blob Storage options**:
**Параметри Blob Storage**:
- **Allow cross-tenant replication**
- **Access tier**: Hot (frequently access data), Cool and Cold (rarely accessed data)
- **Access tier**: Hot (дані, до яких часто звертаються), Cool і Cold (дані, до яких рідко звертаються)
**Networking options**:
**Параметри мережі**:
- **Network access**:
- Allow from all networks
- Allow from selected virtual networks and IP addresses
- Disable public access and use private access
- **Private endpoints**: It allows a private connection to the storage account from a virtual network
- Дозволити доступ з усіх мереж
- Дозволити доступ із вибраних virtual networks та IP-адрес
- Вимкнути публічний доступ і використовувати private access
- **Private endpoints**: це дає змогу встановити private connection до storage account із virtual network
**Data protection options**:
**Параметри захисту даних**:
- **Point-in-time restore for containers**: Allows to restore containers to an earlier state
- It requires versioning, change feed, and blob soft delete to be enabled.
- **Enable soft delete for blobs**: It enables a retention period in days for deleted blobs (even overwritten)
- **Enable soft delete for containers**: It enables a retention period in days for deleted containers
- **Enable soft delete for file shares**: It enables a retention period in days for deleted file shared
- **Enable versioning for blobs**: Maintain previous versions of your blobs
- **Enable blob change feed**: Keep logs of create, modification, and delete changes to blobs
- **Enable version-level immutability support**: Allows you to set time-based retention policy on the account-level that will apply to all blob versions.
- Version-level immutability support and point-in-time restore for containers cannot be enabled simultaneously.
- **Point-in-time restore for containers**: дає змогу відновити контейнери до попереднього стану
- Для цього потрібно ввімкнути versioning, change feed і blob soft delete.
- **Enable soft delete for blobs**: вмикає період зберігання у днях для видалених blobs (навіть перезаписаних)
- **Enable soft delete for containers**: вмикає період зберігання у днях для видалених контейнерів
- **Enable soft delete for file shares**: вмикає період зберігання у днях для видалених file shares
- **Enable versioning for blobs**: зберігати попередні версії ваших blobs
- **Enable blob change feed**: зберігати журнали змін створення, модифікації та видалення blobs
- **Enable version-level immutability support**: дає змогу встановити політику зберігання на основі часу на рівні account, яка застосовуватиметься до всіх версій blobs.
- Version-level immutability support і point-in-time restore for containers не можна ввімкнути одночасно.
**Encryption configuration options**:
**Параметри конфігурації шифрування**:
- **Encryption type**: It's possible to use Microsoft-managed keys (MMK) or Customer-managed keys (CMK)
- **Enable infrastructure encryption**: Allows to double encrypt the data "for more security"
- **Encryption type**: можна використовувати ключі, керовані Microsoft (MMK), або ключі, керовані клієнтом (CMK)
- **Enable infrastructure encryption**: дає змогу подвійно зашифрувати дані "для більшої безпеки"
### Storage endpoints
@@ -62,21 +62,21 @@ Azure Storage Accounts є фундаментальними сервісами в
| **Queue storage** | `https://<storage-account>.queue.core.windows.net` |
| **Table storage** | `https://<storage-account>.table.core.windows.net` |
### Public Exposure
### Публічний доступ
If "Allow Blob public access" is **enabled** (disabled by default), when creating a container it's possible to:
Якщо параметр "Allow Blob public access" **увімкнено** (за замовчуванням вимкнено), під час створення контейнера можна:
- Give **public access to read blobs** (you need to know the name).
- **List container blobs** and **read** them.
- Make it fully **private**
- Надати **публічний доступ для читання blobs** (потрібно знати ім'я).
- **Перераховувати blobs контейнера** та **читати** їх.
- Зробити його повністю **приватним**
<figure><img src="https://lh7-rt.googleusercontent.com/slidesz/AGV_vUfoetUnYBPWQpRrWNnnlbqWpl8Rdoaeg5uBrCVlvcNDlnKwQHjZe8nUb2SfPspBgbu-lCZLmUei-hFi_Jl2eKbaxUtBGTjdUSDmkrcwr90VZkmuMjk9tyh92p75btfyzGiUTa0-=s2048?key=m8TV59TrCFPlkiNnmhYx3aZt" alt=""><figcaption></figcaption></figure>
### Static website (`$web`) exposure & leaked secrets
### Відкритість Static website (`$web`) і leaked secrets
- **Static websites** are served from the special `$web` container over a region-specific endpoint such as `https://<account>.z13.web.core.windows.net/`.
- The `$web` container may report `publicAccess: null` via the blob API, but files are still reachable through the static site endpoint, so dropping config/IaC artifacts there can leak secrets.
- Quick audit workflow:
- **Static websites** обслуговуються зі спеціального контейнера `$web` через endpoint, специфічний для регіону, наприклад `https://<account>.z13.web.core.windows.net/`.
- Контейнер `$web` може повертати `publicAccess: null` через blob API, але файли все одно доступні через endpoint static site, тому розміщення там артефактів конфігурації/IaC може призвести до leak secrets.
- Швидкий процес аудиту:
```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
### Аудит анонімного доступу до blob
- **Знайдіть storage accounts**, які можуть expose дані: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Якщо `allowBlobPublicAccess` дорівнює `false`, ви не можете зробити containers public.
- **Перевірте risky accounts**, щоб підтвердити flag та інші weak settings: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
- **Перелічіть container-level exposure**, де flag увімкнено:
- **Знайдіть облікові записи сховища**, які можуть розкривати дані: `az storage account list | jq -r '.[] | select(.properties.allowBlobPublicAccess==true) | .name'`. Якщо `allowBlobPublicAccess` має значення `false`, ви не можете зробити контейнери загальнодоступними.
- **Перевірте ризиковані облікові записи**, щоб підтвердити цей параметр та інші слабкі налаштування: `az storage account show --name <acc> --query '{allow:properties.allowBlobPublicAccess, minTls:properties.minimumTlsVersion}'`.
- **Перелічіть доступ на рівні контейнерів**, якщо цей параметр увімкнено:
```bash
az storage container list --account-name <acc> \
--query '[].{name:name, access:properties.publicAccess}'
```
- `"Blob"`: анонімні reads дозволені **лише коли blob name відомий** (без listing).
- `"Container"`: анонімні **list + read** для кожного blob.
- `null`: private; потрібна authentication.
- **Підтвердити access** без credentials:
- Якщо `publicAccess` це `Container`, анонімний listing працює: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
- Для `Blob` і `Container`, анонімний blob download працює, коли name відомий:
- `"Blob"`: анонімне читання дозволене **лише коли ім'я blob відоме** (без listing).
- `"Container"`: анонімний **list + read** кожного blob.
- `null`: приватний; потрібна authentication.
- **Підтвердити доступ** без credentials:
- Якщо `publicAccess` має значення `Container`, анонімний listing працює: `curl "https://<acc>.blob.core.windows.net/<container>?restype=container&comp=list"`.
- Для обох `Blob` і `Container` анонімне завантаження blob працює, коли його ім'я відоме:
```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
### Підключення до Storage
If you find any **storage** you can connect to you could use the tool [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/) to do so.
Якщо ви знайдете будь-яке **сховище**, до якого можна підключитися, для цього можна використати інструмент [**Microsoft Azure Storage Explorer**](https://azure.microsoft.com/es-es/products/storage/storage-explorer/).
## Access to Storage <a href="#about-blob-storage" id="about-blob-storage"></a>
## Доступ до Storage <a href="#about-blob-storage" id="about-blob-storage"></a>
### RBAC
It's possible to use Entra ID principals with **RBAC roles** to access storage accounts and it's the recommended way.
Для доступу до storage accounts можна використовувати principals Entra ID із **ролями RBAC** — це рекомендований спосіб.
### Access Keys
### Ключі доступу
The storage accounts have access keys that can be used to access it. This provides f**ull access to the storage account.**
Storage accounts мають ключі доступу, які можна використовувати для доступу до них. Це надає п**овний доступ до storage account.**
<figure><img src="../../../images/image (5).png" alt=""><figcaption></figcaption></figure>
### **Shared Keys & Lite Shared Keys**
It's possible to [**generate Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key) signed with the access keys to authorize access to certain resources via a signed URL.
Можна [**згенерувати Shared Keys**](https://learn.microsoft.com/en-us/rest/api/storageservices/authorize-with-shared-key), підписані ключами доступу, щоб авторизувати доступ до певних ресурсів за допомогою підписаного URL.
> [!NOTE]
> Note that the `CanonicalizedResource` part represents the storage services resource (URI). And if any part in the URL is encoded, it should also be encoded inside the `CanonicalizedResource`.
> Зверніть увагу, що частина `CanonicalizedResource` представляє ресурс storage services (URI). Якщо будь-яка частина URL закодована, її також потрібно закодувати всередині `CanonicalizedResource`.
> [!NOTE]
> This is **used by default by `az` cli** to authenticate requests. To make it use the Entra ID principal credentials indicate the param `--auth-mode login`.
> **За замовчуванням це використовується `az` cli** для автентифікації запитів. Щоб використовувати облікові дані principal Entra ID, вкажіть параметр `--auth-mode login`.
- It's possible to generate a **shared key for blob, queue and file services** signing the following information:
- Можна згенерувати **shared key для blob, queue та file services**, підписавши наведену нижче інформацію:
```bash
StringToSign = VERB + "\n" +
Content-Encoding + "\n" +
@@ -150,7 +150,7 @@ Range + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
- Можливо згенерувати **shared key for table services**, підписавши таку інформацію:
- Можна згенерувати **спільний ключ для table services**, підписавши наведену нижче інформацію:
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
@@ -158,7 +158,7 @@ Content-Type + "\n" +
Date + "\n" +
CanonicalizedResource;
```
- Можна згенерувати **lite shared key for blob, queue and file services** підписуючи таку інформацію:
- Можна згенерувати **lite shared key для blob, queue та file services**, підписавши наведену нижче інформацію:
```bash
StringToSign = VERB + "\n" +
Content-MD5 + "\n" +
@@ -167,12 +167,12 @@ Date + "\n" +
CanonicalizedHeaders +
CanonicalizedResource;
```
- Можна згенерувати **lite shared key for table services**, підписавши таку інформацію:
- Можна згенерувати **lite shared key для табличних служб**, підписавши наведену нижче інформацію:
```bash
StringToSign = Date + "\n"
CanonicalizedResource
```
Потім, щоб використати ключ, це можна зробити в заголовку Authorization, дотримуючись синтаксису:
Потім, щоб використати ключ, це можна зробити в заголовку Authorization за таким синтаксисом:
```bash
Authorization="[SharedKey|SharedKeyLite] <AccountName>:<Signature>"
#e.g.
@@ -186,76 +186,76 @@ Content-Length: 0
```
### **Shared Access Signature** (SAS)
Shared Access Signatures (SAS) — це безпечні, обмежені за часом URL-адреси, які **надають конкретні permissions для доступу до resources** в Azure Storage account без розкриття access keys account. Хоча access keys надають повний адміністративний доступ до всіх resources, SAS дозволяє granular control шляхом вказання permissions (наприклад, read або write) і визначення часу завершення дії.
Shared Access Signatures (SAS) — це захищені URL-адреси з обмеженим терміном дії, які **надають певні дозволи для доступу до ресурсі**в в обліковому записі Azure Storage без розкриття access keys облікового запису. Тоді як access keys надають повний адміністративний доступ до всіх ресурсів, SAS забезпечує детальний контроль шляхом визначення дозволів (наприклад, читання або запису) і часу завершення дії.
#### SAS Types
#### Типи SAS
- **User delegation SAS**: Створюється з **Entra ID principal**, який підписує SAS і делегує permissions від user до SAS. Його можна використовувати лише з **blob and data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Можна **revoke** всі згенеровані user delegated SAS.
- Навіть якщо можна згенерувати delegation SAS із "більшими" permissions, ніж має user. Однак, якщо principal їх не має, це не спрацює (no privesc).
- **Service SAS**: Підписується за допомогою одного з storage account **access keys**. Його можна використовувати для надання доступу до конкретних resources в одному storage service. Якщо key буде оновлено, SAS перестане працювати.
- **Account SAS**: Також підписується за допомогою одного з storage account **access keys**. Він надає доступ до resources across storage account services (Blob, Queue, Table, File) і може включати service-level operations.
- **User delegation SAS**: створюється з **Entra ID principal**, який підписує SAS і делегує дозволи від користувача SAS. Його можна використовувати лише з **blob і data lake storage** ([docs](https://learn.microsoft.com/en-us/rest/api/storageservices/create-user-delegation-sas)). Є можливість **відкликати** всі згенеровані user delegation SAS.
- Навіть якщо можна згенерувати delegation SAS із "більшими" дозволами, ніж ті, які має користувач, він не працюватиме, якщо principal не має цих дозволів (no privesc).
- **Service SAS**: підписується за допомогою одного з **access keys** облікового запису storage. Його можна використовувати для надання доступу до певних ресурсів в одній storage service. Якщо ключ оновити, SAS припинить працювати.
- **Account SAS**: також підписується за допомогою одного з **access keys** облікового запису storage. Він надає доступ до ресурсів у всіх services облікового запису storage (Blob, Queue, Table, File) і може включати операції на рівні service.
SAS URL, підписаний за допомогою **access key**, виглядає так:
URL-адреса SAS, підписана **access key**, має такий вигляд:
- `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`
SAS URL, підписаний як **user delegation**, виглядає так:
URL-адреса SAS, підписана як **user delegation**, має такий вигляд:
- `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`
Зверніть увагу на деякі **http params**:
- Параметр **`se`** вказує **expiration date** SAS
- Параметр **`sp`** вказує **permissions** SAS
- **`sig`** — це **signature**, що валідовує SAS
- Параметр **`se`** вказує **дату завершення дії** SAS
- Параметр **`sp`** вказує **дозволи** SAS
- **`sig`** — це **підпис**, який перевіряє SAS
#### SAS permissions
#### Дозволи SAS
Під час генерації SAS потрібно вказати permissions, які він має надавати. Залежно від object, поверх якого генерується SAS, можуть бути включені різні permissions. Наприклад:
Під час генерації SAS потрібно вказати дозволи, які він має надавати. Залежно від об'єкта, для якого генерується SAS, можуть використовуватися різні дозволи. Наприклад:
- (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
## Підтримка SFTP для Azure Blob Storage
Azure Blob Storage тепер підтримує SSH File Transfer Protocol (SFTP), що дає змогу безпечно передавати files і керувати ними безпосередньо в Blob Storage без потреби в custom solutions або third-party products.
Azure Blob Storage тепер підтримує SSH File Transfer Protocol (SFTP), що забезпечує безпечне передавання файлів і керування ними безпосередньо в Blob Storage без потреби у custom solutions або продуктах third-party.
### Key Features
### Основні можливості
- Protocol Support: SFTP працює з Blob Storage accounts, налаштованими з hierarchical namespace (HNS). Це організовує blobs у directories і subdirectories для зручнішої навігації.
- Security: SFTP може використовувати local user identities, але також підтримує Microsoft Entra ID-based access з Azure RBAC для authorization. Це означає, що доступ можна надавати через звичайні Blob Storage data-plane roles замість створення local SFTP users. Local users можуть authenticate via:
- Azure-generated passwords
- Public-private SSH key pairs
- Granular Permissions: Permissions, такі як Read, Write, Delete, і List, можуть бути призначені local users для до 100 containers.
- Networking Considerations: SFTP connections встановлюються через port 22. Azure підтримує network configurations, як-от firewalls, private endpoints, або virtual networks, щоб захистити SFTP traffic.
- Підтримка протоколу: SFTP працює з обліковими записами Blob Storage, налаштованими з hierarchical namespace (HNS). Це організовує blobs у директорії та піддиректорії для зручнішої навігації.
- Безпека: SFTP може використовувати identities локальних користувачів, але також підтримує доступ на основі Microsoft Entra ID з Azure RBAC для авторизації. Це означає, що доступ можна надавати за допомогою стандартних ролей data-plane Blob Storage замість створення локальних SFTP-користувачів. Локальні користувачі можуть автентифікуватися за допомогою:
- Паролів, згенерованих Azure
- Пар ключів SSH public-private
- Деталізовані дозволи: локальним користувачам можна призначати такі дозволи, як Read, Write, Delete і List, максимум для 100 containers.
- Мережеві міркування: SFTP-з'єднання встановлюються через port 22. Azure підтримує такі мережеві конфігурації, як firewalls, private endpoints або virtual networks, для захисту SFTP-трафіку.
### Setup Requirements
### Вимоги до налаштування
- Hierarchical Namespace: HNS має бути увімкнено під час створення storage account.
- Supported Encryption: Потрібні cryptographic algorithms, схвалені Microsoft Security Development Lifecycle (SDL) (наприклад, rsa-sha2-256, ecdsa-sha2-nistp256).
- SFTP Configuration:
- Увімкніть SFTP на storage account.
- Для local-user access створіть local user identities з відповідними permissions.
- Для local users налаштуйте home directories, щоб визначити їхню стартову location всередині container.
- Hierarchical Namespace: HNS має бути увімкнено під час створення облікового запису storage.
- Supported Encryption: потрібні криптографічні алгоритми, схвалені Microsoft Security Development Lifecycle (SDL) (наприклад, rsa-sha2-256, ecdsa-sha2-nistp256).
- Налаштування SFTP:
- Увімкніть SFTP в обліковому записі storage.
- Для доступу локальних користувачів створіть identities локальних користувачів із відповідними дозволами.
- Для локальних користувачів налаштуйте home directories, щоб визначити їхнє початкове розташування в container.
### Permissions
### Дозволи
| 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. |
| **Read** | `r` | Читання вмісту файлів. |
| **Write** | `w` | Завантаження файлів і створення директорій. |
| **List** | `l` | Перелік вмісту директорій. |
| **Delete** | `d` | Видалення файлів або директорій. |
| **Create** | `c` | Створення файлів або директорій. |
| **Modify Ownership** | `o` | Зміна користувача або групи-власника. |
| **Modify Permissions** | `p` | Зміна ACL для файлів або директорій. |
## Enumeration
## Перелік
{{#tabs }}
{{#tab name="az cli" }}
<details>
<summary>az cli enumeration</summary>
<summary>перелік az cli</summary>
```bash
# Get storage accounts
az storage account list #Get the account name from here
@@ -442,7 +442,7 @@ New-AzStorageBlobSASToken `
{{#endtab }}
{{#endtabs }}
### File Shares
### Файлові ресурси
{{#ref}}
az-file-shares.md
@@ -466,16 +466,16 @@ az-file-shares.md
../az-persistence/az-storage-persistence.md
{{#endref}}
## References
## Посилання
- [https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction](https://learn.microsoft.com/en-us/azure/storage/blobs/storage-blobs-introduction)
- [https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview](https://learn.microsoft.com/en-us/azure/storage/common/storage-sas-overview)
- [https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support](https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support)
- [https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support-entra-id-based-access](https://learn.microsoft.com/en-us/azure/storage/blobs/secure-file-transfer-protocol-support-entra-id-based-access)
- [Holiday Hack Challenge 2025 Spare Key (Azure static website SAS leak)](https://0xdf.gitlab.io/holidayhack2025/act1/spare-key)
- [Holiday Hack Challenge 2025: Blob Storage (Storage Secrets)](https://0xdf.gitlab.io/holidayhack2025/act1/blob-storage)
- [Holiday Hack Challenge 2025 Spare Key (витік SAS для статичного вебсайту Azure)](https://0xdf.gitlab.io/holidayhack2025/act1/spare-key)
- [Holiday Hack Challenge 2025: Blob Storage (секрети Storage)](https://0xdf.gitlab.io/holidayhack2025/act1/blob-storage)
- [https://learn.microsoft.com/en-us/cli/azure/storage/account](https://learn.microsoft.com/en-us/cli/azure/storage/account)
- [https://learn.microsoft.com/en-us/cli/azure/storage/container](https://learn.microsoft.com/en-us/cli/azure/storage/container)
- [https://learn.microsoft.com/en-us/cli/azure/storage/blob](https://learn.microsoft.com/en-us/azure/storage/blob)
- [https://learn.microsoft.com/en-us/cli/azure/storage/blob](https://learn.microsoft.com/en-us/cli/azure/storage/blob)
{{#include ../../../banners/hacktricks-training.md}}