Files
hacktricks-cloud/src/pentesting-cloud/azure-security/az-services/az-sql.md

24 KiB
Raw Blame History

Az - SQL

{{#include ../../../banners/hacktricks-training.md}}

Azure SQL

Το Azure SQL είναι μια οικογένεια διαχειριζόμενων, ασφαλών και έξυπνων προϊόντων που χρησιμοποιούν την μηχανή βάσης δεδομένων SQL Server στο Azure cloud. Αυτό σημαίνει ότι δεν χρειάζεται να ανησυχείτε για τη φυσική διαχείριση των διακομιστών σας και μπορείτε να επικεντρωθείτε στη διαχείριση των δεδομένων σας.

Το Azure SQL αποτελείται από τέσσερις κύριες προσφορές:

  1. Azure SQL Server: Ένας διακομιστής είναι απαραίτητος για την ανάπτυξη και διαχείριση βάσεων δεδομένων SQL Server.
  2. Azure SQL Database: Αυτή είναι μια πλήρως διαχειριζόμενη υπηρεσία βάσης δεδομένων, που σας επιτρέπει να φιλοξενείτε μεμονωμένες βάσεις δεδομένων στο Azure cloud.
  3. Azure SQL Managed Instance: Αυτό είναι για μεγαλύτερης κλίμακας, πλήρεις αναπτύξεις SQL Server.
  4. Azure SQL Server σε Azure VMs: Αυτό είναι καλύτερο για αρχιτεκτονικές όπου θέλετε έλεγχο του λειτουργικού συστήματος και της παρουσίας SQL Server.

Χαρακτηριστικά Ασφαλείας SQL Server

Πρόσβαση δικτύου:

  • Δημόσιο σημείο πρόσβασης (μπορεί να περιορίσει την πρόσβαση σε συγκεκριμένα δίκτυα).
  • Ιδιωτικά σημεία πρόσβασης.
  • Είναι επίσης δυνατό να περιορίσετε τις συνδέσεις με βάση τα ονόματα τομέα.
  • Είναι επίσης δυνατό να επιτρέψετε στις υπηρεσίες Azure να έχουν πρόσβαση (όπως για να χρησιμοποιήσετε τον επεξεργαστή ερωτημάτων στην πύλη ή να επιτρέψετε σε μια Azure VM να συνδεθεί).

Μέθοδοι Αυθεντικοποίησης:

  • Αυθεντικοποίηση μόνο Entra της Microsoft: Πρέπει να υποδείξετε τους Entra principals που θα έχουν πρόσβαση στην υπηρεσία.
  • Και οι δύο SQL και Microsoft Entra αυθεντικοποίηση: Παραδοσιακή αυθεντικοποίηση SQL με όνομα χρήστη και κωδικό πρόσβασης μαζί με Microsoft Entra.
  • Μόνο SQL αυθεντικοποίηση: Επιτρέπεται μόνο η πρόσβαση μέσω χρηστών βάσης δεδομένων.

Σημειώστε ότι αν επιτρέπεται οποιαδήποτε αυθεντικοποίηση SQL, πρέπει να υποδειχθεί ένας χρήστης διαχειριστή (όνομα χρήστη + κωδικός πρόσβασης) και αν επιλεγεί η αυθεντικοποίηση Entra ID, είναι επίσης απαραίτητο να υποδειχθεί τουλάχιστον ένας principal με πρόσβαση διαχειριστή.

Κρυπτογράφηση:

  • Ονομάζεται “Διαφανής κρυπτογράφηση δεδομένων” και κρυπτογραφεί βάσεις δεδομένων, αντίγραφα ασφαλείας και αρχεία καταγραφής σε κατάσταση ηρεμίας.

  • Όπως πάντα, χρησιμοποιείται από προεπιλογή ένα διαχειριζόμενο κλειδί Azure, αλλά μπορεί επίσης να χρησιμοποιηθεί ένα κλειδί κρυπτογράφησης που διαχειρίζεται ο πελάτης (CMEK). Διαχειριζόμενες Ταυτότητες:

  • Είναι δυνατό να ανατεθούν συστήματα και διαχειριζόμενες ταυτότητες χρηστών.

  • Χρησιμοποιούνται για την πρόσβαση στο κλειδί κρυπτογράφησης (αν χρησιμοποιείται CMEK) και σε άλλες υπηρεσίες από τις βάσεις δεδομένων.

  • Εάν ανατεθούν περισσότερες από μία UMI, είναι δυνατό να υποδειχθεί η προεπιλεγμένη που θα χρησιμοποιηθεί.

  • Είναι δυνατό να ρυθμιστεί μια ομοσπονδία ταυτότητας πελάτη για διασυνοριακή πρόσβαση.

Microsoft Defender:

  • Χρήσιμο για “μείωση πιθανών ευπαθειών βάσης δεδομένων και ανίχνευση ανωμαλιών”
  • Θα μιλήσουμε για τον Defender σε δικό του μάθημα (μπορεί να ενεργοποιηθεί σε πολλές άλλες υπηρεσίες Azure)

Αντίγραφα ασφαλείας:

  • Η συχνότητα των αντιγράφων ασφαλείας διαχειρίζεται στις πολιτικές διατήρησης.

Διαγραμμένες βάσεις δεδομένων:

  • Είναι δυνατό να αποκατασταθούν οι βάσεις δεδομένων που έχουν διαγραφεί από υπάρχοντα αντίγραφα ασφαλείας.

Azure SQL Database

Azure SQL Database είναι μια πλήρως διαχειριζόμενη πλατφόρμα βάσης δεδομένων ως υπηρεσία (PaaS) που παρέχει κλιμακούμενες και ασφαλείς λύσεις σχεσιακής βάσης δεδομένων. Είναι χτισμένη στις τελευταίες τεχνολογίες SQL Server και εξαλείφει την ανάγκη για διαχείριση υποδομών, καθιστώντας την δημοφιλή επιλογή για εφαρμογές που βασίζονται στο cloud.

Για να δημιουργήσετε μια βάση δεδομένων SQL, είναι απαραίτητο να υποδείξετε τον διακομιστή SQL όπου θα φιλοξενηθεί.

Χαρακτηριστικά Ασφαλείας Βάσης Δεδομένων SQL

  • Πάντα Ενημερωμένο: Λειτουργεί στην τελευταία σταθερή έκδοση του SQL Server και λαμβάνει αυτόματα νέες δυνατότητες και διορθώσεις.
  • Κληρονομημένα χαρακτηριστικά ασφαλείας SQL Server:
  • Αυθεντικοποίηση (SQL και/ή Entra ID)
  • Ανατεθειμένες Διαχειριζόμενες Ταυτότητες
  • Περιορισμοί δικτύου
  • Κρυπτογράφηση
  • Αντίγραφα ασφαλείας
  • Πλεονασμός δεδομένων: Οι επιλογές είναι τοπικές, ζώνης, γεωγραφικές ή γεωγραφικές-ζώνες.
  • Λογιστικό βιβλίο: Επαληθεύει κρυπτογραφικά την ακεραιότητα των δεδομένων, διασφαλίζοντας ότι οποιαδήποτε αλλοίωση ανιχνεύεται. Χρήσιμο για χρηματοοικονομικές, ιατρικές και οποιαδήποτε οργάνωση που διαχειρίζεται ευαίσθητα δεδομένα.

Μια βάση δεδομένων SQL θα μπορούσε να είναι μέρος ενός ελαστικού Pool. Οι ελαστικοί pools είναι μια οικονομικά αποδοτική λύση για τη διαχείριση πολλαπλών βάσεων δεδομένων μοιράζοντας ρυθμιζόμενους υπολογιστικούς πόρους (eDTUs) και αποθηκευτικούς πόρους μεταξύ τους, με τιμολόγηση που βασίζεται αποκλειστικά στους πόρους που έχουν ανατεθεί και όχι στον αριθμό των βάσεων δεδομένων.

Azure SQL Ασφάλεια Επιπέδου Στήλης (Μάσκα) & Ασφάλεια Επιπέδου Γραμμής

Η δυναμική μάσκα δεδομένων του Azure SQL είναι μια δυνατότητα που βοηθά στην προστασία ευαίσθητων πληροφοριών κρύβοντάς τις από μη εξουσιοδοτημένους χρήστες. Αντί να τροποποιεί τα πραγματικά δεδομένα, μάσκαρε δυναμικά τα εμφανιζόμενα δεδομένα, διασφαλίζοντας ότι ευαίσθητες λεπτομέρειες όπως οι αριθμοί πιστωτικών καρτών είναι κρυμμένες.

Η Δυναμική Μάσκα Δεδομένων επηρεάζει όλους τους χρήστες εκτός από αυτούς που είναι μη μάσκες (αυτοί οι χρήστες πρέπει να υποδειχθούν) και τους διαχειριστές. Έχει την επιλογή ρύθμισης που καθορίζει ποιοι χρήστες SQL εξαιρούνται από τη δυναμική μάσκα δεδομένων, με τους διαχειριστές πάντα εξαιρούμενους.

Η Ασφάλεια Επιπέδου Γραμμής (RLS) του Azure SQL είναι μια δυνατότητα που ελέγχει ποιες γραμμές μπορεί να δει ή να τροποποιήσει ένας χρήστης, διασφαλίζοντας ότι κάθε χρήστης βλέπει μόνο τα δεδομένα που τον αφορούν. Δημιουργώντας πολιτικές ασφαλείας με φίλτρα ή μπλοκαρίσματα, οι οργανισμοί μπορούν να επιβάλουν λεπτομερή πρόσβαση σε επίπεδο βάσης δεδομένων.

Azure SQL Managed Instance

Οι Azure SQL Managed Instances είναι για μεγαλύτερης κλίμακας, πλήρεις αναπτύξεις SQL Server. Παρέχουν σχεδόν 100% συμβατότητα με την τελευταία έκδοση SQL Server on-premises (Enterprise Edition) Database Engine, που παρέχει μια εγγενή υλοποίηση εικονικού δικτύου (VNet) που αντιμετωπίζει κοινές ανησυχίες ασφαλείας και ένα επιχειρηματικό μοντέλο ευνοϊκό για τους πελάτες SQL Server on-premises.

Azure SQL Virtual Machines

Οι Azure SQL Virtual Machines επιτρέπουν τον έλεγχο του λειτουργικού συστήματος και της παρουσίας SQL Server, καθώς μια VM θα δημιουργηθεί στην υπηρεσία VM που εκτελεί τον SQL Server.

Όταν δημιουργείται μια SQL Virtual Machine, είναι δυνατό να επιλεγούν όλες οι ρυθμίσεις της VM (όπως φαίνεται στο μάθημα VM) που θα φιλοξενούν τον SQL Server.

  • Αυτό σημαίνει ότι η VM θα έχει πρόσβαση σε κάποια VNet(s), μπορεί να έχει συνδεδεμένες Διαχειριζόμενες Ταυτότητες, θα μπορούσε να έχει κοινές χρήσεις αρχείων… καθιστώντας την pivoting από τον SQL στη VM πολύ ενδιαφέρουσα.
  • Επιπλέον, είναι δυνατό να ρυθμιστεί ένα app id και μυστικό για να επιτρέψει στον SQL να έχει πρόσβαση σε ένα συγκεκριμένο key vault, το οποίο θα μπορούσε να περιέχει ευαίσθητες πληροφορίες.

Είναι επίσης δυνατό να ρυθμιστούν πράγματα όπως αυτόματες ενημερώσεις SQL, αυτόματα αντίγραφα ασφαλείας, αυθεντικοποίηση Entra ID και οι περισσότερες δυνατότητες των άλλων υπηρεσιών SQL.

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}}

Επιπλέον, αν θέλετε να απαριθμήσετε την Dynamic Data Masking και τις Row Level πολιτικές, μέσα στη βάση δεδομένων, μπορείτε να κάνετε ερώτηση:

--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

Μπορείτε να βρείτε μια συμβολοσειρά σύνδεσης (που περιέχει διαπιστευτήρια) από το παράδειγμα enumerating an Az WebApp:

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 <server-name> --resource-group <resource-group>, και επίσης αν ο κανόνας του τείχους προστασίας επιτρέπει στη διεύθυνση IP μας να αποκτήσει πρόσβαση:

sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>

Αναφορές

Ανύψωση Δικαιωμάτων

{{#ref}} ../az-privilege-escalation/az-sql-privesc.md {{#endref}}

Μετά την Εκμετάλλευση

{{#ref}} ../az-post-exploitation/az-sql-post-exploitation.md {{#endref}}

Επιμονή

{{#ref}} ../az-persistence/az-sql-persistance.md {{#endref}}

{{#include ../../../banners/hacktricks-training.md}}