17 KiB
Az - SQL
{{#include ../../../banners/hacktricks-training.md}}
Azure SQL
Azure SQL, Azure bulutunda SQL Server veritabanı motorunu kullanan yönetilen, güvenli ve akıllı ürünler ailesidir. Bu, sunucularınızın fiziksel yönetimiyle ilgili endişelenmenize gerek olmadığı ve verilerinizi yönetmeye odaklanabileceğiniz anlamına gelir.
Azure SQL, dört ana teklifi içerir:
- Azure SQL Server: SQL Server veritabanlarının dağıtımı ve yönetimi için bir sunucu gereklidir.
- Azure SQL Database: Bu, Azure bulutunda bireysel veritabanlarını barındırmanıza olanak tanıyan tamamen yönetilen bir veritabanı hizmetidir.
- Azure SQL Managed Instance: Bu, daha büyük ölçekli, tüm SQL Server örneği kapsamındaki dağıtımlar içindir.
- Azure SQL Server on Azure VMs: Bu, işletim sistemi ve SQL Server örneği üzerinde kontrol istediğiniz mimariler için en iyisidir.
SQL Server Güvenlik Özellikleri
Ağ erişimi:
- Kamu uç noktası (belirli ağlara erişimi sınırlayabilir).
- Özel uç noktalar.
- Alan adlarına dayalı bağlantıları kısıtlamak da mümkündür.
- Azure hizmetlerinin erişimine izin vermek de mümkündür (örneğin, portalda Sorgu düzenleyicisini kullanmak veya bir Azure VM'nin bağlanmasına izin vermek).
Kimlik Doğrulama Yöntemleri:
- Microsoft Entra-only kimlik doğrulaması: Hizmete erişimi olacak Entra ilkelerini belirtmeniz gerekir.
- Hem SQL hem de Microsoft Entra kimlik doğrulaması: Kullanıcı adı ve şifre ile birlikte geleneksel SQL kimlik doğrulaması.
- Sadece SQL kimlik doğrulaması: Sadece veritabanı kullanıcıları aracılığıyla erişime izin verin.
Herhangi bir SQL kimlik doğrulamasına izin verilirse, bir yönetici kullanıcısı (kullanıcı adı + şifre) belirtilmelidir ve Entra ID kimlik doğrulaması seçilirse, en az bir yönetici erişimine sahip ilkenin de belirtilmesi gerekir.
Şifreleme:
-
"Şeffaf veri şifrelemesi" olarak adlandırılır ve veritabanlarını, yedeklemeleri ve dinlenme halindeki günlükleri şifreler.
-
Her zamanki gibi, varsayılan olarak Azure yönetilen anahtarı kullanılır, ancak bir müşteri yönetilen şifreleme anahtarı (CMEK) de kullanılabilir. Yönetilen Kimlikler:
-
Sistem ve kullanıcı yönetilen MI'ler atamak mümkündür.
-
Şifreleme anahtarına (CMEK kullanılıyorsa) ve veritabanlarından diğer hizmetlere erişmek için kullanılır.
-
Birden fazla UMI atanmışsa, kullanılacak varsayılan olanı belirtmek mümkündür.
-
Kiracılar arası erişim için bir federasyon istemci kimliği yapılandırmak mümkündür.
Microsoft Defender:
- "Olası veritabanı güvenlik açıklarını azaltmak ve anormal etkinlikleri tespit etmek" için faydalıdır.
- Defender hakkında kendi dersinde konuşacağız (birçok diğer Azure hizmetinde etkinleştirilebilir).
Yedeklemeler:
- Yedekleme sıklığı, saklama politikalarında yönetilir.
Silinmiş veritabanları:
- Mevcut yedeklerden silinmiş DB'leri geri yüklemek mümkündür.
Azure SQL Database
Azure SQL Database, ölçeklenebilir ve güvenli ilişkisel veritabanı çözümleri sunan tamamen yönetilen bir veritabanı platformu olarak hizmettir (PaaS). En son SQL Server teknolojileri üzerine inşa edilmiştir ve altyapı yönetimi gereksinimini ortadan kaldırarak bulut tabanlı uygulamalar için popüler bir seçim haline gelmiştir.
Bir SQL veritabanı oluşturmak için, barındırılacağı SQL sunucusunu belirtmek gerekir.
SQL Veritabanı Güvenlik Özellikleri
- Her Zaman Güncel: En son kararlı SQL Server sürümünde çalışır ve yeni özellikler ve yamalar otomatik olarak alır.
- Devralınan SQL Server güvenlik özellikleri:
- Kimlik doğrulama (SQL ve/veya Entra ID)
- Atanmış Yönetilen Kimlikler
- Ağ kısıtlamaları
- Şifreleme
- Yedeklemeler
- …
- Veri yedekliliği: Seçenekler yerel, bölge, Coğrafi veya Coğrafi-Bölge yedekli.
- Defter: Verilerin bütünlüğünü kriptografik olarak doğrular, herhangi bir müdahalenin tespit edilmesini sağlar. Finansal, tıbbi ve hassas verileri yöneten herhangi bir kuruluş için faydalıdır.
Bir SQL veritabanı, esnek Havuzun bir parçası olabilir. Esnek havuzlar, birden fazla veritabanını yönetmek için yapılandırılabilir hesaplama (eDTU'lar) ve depolama kaynaklarını paylaşarak maliyet etkin bir çözüm sunar; fiyatlandırma yalnızca tahsis edilen kaynaklara dayanır, veritabanı sayısına değil.
Azure SQL Sütun Seviyesi Güvenliği (Maskeleme) & Satır Seviyesi Güvenliği
Azure SQL'nin dinamik veri maskelemesi, yetkisiz kullanıcılardan hassas bilgileri gizleyerek korumaya yardımcı olan bir özelliktir. Gerçek verileri değiştirmek yerine, görüntülenen verileri dinamik olarak maskeleyerek, kredi kartı numaraları gibi hassas ayrıntıların gizli kalmasını sağlar.
Dinamik Veri Maskeleme, maskelemeyen (bu kullanıcılar belirtilmelidir) ve yöneticiler dışındaki tüm kullanıcıları etkiler. Dinamik veri maskelemeden muaf olan SQL kullanıcılarını belirten yapılandırma seçeneğine sahiptir; yöneticiler her zaman hariçtir.
Azure SQL Satır Seviyesi Güvenliği (RLS), bir kullanıcının hangi satırları görüntüleyebileceğini veya değiştirebileceğini kontrol eden bir özelliktir; her kullanıcının yalnızca kendileriyle ilgili verileri görmesini sağlar. Filtre veya engelleme yargıları ile güvenlik politikaları oluşturarak, kuruluşlar veritabanı düzeyinde ince ayar erişimi uygulayabilir.
Azure SQL Managed Instance
Azure SQL Managed Instances, daha büyük ölçekli, tüm SQL Server örneği kapsamındaki dağıtımlar içindir. En son SQL Server yerinde (Enterprise Edition) Veritabanı Motoru ile neredeyse %100 uyumluluk sağlar; bu, yaygın güvenlik endişelerini ele alan yerel bir sanal ağ (VNet) uygulaması sunar ve yerinde SQL Server müşterileri için uygun bir iş modeli sağlar.
Azure SQL Sanal Makineler
Azure SQL Sanal Makineleri, işletim sistemi ve SQL Server örneği üzerinde kontrol sağlamanıza olanak tanır; çünkü bir VM, SQL sunucusunu çalıştıran VM hizmetinde oluşturulacaktır.
Bir SQL Sanal Makinesi oluşturulduğunda, SQL sunucusunu barındıracak VM'nin tüm ayarlarını seçmek mümkündür (VM dersinde gösterildiği gibi).
- Bu, VM'nin bazı VNet'lere erişeceği, Yönetilen Kimliklerin ona eklenmiş olabileceği, dosya paylaşımlarının bağlanmış olabileceği anlamına gelir... bu da SQL'den VM'ye geçişi oldukça ilginç hale getirir.
- Ayrıca, SQL'nin belirli bir anahtar kasasına erişmesine izin vermek için bir uygulama kimliği ve sırrı yapılandırmak mümkündür; bu, hassas bilgileri içerebilir.
Ayrıca, otomatik SQL güncellemeleri, otomatik yedeklemeler, Entra ID kimlik doğrulaması ve diğer SQL hizmetlerinin çoğu gibi şeyleri yapılandırmak da mümkündür.
Enumeration
{{#tabs}} {{#tab name="az cli"}}
# List Servers
az sql server list # managed identities are enumerated here too
## List Server Usages
az sql server list-usages --name <server_name> --resource-group <resource_group>
## List Server Firewalls
az sql server firewall-rule list --resource-group <resource_group> --server <server_name>
## List of Azure Active Directory administrators in a server.
az sql server ad-admin list --resource-group <resource_group> --server <server_name>
## Gets an advanced threat protection
az sql server advanced-threat-protection-setting show --resource-group <resource_group> --name <server_name>
## Get server's auditing policy.
az sql server audit-policy show --resource-group <resource_group> --name <server_name>
## Gets a server's secure connection policy.
az sql server conn-policy show --resource-group <resource_group> --server <server_name>
## Gets a list of server DNS aliases for a server.
az sql server dns-alias list --resource-group <resource_group> --server <server_name>
## List of server keys.
az sql server key list --resource-group <resource_group> --server <server_name>
## Gets a server encryption protector.
az sql server tde-key show --resource-group <resource_group> --server <server_name>
# List Databases in a SQL server
az sql db list --server <server_name> --resource-group <resource_group> #--output table
## Get details of a specific database
az sql db show --name <database_name> --server <server_name> --resource-group <resource_group>
## List database usages
az sql db list-usages --name <database_name> --server <server_name> --resource-group <resource_group>
## List of operations performed on the database.
az sql db op list --database <database_name> --server <server_name> --resource-group <resource_group>
## List sql database classification
az sql db classification list --name <database_name> --server <server_name> --resource-group <resource_group>
## List long-term retention backups for a SQL database
az sql db ltr-backup list --database <database_name> --server <server_name> --resource-group <resource_group>
## List long-term retention policy
az sql db ltr-policy --name <database_name> --server <server_name> --resource-group <resource_group>
## List long-term retention policy
az sql db str-policy --name <database_name> --server <server_name> --resource-group <resource_group>
## List the replicas of a database and their replication status
az sql db replica list-links --name <database_name> --server <server_name> --resource-group <resource_group>
## List deleted SQL databases
az sql db list-deleted --server <server_name> --resource-group <resource_group>
## List database usages
az sql db list-usages --name <database_name> --server <server_name> --resource-group <resource_group>
## List restorable dropped databases in a SQL server
az sql db list-deleted --server <server_name> --resource-group <resource_group>
## List advanced threat protection setting show
az sql db advanced-threat-protection-setting --name <database_name> --server <server_name> --resource-group <resource_group>
# List all elastic pools in a SQL server
az sql elastic-pool list --server <server_name> --resource-group <resource_group> #--output table
## List all databases in a specific elastic pool
az sql elastic-pool show --name <elastic_pool_name> --server <server_name> --resource-group <resource_group>
## List of databases in an elastic pool.
az sql elastic-pool list-dbs --name <elastic_pool_name> --server <server_name> --resource-group <resource_group>
# List all managed Instances
az sql mi list
az sql mi show --resource-group <res-grp> --name <name>
az sql midb list
az sql midb show --resource-group <res-grp> --name <name>
# Lis all sql VM
az sql vm list
az sql vm show --resource-group <res-grp> --name <name>
# List schema by the database
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/schemas?api-version=2021-11-01"
# Get tables of a database with the schema
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/schemas/<schemaName>/tables?api-version=2021-11-01"
# Get columns of a database
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/columns?api-version=2021-11-01"
# Get columns of a table
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/schemas/<schemaName>/tables/<tableName>/columns?api-version=2021-11-01"
# Get DataMaskingPolicies of a database
az rest --method get \
--uri "https://management.azure.com/subscriptions/9291ff6e-6afb-430e-82a4-6f04b2d05c7f/resourceGroups/Resource_Group_1/providers/Microsoft.Sql/servers/getstorageserver/databases/masktest/dataMaskingPolicies/Default?api-version=2021-11-01"
az rest --method get \
--uri "https://management.azure.com/subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/dataMaskingPolicies/Default/rules?api-version=2021-11-01"
{{#endtab}}
{{#tab name="Az PowerShell"}}
# List Servers
Get-AzSqlServer -ResourceGroupName "<resource-group-name>"
# List All Databases in a SQL Server
Get-AzSqlDatabase -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# Get Details of a Specific Database
Get-AzSqlDatabase -Name "<database_name>" -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List Operations Performed on the Database
Get-AzSqlDatabaseActivity -DatabaseName "<database_name>" -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List SQL Database Classification
Get-AzSqlDatabaseSensitivityClassification -DatabaseName "<database_name>" -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List Long-Term Retention Backups for a SQL Database
Get-AzSqlDatabaseLongTermRetentionBackup -ResourceGroupName "<resource_group>" -Location "<location>"
# List Replicas of a Database and Their Replication Status
Get-AzSqlDatabaseReplicationLink -DatabaseName "<database_name>" -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List Deleted SQL Databases
Get-AzSqlDeletedDatabaseBackup -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List All Elastic Pools in a SQL Server
Get-AzSqlElasticPool -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List All Databases in a Specific Elastic Pool
Get-AzSqlElasticPoolDatabase -ElasticPoolName "<elastic_pool_name>" -ServerName "<server_name>" -ResourceGroupName "<resource_group>"
# List all managed Instances
Get-AzSqlInstance
Get-AzSqlInstance -ResourceGroupName <ResourceGroupName> -Name <ManagedInstanceName>
# List All Databases in a SQL Managed Instance
Get-AzSqlInstanceDatabase -ResourceGroupName <ResourceGroupName> -InstanceName <ManagedInstanceName>
# Lis all sql VM
Get-AzSqlVM
{{#endtab}} {{#endtabs}}
Ayrıca, veritabanındaki Dinamik Veri Maskesi ve Satır Düzeyi politikalarını listelemek istiyorsanız, sorgulayabilirsiniz:
--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;
Bağlanın ve SQL sorguları çalıştırın
Örnek bir Az WebApp'ı numaralandırma ile bir bağlantı dizesi (kimlik bilgilerini içeren) bulabilirsiniz:
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;'
Veritabanına erişmek için sqlcmd de kullanabilirsiniz. Sunucunun genel bağlantılara izin verip vermediğini bilmek önemlidir az sql server show --name <server-name> --resource-group <resource-group>, ayrıca güvenlik duvarı kuralının IP'mizin erişmesine izin verip vermediğini de kontrol etmelisiniz:
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>
Referanslar
- 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/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
Yetki Yükseltme
{{#ref}} ../az-privilege-escalation/az-sql-privesc.md {{#endref}}
Post Exploitation
{{#ref}} ../az-post-exploitation/az-sql-post-exploitation.md {{#endref}}
{{#include ../../../banners/hacktricks-training.md}}