# Az - SQL {{#include ../../../banners/hacktricks-training.md}} ## Azure SQL Azure SQL - це сімейство керованих, безпечних та інтелектуальних продуктів, які використовують **движок бази даних SQL Server в хмарі Azure**. Це означає, що вам не потрібно турбуватися про фізичне адміністрування ваших серверів, і ви можете зосередитися на управлінні вашими даними. Azure SQL складається з чотирьох основних пропозицій: 1. **Azure SQL Server**: Сервер потрібен для **розгортання та управління** базами даних SQL Server. 2. **Azure SQL Database**: Це **повністю керована служба бази даних**, яка дозволяє вам розміщувати окремі бази даних в хмарі Azure. 3. **Azure SQL Managed Instance**: Це для масштабних, повних розгортань SQL Server. 4. **Azure SQL Server на Azure VMs**: Це найкраще для архітектур, де ви хочете **контроль над операційною системою** та екземпляром SQL Server. ### SQL Server Security Features **Доступ до мережі:** - Публічний кінцевий пункт (можна обмежити доступ до конкретних мереж). - Приватні кінцеві пункти. - Також можливо обмежити з'єднання на основі доменних імен. - Також можливо дозволити службам Azure отримувати доступ (наприклад, для використання редактора запитів у порталі або для дозволу підключення Azure VM). **Методи аутентифікації:** - Аутентифікація **тільки для Microsoft Entra**: Вам потрібно вказати принципи Entra, які матимуть доступ до служби. - **Аутентифікація як SQL, так і Microsoft Entra**: Традиційна SQL аутентифікація з ім'ям користувача та паролем разом з Microsoft Entra. - **Тільки SQL** аутентифікація: Дозволяє доступ лише через користувачів бази даних. Зверніть увагу, що якщо дозволена будь-яка SQL аутентифікація, потрібно вказати адміністративного користувача (ім'я користувача + пароль), а якщо вибрана аутентифікація Entra ID, також потрібно вказати принаймні одного принципа з адміністративним доступом. **Шифрування:** - Це називається "Прозоре шифрування даних" і шифрує бази даних, резервні копії та журнали в спокої. - Як завжди, за замовчуванням використовується керований ключ Azure, але також може бути використаний ключ шифрування, керований клієнтом (CMEK). **Керовані ідентичності:** - Можливо призначити системні та користувацькі керовані MI. - Використовується для доступу до ключа шифрування (якщо використовується CMEK) та інших служб з бази даних. - Для деяких прикладів служб Azure, до яких можна отримати доступ з бази даних, перегляньте [цю сторінку документації](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql) - Якщо призначено більше ніж одну UMI, можливо вказати за замовчуванням ту, що потрібно використовувати. - Можливо налаштувати федеративну клієнтську ідентичність для доступу між орендарями. Деякі команди для доступу до інформації всередині блоб-сховища з бази даних SQL: ```sql -- Create a credential for the managed identity CREATE DATABASE SCOPED CREDENTIAL [ManagedIdentityCredential] WITH IDENTITY = 'Managed Identity'; GO -- Create an external data source pointing to the blob storage to access CREATE EXTERNAL DATA SOURCE ManagedIdentity WITH ( TYPE = BLOB_STORAGE, LOCATION = 'https://testsqlidentity.blob.core.windows.net/sqlcontainer', CREDENTIAL = ManagedIdentityCredential ); GO -- Read a file from ths storage and return it SELECT * FROM OPENROWSET( BULK 'message.txt', DATA_SOURCE = 'ManagedIdentity', SINGLE_CLOB ) AS DataFile; GO ``` **Microsoft Defender:** - Корисний для “зменшення потенційних вразливостей бази даних та виявлення аномальних активностей” - Ми поговоримо про Defender в окремому уроці (його можна активувати в кількох інших службах Azure) **Резервні копії:** - Частота резервного копіювання керується політиками зберігання. **Видалені бази даних:** - Можливо відновити БД, які були видалені з існуючих резервних копій. ## Azure SQL Database **Azure SQL Database** є **повністю керованою платформою бази даних як послуга (PaaS)**, яка надає масштабовані та безпечні рішення реляційних баз даних. Вона побудована на останніх технологіях SQL Server і усуває потребу в управлінні інфраструктурою, що робить її популярним вибором для хмарних додатків. Щоб створити SQL базу даних, потрібно вказати SQL сервер, на якому вона буде розміщена. ### Функції безпеки SQL бази даних - **Завжди актуальна**: Працює на останній стабільній версії SQL Server і автоматично отримує нові функції та патчі. - **Спадкові функції безпеки SQL Server:** - Аутентифікація (SQL та/або Entra ID) - Призначені керовані ідентичності - Обмеження мережі - Шифрування - Резервні копії - … - **Резервування даних:** Варіанти - локальне, зональне, гео або гео-зональне резервування. - **Леджер:** Він криптографічно перевіряє цілісність даних, забезпечуючи виявлення будь-якого підроблення. Корисно для фінансових, медичних та будь-яких організацій, що управляють чутливими даними. SQL база даних може бути частиною **еластичного пулу**. Еластичні пулу є економічно вигідним рішенням для управління кількома базами даних шляхом спільного використання налаштовуваних обчислювальних (eDTUs) та сховищ ресурсів між ними, з ціноутворенням, що базується виключно на виділених ресурсах, а не на кількості баз даних. #### Azure SQL Безпека на рівні стовпців (Маскування) та Безпека на рівні рядків **Динамічне** маскування даних Azure SQL є функцією, яка допомагає **захистити чутливу інформацію, приховуючи її** від несанкціонованих користувачів. Замість того, щоб змінювати фактичні дані, вона динамічно маскує відображувані дані, забезпечуючи, щоб чутливі деталі, такі як номери кредитних карток, були приховані. **Динамічне маскування даних** впливає на всіх користувачів, крім тих, хто не підлягає маскуванню (ціх користувачів потрібно вказати) та адміністраторів. Є опція конфігурації, яка вказує, які SQL користувачі звільнені від динамічного маскування даних, при цьому **адміністратори завжди виключені**. **Безпека на рівні рядків Azure SQL (RLS)** є функцією, яка **контролює, які рядки користувач може переглядати або змінювати**, забезпечуючи, щоб кожен користувач бачив лише дані, що стосуються його. Створюючи політики безпеки з предикатами фільтрації або блокування, організації можуть забезпечити детальний доступ на рівні бази даних. ### Azure SQL Керовані екземпляри **Azure SQL Керовані екземпляри** призначені для масштабних, повних розгортань SQL Server. Вони забезпечують майже 100% сумісність з останнім SQL Server на місцях (Enterprise Edition) Database Engine, який надає рідну реалізацію віртуальної мережі (VNet), що вирішує поширені проблеми безпеки, та бізнес-модель, вигідну для клієнтів SQL Server на місцях. ### Azure SQL Віртуальні машини **Azure SQL Віртуальні машини** дозволяють **контролювати операційну систему** та екземпляр SQL Server, оскільки ВМ буде запущена в службі ВМ, що працює на SQL сервері. Коли створюється SQL Віртуальна машина, можливо **вибрати всі налаштування ВМ** (як показано в уроці ВМ), які будуть хостити SQL сервер. - Це означає, що ВМ буде отримувати доступ до деяких VNet(ів), може мати **прикріплені керовані ідентичності**, може мати змонтовані файлові спільноти… що робить **поворот з SQL** на ВМ дуже цікавим. - Більше того, можливо налаштувати ідентифікатор програми та секрет для **дозволу SQL доступу до конкретного сховища ключів**, яке може містити чутливу інформацію. Також можливо налаштувати такі речі, як **автоматичні оновлення SQL**, **автоматичні резервні копії**, **аутентифікацію Entra ID** та більшість функцій інших служб SQL. ## Перерахування {{#tabs}} {{#tab name="az cli"}} ```bash # List Servers az sql server list # managed identities are enumerated here too ## List Server Usages az sql server list-usages --name --resource-group ## List Server Firewalls az sql server firewall-rule list --resource-group --server ## List of Azure Active Directory administrators in a server. az sql server ad-admin list --resource-group --server ## Gets an advanced threat protection az sql server advanced-threat-protection-setting show --resource-group --name ## Get server's auditing policy. az sql server audit-policy show --resource-group --name ## Gets a server's secure connection policy. az sql server conn-policy show --resource-group --server ## Gets a list of server DNS aliases for a server. az sql server dns-alias list --resource-group --server ## List of server keys. az sql server key list --resource-group --server ## Gets a server encryption protector. az sql server tde-key show --resource-group --server # List Databases in a SQL server az sql db list --server --resource-group #--output table ## Get details of a specific database az sql db show --name --server --resource-group ## List database usages az sql db list-usages --name --server --resource-group ## List of operations performed on the database. az sql db op list --database --server --resource-group ## List sql database classification az sql db classification list --name --server --resource-group ## List long-term retention backups for a SQL database az sql db ltr-backup list --database --server --resource-group ## List long-term retention policy az sql db ltr-policy --name --server --resource-group ## List long-term retention policy az sql db str-policy --name --server --resource-group ## List the replicas of a database and their replication status az sql db replica list-links --name --server --resource-group ## List deleted SQL databases az sql db list-deleted --server --resource-group ## List database usages az sql db list-usages --name --server --resource-group ## List restorable dropped databases in a SQL server az sql db list-deleted --server --resource-group ## List advanced threat protection setting show az sql db advanced-threat-protection-setting --name --server --resource-group # List all elastic pools in a SQL server az sql elastic-pool list --server --resource-group #--output table ## List all databases in a specific elastic pool az sql elastic-pool show --name --server --resource-group ## List of databases in an elastic pool. az sql elastic-pool list-dbs --name --server --resource-group # List all managed Instances az sql mi list az sql mi show --resource-group --name az sql midb list az sql midb show --resource-group --name # Lis all sql VM az sql vm list az sql vm show --resource-group --name # List schema by the database az rest --method get \ --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Sql/servers//databases//schemas?api-version=2021-11-01" # Get tables of a database with the schema az rest --method get \ --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Sql/servers//databases//schemas//tables?api-version=2021-11-01" # Get columns of a database az rest --method get \ --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Sql/servers//databases//columns?api-version=2021-11-01" # Get columns of a table az rest --method get \ --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Sql/servers//databases//schemas//tables//columns?api-version=2021-11-01" # Get DataMaskingPolicies of a database az rest --method get \ --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Sql/servers//databases//dataMaskingPolicies/Default?api-version=2021-11-01" az rest --method get \ --uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.Sql/servers//databases//dataMaskingPolicies/Default/rules?api-version=2021-11-01" ``` {{#endtab}} {{#tab name="Az PowerShell"}} ```bash # List Servers Get-AzSqlServer -ResourceGroupName "" # List All Databases in a SQL Server Get-AzSqlDatabase -ServerName "" -ResourceGroupName "" # Get Details of a Specific Database Get-AzSqlDatabase -Name "" -ServerName "" -ResourceGroupName "" # List Operations Performed on the Database Get-AzSqlDatabaseActivity -DatabaseName "" -ServerName "" -ResourceGroupName "" # List SQL Database Classification Get-AzSqlDatabaseSensitivityClassification -DatabaseName "" -ServerName "" -ResourceGroupName "" # List Long-Term Retention Backups for a SQL Database Get-AzSqlDatabaseLongTermRetentionBackup -ResourceGroupName "" -Location "" # List Replicas of a Database and Their Replication Status Get-AzSqlDatabaseReplicationLink -DatabaseName "" -ServerName "" -ResourceGroupName "" # List Deleted SQL Databases Get-AzSqlDeletedDatabaseBackup -ServerName "" -ResourceGroupName "" # List All Elastic Pools in a SQL Server Get-AzSqlElasticPool -ServerName "" -ResourceGroupName "" # List All Databases in a Specific Elastic Pool Get-AzSqlElasticPoolDatabase -ElasticPoolName "" -ServerName "" -ResourceGroupName "" # List all managed Instances Get-AzSqlInstance Get-AzSqlInstance -ResourceGroupName -Name # List All Databases in a SQL Managed Instance Get-AzSqlInstanceDatabase -ResourceGroupName -InstanceName # Lis all sql VM Get-AzSqlVM ``` {{#endtab}} {{#endtabs}} Додатково, якщо ви хочете перерахувати Dynamic Data Masking та Row Level policies у базі даних, ви можете виконати запит: ```sql --Enumerates the masked columns SELECT OBJECT_NAME(mc.object_id) AS TableName, c.name AS ColumnName, mc.masking_function AS MaskingFunction FROM sys.masked_columns AS mc JOIN sys.columns AS c ON mc.object_id = c.object_id AND mc.column_id = c.column_id --Enumerates Row level policies SELECT sp.name AS PolicyName, sp.is_enabled, sp.create_date, sp.modify_date, OBJECT_NAME(sp.object_id) AS TableName, sp2.predicate_definition AS PredicateDefinition FROM sys.security_policies AS sp JOIN sys.security_predicates AS sp2 ON sp.object_id = sp2.object_id; ``` ### Підключення та виконання SQL запитів Ви можете знайти рядок підключення (що містить облікові дані) з прикладу [перерахування Az WebApp](az-app-services.md): ```bash function invoke-sql{ param($query) $Connection_string = "Server=tcp:supercorp.database.windows.net,1433;Initial Catalog=flag;Persist Security Info=False;User ID=db_read;Password=gAegH!324fAG!#1fht;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" $Connection = New-Object System.Data.SqlClient.SqlConnection $Connection_string $Connection.Open() $Command = New-Object System.Data.SqlClient.SqlCommand $Command.Connection = $Connection $Command.CommandText = $query $Reader = $Command.ExecuteReader() while ($Reader.Read()) { $Reader.GetValue(0) } $Connection.Close() } invoke-sql 'Select Distinct TABLE_NAME From information_schema.TABLES;' ``` Ви також можете використовувати sqlcmd для доступу до бази даних. Важливо знати, чи дозволяє сервер публічні з'єднання `az sql server show --name --resource-group `, а також чи дозволяє правило брандмауера нашій IP-адресі доступ: ```bash sqlcmd -S .database.windows.net -U -P -d ``` ## 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 {{#endref}} ## Постексплуатація {{#ref}} ../az-post-exploitation/az-sql-post-exploitation.md {{#endref}} ### Постійність {{#ref}} ../az-persistence/az-sql-persistence.md {{#endref}} {{#include ../../../banners/hacktricks-training.md}}