# Az - SQL

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

## Azure SQL

Azure SQL est une famille de produits gérés, sécurisés et intelligents qui utilisent le **moteur de base de données SQL Server dans le cloud Azure**. Cela signifie que vous n'avez pas à vous soucier de l'administration physique de vos serveurs, et vous pouvez vous concentrer sur la gestion de vos données.

Azure SQL se compose de trois principales offres :

1. **Azure SQL Database** : Il s'agit d'un **service de base de données entièrement géré**, qui vous permet d'héberger des bases de données individuelles dans le cloud Azure. Il offre une intelligence intégrée qui apprend vos modèles de base de données uniques et fournit des recommandations personnalisées et un réglage automatique.
2. **Azure SQL Managed Instance** : Cela concerne les déploiements à grande échelle, à l'échelle de l'ensemble de l'instance SQL Server. Il offre une compatibilité presque totale avec le dernier moteur de base de données SQL Server sur site (Édition Entreprise), qui fournit une mise en réseau virtuelle (VNet) native répondant aux préoccupations de sécurité courantes, et un modèle commercial favorable aux clients SQL Server sur site.
3. **Azure SQL Server sur des machines virtuelles Azure** : Il s'agit d'une Infrastructure en tant que Service (IaaS) et est préférable pour les migrations où vous souhaitez **contrôler le système d'exploitation et l'instance SQL Server**, comme si c'était un serveur fonctionnant sur site.

### Azure SQL Database

**Azure SQL Database** est une **plateforme de base de données entièrement gérée en tant que service (PaaS)** qui fournit des solutions de bases de données relationnelles évolutives et sécurisées. Elle est construite sur les dernières technologies SQL Server et élimine le besoin de gestion d'infrastructure, ce qui en fait un choix populaire pour les applications basées sur le cloud.

#### Caractéristiques clés

- **Toujours à jour** : Fonctionne sur la dernière version stable de SQL Server et reçoit automatiquement de nouvelles fonctionnalités et correctifs.
- **Capacités PaaS** : Haute disponibilité intégrée, sauvegardes et mises à jour.
- **Flexibilité des données** : Prend en charge les données relationnelles et non relationnelles (par exemple, graphiques, JSON, spatial et XML).

#### Modèles d'achat / Niveaux de service

- **Basé sur vCore** : Choisissez le calcul, la mémoire et le stockage indépendamment. Pour usage général, critique pour les entreprises (avec haute résilience et performance pour les applications OLTP), et évolue jusqu'à 128 To de stockage.
- **Basé sur DTU** : Regroupe le calcul, la mémoire et l'I/O en niveaux fixes. Ressources équilibrées pour les tâches courantes.
- Standard : Ressources équilibrées pour les tâches courantes.
- Premium : Haute performance pour des charges de travail exigeantes.

#### Modèles de déploiement

Azure SQL Database prend en charge des options de déploiement flexibles pour répondre à divers besoins :

- **Base de données unique** :
- Une base de données entièrement isolée avec ses propres ressources dédiées.
- Idéal pour les microservices ou les applications nécessitant une source de données unique.
- **Pool élastique** :
- Permet à plusieurs bases de données de partager des ressources au sein d'un pool.
- Économique pour les applications avec des modèles d'utilisation fluctuants à travers plusieurs bases de données.

#### Performance évolutive et pools

- **Bases de données uniques** : Chaque base de données est isolée et dispose de ses propres ressources de calcul, de mémoire et de stockage dédiées. Les ressources peuvent être évoluées dynamiquement (vers le haut ou vers le bas) sans temps d'arrêt (1 à 128 vCores, 32 Go à 4 To de stockage, et jusqu'à 128 To).
- **Pools élastiques** : Partagent des ressources entre plusieurs bases de données dans un pool pour maximiser l'efficacité et réduire les coûts. Les ressources peuvent également être évoluées dynamiquement pour l'ensemble du pool.
- **Flexibilité des niveaux de service** : Commencez petit avec une base de données unique dans le niveau usage général. Passez aux niveaux critique pour les entreprises ou hyperscale à mesure que les besoins augmentent.
- **Options d'évolutivité** : Évolutivité dynamique ou alternatives d'autoscaling.

