# Az - SQL

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

## Azure SQL

Azure SQLは、**Azureクラウド内のSQL Serverデータベースエンジン**を使用する管理された、安全で、インテリジェントな製品のファミリーです。これにより、サーバーの物理的な管理を心配する必要がなく、データの管理に集中できます。

Azure SQLは、4つの主要な提供物で構成されています：

1. **Azure SQL Server**: SQL Serverデータベースの**デプロイと管理**に必要なサーバーです。
2. **Azure SQL Database**: これは**完全管理型データベースサービス**で、Azureクラウド内に個別のデータベースをホストできます。
3. **Azure SQL Managed Instance**: これは、より大規模な、全体のSQL Serverインスタンススコープのデプロイメント用です。
4. **Azure SQL Server on Azure VMs**: これは、**オペレーティングシステム**とSQL Serverインスタンスに対する**制御**を望むアーキテクチャに最適です。

### SQL Server Security Features

**ネットワークアクセス:**

- 公開エンドポイント（特定のネットワークへのアクセスを制限できます）。
- プライベートエンドポイント。
- ドメイン名に基づいて接続を制限することも可能です。
- Azureサービスがアクセスできるようにすることも可能です（ポータル内のクエリエディタを使用するためや、Azure VMが接続できるようにするため）。

**認証方法:**

- Microsoft **Entra-only** 認証: サービスにアクセスするEntraプリンシパルを指定する必要があります。
- **SQLとMicrosoft Entra**の両方の認証: ユーザー名とパスワードを使用した従来のSQL認証とMicrosoft Entraの併用。
- **SQLのみ**の認証: データベースユーザーを介してのみアクセスを許可します。

SQL認証が許可されている場合、管理者ユーザー（ユーザー名 + パスワード）を指定する必要があり、Entra ID認証が選択されている場合は、管理アクセスを持つ少なくとも1つのプリンシパルを指定する必要があります。

**暗号化:**

- 「透過的データ暗号化」と呼ばれ、データベース、バックアップ、およびログを静止状態で暗号化します。
- 常に、デフォルトでAzure管理キーが使用されますが、顧客管理暗号化キー（CMEK）も使用できます。
**管理されたID:**

- システムおよびユーザー管理のMIを割り当てることが可能です。
- 暗号化キー（CMEKが使用されている場合）やデータベースからの他のサービスにアクセスするために使用されます。
- データベースからアクセスできるAzureサービスのいくつかの例については、[このドキュメントのページ](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql)を確認してください。
- 1つ以上のUMIが割り当てられている場合、使用するデフォルトのUMIを指定することが可能です。
- クロステナントアクセスのために、フェデレーテッドクライアントIDを構成することが可能です。

SQLデータベースからBlobストレージ内の情報にアクセスするためのいくつかのコマンド：
```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サービスで有効にできます）。

**バックアップ:**
- バックアップの頻度は保持ポリシーで管理されます。

**削除されたデータベース:**
- 既存のバックアップから削除されたDBを復元することが可能です。

## Azure SQL Database

**Azure SQL Database**は、**完全に管理されたデータベースプラットフォームとしてのサービス (PaaS)** であり、スケーラブルで安全なリレーショナルデータベースソリューションを提供します。最新のSQL Server技術に基づいて構築されており、インフラ管理の必要がなく、クラウドベースのアプリケーションに人気の選択肢となっています。

SQLデータベースを作成するには、ホストされるSQLサーバーを指定する必要があります。

### SQL Database Security Features

- **常に最新**: 最新の安定版SQL Serverで実行され、新機能やパッチを自動的に受け取ります。
- **継承されたSQL Serverのセキュリティ機能:**
- 認証 (SQLおよび/またはEntra ID)
- 割り当てられたマネージドID
- ネットワーク制限
- 暗号化
- バックアップ
- …
- **データ冗長性:** オプションはローカル、ゾーン、地理的または地理的ゾーン冗長です。
- **台帳:** データの整合性を暗号的に検証し、改ざんが検出されることを保証します。金融、医療、機密データを管理する組織にとって有用です。

SQLデータベースは**エラスティックプール**の一部である可能性があります。エラスティックプールは、複数のデータベースを管理するためのコスト効果の高いソリューションで、構成可能なコンピュート (eDTUs) とストレージリソースを共有し、価格はデータベースの数ではなく、割り当てられたリソースに基づいています。

#### Azure SQL Column Level Security (Masking) & Row Level Security

**Azure SQLの動的**データマスキングは、**機密情報を保護する**ための機能で、無許可のユーザーから隠します。実際のデータを変更するのではなく、表示されるデータを動的にマスクし、クレジットカード番号などの機密情報が隠されることを保証します。

**動的データマスキング**は、マスクされていないユーザー（これらのユーザーは指定する必要があります）と管理者を除くすべてのユーザーに影響します。動的データマスキングから免除されるSQLユーザーを指定する構成オプションがあり、**管理者は常に除外されます**。

**Azure SQL Row Level Security (RLS)**は、**ユーザーが表示または変更できる行を制御する**機能で、各ユーザーが自分に関連するデータのみを表示できるようにします。フィルターまたはブロック述語を使用してセキュリティポリシーを作成することで、組織はデータベースレベルでの細かいアクセス制御を強制できます。

### Azure SQL Managed Instance

**Azure SQL Managed Instances**は、大規模なSQL Serverインスタンススコープの展開向けです。最新のSQL Serverオンプレミス（Enterprise Edition）データベースエンジンとの互換性がほぼ100%で、一般的なセキュリティの懸念に対処するネイティブの仮想ネットワーク（VNet）実装を提供し、オンプレミスのSQL Server顧客にとって有利なビジネスモデルを提供します。

### Azure SQL Virtual Machines

**Azure SQL Virtual Machines**は、**オペレーティングシステム**とSQL Serverインスタンスを制御できるようにします。VMサービスでSQLサーバーを実行するVMが生成されます。

SQL仮想マシンが作成されると、SQLサーバーをホストするVMの**すべての設定を選択することが可能です**（VMレッスンに示されているように）。
- これは、VMがいくつかのVNetにアクセスし、**マネージドIDが添付されている可能性があり、ファイル共有がマウントされる**ことを意味します… SQLからVMへの**ピボットが非常に興味深い**です。
- さらに、特定のキーコンテナにアクセスするためにSQLが**アプリIDとシークレットを構成する**ことも可能で、そこには機密情報が含まれている可能性があります。

自動SQL更新、自動バックアップ、Entra ID認証、その他のSQLサービスのほとんどの機能などを構成することも可能です。

## Enumeration

{{#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 <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/<subscriptionId>/resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<serverName>/databases/<databaseName>/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"}}
```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}}

データベース内でダイナミックデータマスキングおよび行レベルポリシーを列挙したい場合は、次のクエリを実行できます:
```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 <server-name> --resource-group <resource-group>`、また、ファイアウォールルールが私たちのIPのアクセスを許可しているかどうかも確認する必要があります。
```bash
sqlcmd -S <sql-server>.database.windows.net -U <server-user> -P <server-passworkd> -d <database>
```
## 参考文献

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