# 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)も使用できます。 **管理されたアイデンティティ:** - システムおよびユーザー管理のMIを割り当てることが可能です。 - 暗号化キー(CMEKが使用されている場合)やデータベースからの他のサービスにアクセスするために使用されます。 - データベースからアクセスできるAzureサービスのいくつかの例については、[このドキュメントのページ](https://learn.microsoft.com/en-us/sql/t-sql/statements/create-external-data-source-transact-sql)を確認してください。 - 1つ以上のUMIが割り当てられている場合、使用するデフォルトのUMIを指定することが可能です。 - クロステナントアクセスのために、フェデレーテッドクライアントアイデンティティを構成することが可能です。 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への**ピボットが非常に興味深いものになります。 - さらに、特定のキーコンテナにアクセスするために**アプリ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 --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}} データベース内でダイナミックデータマスキングおよび行レベルポリシーを列挙したい場合は、次のクエリを実行できます: ```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 ``` ## 参考文献 - [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}}