#### Surveillance et optimisation intégrées

- **Query Store** : Suit les problèmes de performance, identifie les principaux consommateurs de ressources et offre des recommandations exploitables.
- **Réglage automatique** : Optimise proactivement la performance avec des fonctionnalités telles que l'indexation automatique et les corrections de plans de requêtes.
- **Intégration de télémétrie** : Prend en charge la surveillance via Azure Monitor, Event Hubs ou Azure Storage pour des insights personnalisés.

#### Récupération après sinistre et disponibilité

- **Sauvegardes automatiques** : SQL Database effectue automatiquement des sauvegardes complètes, différentielles et de journaux de transactions des bases de données.
- **Restauration à un instant donné** : Récupérez les bases de données à tout état passé dans la période de rétention des sauvegardes.
- **Géo-redondance**
- **Groupes de basculement** : Simplifie la récupération après sinistre en regroupant les bases de données pour un basculement automatique entre les régions.

### Azure SQL Managed Instance

**Azure SQL Managed Instance** est un moteur de base de données en tant que service (PaaS) qui offre une compatibilité presque totale avec SQL Server et gère automatiquement la plupart des tâches de gestion (par exemple, mise à niveau, correctifs, sauvegardes, surveillance). Il fournit une solution cloud pour migrer les bases de données SQL Server sur site avec des modifications minimales.

#### Niveaux de service

- **Usage général** : Option économique pour les applications avec des exigences standard en matière d'I/O et de latence.
- **Critique pour les entreprises** : Option haute performance avec une faible latence I/O pour des charges de travail critiques.

#### Fonctionnalités de sécurité avancées

* **Protection contre les menaces** : Alertes de protection avancée contre les menaces pour les activités suspectes et les attaques par injection SQL. Audit pour suivre et enregistrer les événements de base de données pour la conformité.
* **Contrôle d'accès** : Authentification Microsoft Entra pour une gestion centralisée des identités. Sécurité au niveau des lignes et masquage dynamique des données pour un contrôle d'accès granulaire.
* **Sauvegardes** : Sauvegardes automatisées et manuelles avec capacité de restauration à un instant donné.

### Azure SQL Virtual Machines

**Azure SQL Virtual Machines** est préférable pour les migrations où vous souhaitez **contrôler le système d'exploitation et l'instance SQL Server**, comme si c'était un serveur fonctionnant sur site. Il peut avoir différentes tailles de machines et une large sélection de versions et d'éditions de SQL Server.

#### Caractéristiques clés

**Sauvegarde automatisée** : Planifiez des sauvegardes pour les bases de données SQL.  
**Mise à jour automatique** : Automatise l'installation des mises à jour de Windows et de SQL Server pendant une fenêtre de maintenance.  
**Intégration de Azure Key Vault** : Configure automatiquement Key Vault pour les machines virtuelles SQL Server.  
**Intégration de Defender for Cloud** : Consultez les recommandations de Defender for SQL dans le portail.  
**Flexibilité de version/édition** : Changez les métadonnées de version ou d'édition de SQL Server sans redéployer la machine virtuelle.

#### Fonctionnalités de sécurité

**Microsoft Defender for SQL** : Insights et alertes de sécurité.  
**Intégration de Azure Key Vault** : Stockage sécurisé des identifiants et des clés de chiffrement.  
**Microsoft Entra (Azure AD)** : Authentification et contrôle d'accès.

## Énumération

{{#tabs}}
{{#tab name="az cli"}}
```bash
# List Servers
az sql server list # --output table
## 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>
```
{{#endtab}}

{{#tab name="Az PowerShell"}}
```bash
# 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}}

### Connecter et exécuter des requêtes SQL

Vous pourriez trouver une chaîne de connexion (contenant des identifiants) dans l'exemple [énumérer un 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;'
```
Vous pouvez également utiliser sqlcmd pour accéder à la base de données. Il est important de savoir si le serveur autorise les connexions publiques `az sql server show --name <server-name> --resource-group <resource-group>`, et aussi si la règle de pare-feu permet à notre IP d'accéder :
```bash
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>
```
## Références

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

## Escalade de privilèges

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