チュートリアル:セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用する .NET Framework アプリケーションの開発
適用対象: SQL Server 2019 (15.x) 以降 - Windows のみ Azure SQL データベース
このチュートリアルでは、セキュリティで保護されたエンクレーブが設定された Always Encrypted に対してサーバー側のセキュリティで保護されたエンクレーブを使用するデータベース クエリを発行する、アプリケーションを開発する方法について説明します。
Note
.NET Framework では、構成証明なしで VBS エンクレーブによる Always Encrypted を使用することはできません。 このチュートリアルは、Microsoft Azure Attestation (Azure SQL Database の Intel SGX エンクレーブを使用) またはホスト ガーディアン サービス (SQL Server の VBS エンクレーブを使用) または ホスト ガーディアン サービス (SQL Server の VBSBISエンクレーブを使用) で構成証明を使用している場合にのみ適用されます。
前提条件
このチュートリアルで以下の手順を行う前に、「セキュリティで保護されたエンクレーブが設定された Always Encrypted を使い始める」のチュートリアルのいずれかを完了してください。
Visual Studio (バージョン 2022 を推奨) も必要です。https://visualstudio.microsoft.com/ からダウンロードしてください。 アプリケーション開発用コンピューターで、.NET Framework 4.7.2 以降が実行されている必要があります。
手順 1:Visual Studio プロジェクトを設定する
.NET Framework アプリケーションでセキュリティで保護されたエンクレーブが設定された Always Encrypted を使用するには、.NET Framework 4.7.2 をターゲットにしてアプリケーションを構築し、Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders NuGet と統合する必要があります。 さらに、列マスター キーを Azure Key Vault に格納する場合は、アプリケーションを Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider NuGet バージョン 2.4.0 以降と統合する必要もあります。
Visual Studio を開きます。
新しい C# コンソール アプリ (.NET Framework) プロジェクトを作成します。
プロジェクトは必ず .NET Framework 4.7.2 以降をターゲットにします。 ソリューション エクスプローラーでプロジェクトを右クリックし、[プロパティ] を選択して、[ターゲット フレームワーク] を [.NET Framework 4.7.2] に設定します。
[ツール] (メイン メニュー) >[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] に移動して、次の NuGet パッケージをインストールします。 パッケージ マネージャー コンソールで次のコードを実行します。
Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders -IncludePrerelease
Azure Key Vault を使用して列マスター キーを格納する場合は、[ツール] (メイン メニュー) >[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] に移動して、次の NuGet パッケージをインストールします。 パッケージ マネージャー コンソールで次のコードを実行します。
Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider -IncludePrerelease -Version 2.4.0 Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory
プロジェクトの App.config ファイルを開きます。
<configuration>
セクションを見つけて、<configSections>
セクションを追加または更新します。<configuration>
セクションに<configSections>
セクションが含まれていない場合は、<configuration>
のすぐ下に次の内容を追加します。<configSections> <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </configSections>
<configuration>
セクションに<configSections>
セクションが既に含まれている場合は、<configSections>
セクション内に次の行を追加します。<section name="SqlColumnEncryptionEnclaveProviders" type="System. Data.SqlClient. SqlColumnEncryptionEnclaveProviderConfigurationSection, System. Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<configuration>
セクション内で、</configSections>
の下に新しいセクションを追加します。これにより、構成証明、およびサーバー側のセキュリティで保護されたエンクレーブとのやり取りに使用されるエンクレーブ プロバイダーが指定されます。SQL Server とホスト ガーディアン サービス (HGS) を使用する (「チュートリアル: SQL Server でのセキュリティで保護されたエンクレーブを使用する Always Encrypted の概要」のデータベースを使用する) 場合は、以下のセクションを追加します。
<SqlColumnEncryptionEnclaveProviders> <providers> <add name="VBS" type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.HostGuardianServiceEnclaveProvider, Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/> </providers> </SqlColumnEncryptionEnclaveProviders>
単純なコンソール アプリケーションの app.config ファイルの完全な例を次に示します。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </configSections> <SqlColumnEncryptionEnclaveProviders> <providers> <add name="VBS" type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.HostGuardianServiceEnclaveProvider, Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/> </providers> </SqlColumnEncryptionEnclaveProviders> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> </startup> </configuration>
Azure SQL Database を SGX エンクレーブ と Microsoft Azure Attestation とあわせて使用する (「チュートリアル: Azure SQL Database でのセキュリティで保護された Intel SGX エンクレーブを使用する Always Encrypted の概要」のデータベースを使用する) 場合は、以下のセクションを追加します。
<SqlColumnEncryptionEnclaveProviders> <providers> <add name="SGX" type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.AzureAttestationEnclaveProvider, Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" /> </providers> </SqlColumnEncryptionEnclaveProviders>
単純なコンソール アプリケーションの app.config ファイルの完全な例を次に示します。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> </configSections> <SqlColumnEncryptionEnclaveProviders> <providers> <add name="SGX" type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.AzureAttestationEnclaveProvider, Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" /> </providers> </SqlColumnEncryptionEnclaveProviders> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> </startup> </configuration>
手順 2:アプリケーションのロジックを実装する
このアプリケーションは、チュートリアルの 1 つで作成された ContosoHR データベース (「前提条件」を参照) に接続して、SSN 列に対する LIKE
述語と、Salary に対する範囲比較が含まれるクエリを実行します。
(Visual Studio によって生成された) Program.cs ファイルの内容を、次のコードに置き換えます。 データベース接続文字列を、お使いのサーバー名、データベース認証設定、およびご利用の環境のエンクレーブ構成証明 URL で更新します。
using System; using System.Data.SqlClient; using System.Data; namespace ConsoleApp1 { class Program { static void Main(string[] args) { string connectionString = "Data Source = myserver; Initial Catalog = ContosoHR; Column Encryption Setting = Enabled;Enclave Attestation Url = http://hgs.bastion.local/Attestation; Integrated Security = true"; //string connectionString = "Data Source = myserver.database.windows.net; Initial Catalog = ContosoHR; Column Encryption Setting = Enabled;Enclave Attestation Url = https://myattestationprovider.uks.attest.azure.net/attest/SgxEnclave; User ID=user; Password=password"; using (SqlConnection connection = new SqlConnection(connectionString)) { connection.Open(); SqlCommand cmd = connection.CreateCommand(); cmd.CommandText = @"SELECT [SSN], [FirstName], [LastName], [Salary] FROM [HR].[Employees] WHERE [SSN] LIKE @SSNPattern AND [Salary] > @MinSalary;"; SqlParameter paramSSNPattern = cmd.CreateParameter(); paramSSNPattern.ParameterName = @"@SSNPattern"; paramSSNPattern.DbType = DbType.AnsiStringFixedLength; paramSSNPattern.Direction = ParameterDirection.Input; paramSSNPattern.Value = "%9838"; paramSSNPattern.Size = 11; cmd.Parameters.Add(paramSSNPattern); SqlParameter MinSalary = cmd.CreateParameter(); MinSalary.ParameterName = @"@MinSalary"; MinSalary.DbType = DbType.Currency; MinSalary.Direction = ParameterDirection.Input; MinSalary.Value = 20000; cmd.Parameters.Add(MinSalary); cmd.ExecuteNonQuery(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { Console.WriteLine(reader[0] + ", " + reader[1] + ", " + reader[2] + ", " + reader[3]); } Console.ReadKey(); } } } }
アプリケーションをビルドして実行します。