チュートリアル: セキュリティで保護されたエンクレーブが設定された Always Encrypted を SQL Server で使い始める
適用対象: SQL Server 2019 (15.x) 以降 - Windows のみ
このチュートリアルでは、SQL Server でのセキュリティで保護されたエンクレーブを使用する Always Encrypted の開始方法について説明します。 次のことを示します。
- セキュリティで保護されたエンクレーブを使用する Always Encrypted をテストおよび評価する基本的な環境を作成する方法。
- SQL Server Management Studio (SSMS) を使用して、データのインプレース暗号化を行い、暗号化された列に対して高度な機密クエリを実行する方法。
エンクレーブ構成証明のためにホスト ガーディアン サービスを使用して、セキュリティで保護されたエンクレーブを使用する Always Encrypted を設定する方法についてお知りになりたい場合は、「チュートリアル: SQL Serverでセキュリティで保護されたエンクレーブを使用する Always Encrypted の使用を開始する方法」を参照してください。
前提条件
SQL Server インスタンスをホストしているコンピューター (SQL Server コンピューターと呼ばれます) は、次の要件を満たす必要があります。
- SQL Server 2019 (15.x) 以降
- Windows 10 以降、Windows Server 2019 以降。
- 仮想化テクノロジに対する CPU サポート:
- Extended Page Tables を備えた Intel VT-x。
- Rapid Virtualization Indexing を備えた AMD-V。
- VM で SQL Server を実行されている場合
- Azure では、第 2 世代 VM サイズ (推奨) を使用するか、入れ子になった仮想化が有効になっている第 1 世代 VM サイズを使用します。 個々の VM サイズに関するドキュメントを参照して、入れ子になった仮想化がサポートされている第 1 世代 VM サイズを確認してください。
- Hyper-V 2016 以降 (Azure の外部) では、VM が第 2 世代 VM (推奨) であるか、入れ子になった仮想化が有効になっている第 1 世代 VM であることを確認してください。 詳細については、「Hyper-V では、第 1 世代と第 2 世代の仮想マシンのどちらを作成するべきですか?」と「入れ子になった仮想化の構成」を参照してください。
- VMware vSphere 6.7 以降では、VMware のドキュメントの説明に従って、仮想化ベースのセキュリティによる VM のサポートを有効にします。
- 他のハイパーバイザーおよびパブリック クラウドでは、VBS エンクレーブが設定された Always Encrypted を有効にする入れ子になった仮想化機能がサポートされている場合もあります。 互換性と構成手順については、仮想化ソリューションのドキュメントを確認してください。
- 最新バージョンの SQL Server Management Studio 代わりに、別のコンピューター上に SSMS をインストールすることができます。
警告
運用環境では、SSMS や他のキー管理ツールを SQL Server コンピューター上で実行すると、Always Encrypted を使用するセキュリティ上の利点が減少する可能性があります。 一般に、このようなツールは別のコンピューター上で実行することをお勧めします。 詳細については、「 キー管理でのセキュリティに関する考慮事項」を参照してください。
手順 1: 仮想化ベースのセキュリティ (VBS) が有効になっていることを確認する
コンピューターにローカル管理者としてサインインし、管理者特権の Windows PowerShell コンソールを開いて、msinfo32.exe を実行します。 VBS が実行されているか確認します。 VBS が実行されている場合は、このセクションの残りの手順をスキップして、次のセクションに進みます。
PowerShell セッションで次のコマンドレットを実行して、VBS を有効にします。
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard -Name EnableVirtualizationBasedSecurity -Value 1
使用している SQL Server コンピューターが仮想マシンの場合、UEFI セキュア ブートをサポートしていない物理マシンの場合、または IOMMU が搭載されていない物理マシンの場合は、プラットフォームのセキュリティ機能に関する VBS 要件を削除する必要があります。 SQL Server コンピューター上で、管理者特権の PowerShell コンソールで次のコマンドを実行して、セキュアブートと IOMMU の要件を削除します。
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard -Name RequirePlatformSecurityFeatures -Value 0
SQL Server コンピューターを再起動し、VBS をオンラインにします。
Restart-Computer
手順 1 を繰り返して、VBS が実行されているかどうかを確認します。
手順 2: SQL Server 上でセキュリティで保護されたエンクレーブを使用する Always Encrypted を有効にする
この手順では、SQL Server インスタンス上でエンクレーブを使用する Always Encrypted の機能を有効にします。
SSMS を使用し、データベース接続の Always Encrypted を有効にしないで、sysadmin として SQL Server インスタンスに接続します。
SSMS を起動します。
[サーバーへの接続] ダイアログで、サーバーの名前を指定し、認証方法を選択して、資格情報を指定します。
[オプション >>] をクリックして、[Always Encrypted] タブを選択します。
[Always Encrypted を有効にする (列の暗号化)] チェック ボックスがオンになっていないことを確認します。
[接続] を選択します。
新しいクエリ ウィンドウを開き、次のステートメントを実行して、セキュリティで保護されたエンクレーブの型を仮想化ベースのセキュリティ (VBS) に設定します。
EXEC sys.sp_configure 'column encryption enclave type', 1; RECONFIGURE;
SQL Server インスタンスを再起動して、前の変更を反映します。 SSMS でインスタンスを再起動するには、オブジェクト エクスプローラー上でそのインスタンスを右クリックし、[再起動] を選択します。 インスタンスの再起動後に、再接続します。
次のクエリを実行して、セキュア エンクレーブが読み込まれていることを確認します。
SELECT [name], [value], [value_in_use] FROM sys.configurations WHERE [name] = 'column encryption enclave type';
クエリでは、次の結果が返されるはずです。
name 値 value_in_use 列暗号化エンクレーブの型 1 1
手順 3: サンプル データベースを作成する
この手順では、いくつかのサンプル データを含むデータベースを作成し、その後暗号化します。
前の手順の SSMS インスタンスを使用し、クエリ ウィンドウで次のステートメントを実行して、ContosoHR という名前の新しいデータベースを作成します。
CREATE DATABASE [ContosoHR];
Employees という名前の新しいテーブルを作成します。
USE [ContosoHR]; GO CREATE SCHEMA [HR]; GO CREATE TABLE [HR].[Employees] ( [EmployeeID] [int] IDENTITY(1,1) NOT NULL, [SSN] [char](11) NOT NULL, [FirstName] [nvarchar](50) NOT NULL, [LastName] [nvarchar](50) NOT NULL, [Salary] [money] NOT NULL ) ON [PRIMARY];
いくつかの従業員レコードを Employees テーブルに追加します。
USE [ContosoHR]; GO INSERT INTO [HR].[Employees] ([SSN] ,[FirstName] ,[LastName] ,[Salary]) VALUES ('795-73-9838' , N'Catherine' , N'Abel' , $31692); INSERT INTO [HR].[Employees] ([SSN] ,[FirstName] ,[LastName] ,[Salary]) VALUES ('990-00-6818' , N'Kim' , N'Abercrombie' , $55415);
手順 4:エンクレーブ対応キーをプロビジョニングする
この手順では、エンクレーブ計算を可能にする列マスター キーと列暗号化キーを作成します。
前の手順の SSMS インスタンスを使用し、オブジェクト エクスプローラーでデータベースを展開して、 [セキュリティ]>[Always Encrypted キー] に移動します。
エンクレーブ対応の列マスター キーをプロビジョニングします。
[Always Encrypted キー] を右クリックし、 [新しい列マスター キー...] を選択します。
列マスター キー名 CMK1 を選択します。
[Windows 証明書ストア -現在のユーザー] または [Windows 証明書ストア - ローカル コンピューター] か、[Azure Key Vault] を選択します。
[エンクレーブ計算を許可する] を選択します。
[Azure Key Vault] を選択した場合は、Azure にサインインし、キー コンテナーを選択します。 Always Encrypted のキー コンテナーを作成する方法について詳しくは、「Manage your key vaults from Azure portal」(Azure portal からキー コンテナーを管理する) を参照してください。
証明書または Azure Key Value キーが既に存在する場合はそれを選択します。または、[証明書の生成] ボタンをクリックして、新しい証明書を作成します。
[OK] を選択します。
新しいエンクレーブ対応の列暗号化キーを作成します。
- [Always Encrypted キー] を右クリックし、 [新しい列の暗号化キー] を選択します。
- 新しい列暗号化キーの名前「CEK1」を入力します。
- [列マスター キー] ドロップダウンで、前の手順で作成した列マスター キーを選択します。
- [OK] を選択します。
手順 5:一部の列のインプレース暗号化を行う
この手順では、サーバー側エンクレーブ内の SSN および Salary 列に格納されたデータを暗号化し、そのデータに対して SELECT クエリをテストします。
SSMS を開き、データベース接続の Always Encrypted を有効にして、SQL Server インスタンスに接続します。
SSMS の新しいインスタンスを開始します。
[サーバーへの接続] ダイアログで、サーバーの名前を指定し、認証方法を選択して、資格情報を指定します。
[オプション >>] をクリックして、[Always Encrypted] タブを選択します。
[Always Encrypted を有効にする (列の暗号化)] チェック ボックスをオンにします。
[Enable secure enclaves] (セキュリティで保護されたエンクレーブを有効にする) を選択します。
[プロトコル] を [なし] に設定します。
[接続] を選択します。
Always Encrypted クエリのパラメーター化を有効にするよう求められたら、 [有効] を選択します。
同じ SSMS インスタンス (Always Encrypted が有効) を使用して、新しいクエリ ウィンドウを開き、下のクエリを実行して SSN 列と Salary 列を暗号化します。
USE [ContosoHR]; GO ALTER TABLE [HR].[Employees] ALTER COLUMN [SSN] [char] (11) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL WITH (ONLINE = ON); ALTER TABLE [HR].[Employees] ALTER COLUMN [Salary] [money] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL WITH (ONLINE = ON); ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
Note
上記のスクリプト内でデータベース用のクエリ プラン キャッシュをクリアする ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE ステートメントに注目してください。 テーブルを変更したら、テーブルにアクセスするすべてのバッチおよびストアド プロシージャのプランをクリアして、パラメーター暗号化情報を更新する必要があります。
SSN 列と Salary 列が暗号化されたことを確認するには、データベース接続の Always Encrypted が有効になっていない SSMS インスタンスで新しいクエリ ウィンドウを開き、下のステートメントを実行します。 クエリ ウィンドウで、SSN 列と Salary 列に暗号化された値が返される必要があります。 Always Encrypted が有効な SSMS インスタンスを使用して同じクエリを実行した場合は、復号化されたデータが表示されます。
SELECT * FROM [HR].[Employees];
手順 6:暗号化された列に対して高度なクエリを実行する
ここで、暗号化された列に対して高度なクエリを実行できます。 いくつかのクエリ処理は、サーバー側エンクレーブ内で実行されます。
Always Encrypted が有効になっている SSMS インスタンスで、Always Encrypted のパラメーター化も有効になっていることを確認します。
- SSMS のメイン メニューから [ツール] を選択します。
- [オプション...] を選択します。
- [クエリ実行]>[SQL Server]>[詳細] の順に移動します。
- [Always Encrypted のパラメーター化を有効にする] がオンであることを確認します。
- [OK] を選択します。
新しいクエリ ウィンドウを開き、下のクエリを貼り付けて実行します。 クエリでは、指定した検索条件を満たすプレーンテキスト値と行が返されます。
DECLARE @SSNPattern [char](11) = '%6818'; DECLARE @MinSalary [money] = $1000; SELECT * FROM [HR].[Employees] WHERE SSN LIKE @SSNPattern AND [Salary] >= @MinSalary;
Always Encrypted が有効になっていない SSMS インスタンスで同じクエリをもう一度試行して、発生するエラーに注意します。
次のステップ
このチュートリアルを完了すると、次のいずれかのチュートリアルに進むことができます。
- チュートリアル:セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用する .NET アプリケーションの開発」をご覧ください。
- チュートリアル:セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用する .NET Framework アプリケーションの開発
- チュートリアル:ランダム化された暗号化を使用してエンクレーブ対応の列でインデックスを作成して使用する