チュートリアル:ランダム化された暗号化を使用してエンクレーブ対応の列でインデックスを作成して使用する
適用対象: SQL Server 2019 (15.x) 以降 - Windows のみ Azure SQL Database
このチュートリアルでは、セキュリティで保護されたエンクレーブが設定された Always Encrypted でサポートされているランダム化された暗号化を使用して、エンクレーブ対応の列にインデックスを作成して使用する方法を説明します。 次のことを示します。
- 列を保護しているキー (列マスター キーと列暗号化キー) にアクセスできるときに、インデックスを作成する方法。
- 列を保護しているキーにアクセスできないときに、インデックスを作成する方法。
前提条件
最新バージョンの SQL Server Management Studio (SSMS) をダウンロードします。
このチュートリアルの以下の手順に従う前に、セキュリティで保護されたエンクレーブでAlways Encryptedの使用を開始するチュートリアルのいずれかを完了していることを確認してください。
手順 1:データベースで高速データベース復旧 (ADR) を有効にする
注意
この手順は SQL Server にのみ適用されます。 Azure SQL Database を使用している場合、この手順をスキップしてください。 ADR は Azure SQL Database で自動的に有効になり、無効化はサポートされていません。
ランダム化された暗号化を使用してエンクレーブ対応の列で最初のインデックスを作成する前に、データベースで ADR を有効にすることを強くお勧めします。 「セキュリティで保護されたエンクレーブが設定された Always Encrypted」の「データベース復旧」セクションを参照してください。
前のチュートリアルで使用した SSMS インスタンスをすべて閉じます。 SSMS を閉じると、ADR を有効にするために必要な、開いたデータベース接続が閉じます。
SSMS の新しいインスタンスを開き、データベース接続の Always Encrypted を有効にしないで、sysadmin として SQL Server インスタンスに接続します。
- SSMS を起動します。
- [サーバーへの接続] ダイアログで、サーバーの名前を指定し、認証方法を選択して、資格情報を指定します。
- [オプション >>] をクリックして、[Always Encrypted] タブを選択します。
- [Always Encrypted を有効にする (列の暗号化)] チェック ボックスがオンになっていないことを確認します。
- [接続] を選択します。
新しいクエリ ウィンドウを開き、下のステートメントを実行して ADR を有効にします。
ALTER DATABASE ContosoHR SET ACCELERATED_DATABASE_RECOVERY = ON;
手順 2:ロールを分離せずにインデックスを作成してテストする
この手順では、暗号化された列でインデックスを作成してテストします。 データベースを管理する DBA と、データを保護しているキーにアクセスできるデータ所有者の両方のロールを担う、1 人のユーザーとして作業します。
SSMS を開き、データベース接続の Always Encrypted を有効にして、SQL Server インスタンスに接続します。
- SSMS の新しいインスタンスを開始します。
- [サーバーへの接続] ダイアログで、サーバーの名前を指定し、認証方法を選択して、資格情報を指定します。
- [オプション >>] をクリックして、[Always Encrypted] タブを選択します。
- [Always Encryptedを有効にする (列の暗号化)] と [セキュリティで保護されたエンクレーブを有効にする] チェック ボックスをオンにします
- データベースに構成証明を使用している場合は、構成証明サービス (Host Guardian Service または Microsoft Azure Attestation) を表す Enclave 構成証明プロトコルの値を選択し、エンクレーブ構成証明 URL を入力します。 それ以外の場合は、[なし] を選択します。
- [接続] を選択します。
- Always Encrypted クエリのパラメーター化を有効にするように求められたら、[有効にする] を選択します。
Always Encrypted のパラメーター化を有効にすることを求められなかった場合は、有効になっていることを確認します。
- SSMS のメイン メニューから [ツール] を選択します。
- [オプション...] を選択します。
- [クエリ実行]>[SQL Server]>[詳細] の順に移動します。
- [Always Encrypted のパラメーター化を有効にする] がオンであることを確認します。
- [OK] を選択します。
クエリ ウィンドウを開き、下のステートメントを実行して、Employees テーブルの LastName 列を暗号化します。 後の手順では、その列にインデックスを作成して使用します。
ALTER TABLE [HR].[Employees] ALTER COLUMN [LastName] [nvarchar](50) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL; GO ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE; GO
LastName 列にインデックスを作成します。 Always Encrypted を有効にしてデータベースに接続しているため、SSMS 内のクライアント ドライバーによって、CEK1 (LastName 列を保護している列暗号化キー) がエンクレーブに透過的に提供されます。インデックスを作成するにはこれが必要です。
CREATE INDEX IX_LastName ON [HR].[Employees] ([LastName]) INCLUDE ([EmployeeID], [FirstName], [SSN], [Salary]); GO
LastName 列に対して高度なクエリを実行し、クエリの実行時に SQL Server によってインデックスが使われることを確認します。
同じクエリ ウィンドウまたは新しいクエリ ウィンドウで、ツール バーの [ライブ クエリ統計を含む] ボタンがオンになっていることを確認します。
下のクエリを実行します。
DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%'; SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix; GO
[ ライブ クエリ統計 ] タブで、クエリでインデックスが使用されていることを確認します。
手順 3: ロールを分離してインデックスを作成する
この手順では、2 人の異なるユーザーとして、暗号化された列にインデックスを作成します。 1 人のユーザーは、インデックスを作成する必要がありますが、キーにアクセスできない DBA です。 もう 1 人のユーザーは、キーにアクセスできるデータ所有者です。
Always Encrypted が有効になっていない SSMS インスタンスを使い、下のステートメントを実行して LastName 列のインデックスを削除します。
DROP INDEX IX_LastName ON [HR].[Employees]; GO
データ所有者 (または、キーにアクセスできるアプリケーション) として、エンクレーブ内のキャッシュに CEK1 を設定します。
注意
「手順 2: ロールを分離せずにインデックスを作成してテストする」の後で SQL Server インスタンスを再起動していない場合、CEK1 はキャッシュに既に存在しているので、この手順は冗長です。 キーがエンクレーブにまだ存在しない場合に、データ所有者がエンクレーブにキーを提供できる方法を示すため、キーを追加しました。
Always Encrypted が有効になっている SSMS インスタンスにおいて、次のステートメントをクエリ ウィンドウで実行します。 そのステートメントでは、エンクレーブ対応の列のすべての暗号化キーがエンクレーブに送信されます。 詳しくは、「sp_enclave_send_keys」をご覧ください。
EXEC sp_enclave_send_keys; GO
上のストアド プロシージャを実行する代わりに、エンクレーブを使う DML クエリを LastName 列に対して実行してもかまいません。 これにより、エンクレーブに CEK1 だけが設定されます。
DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%'; SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix; GO
DBA として、インデックスを作成します。
Always Encrypted が有効になっていない SSMS インスタンスにおいて、次のステートメントをクエリ ウィンドウで実行します。
CREATE INDEX IX_LastName ON [HR].[Employees] ([LastName]) INCLUDE ([EmployeeID], [FirstName], [SSN], [Salary]); GO
データ所有者として、LastName 列に対して高度なクエリを実行し、クエリの実行時に SQL Server によってインデックスが使われることを確認します。
Always Encrypted が有効になっている SSMS インスタンスで、既存のクエリ ウィンドウを選択するか、または新しいクエリ ウィンドウを開き、ツール バーの [ライブ クエリ統計を含む] ボタンがオンになっていることを確認します。
下のクエリを実行します。
DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%'; SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix; GO
[ライブ クエリ統計] で、クエリでインデックスが使用されていることを確認します。
次のステップ
- チュートリアル:セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用する .NET アプリケーションの開発」をご覧ください。
- チュートリアル:セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用する .NET Framework アプリケーションの開発
関連項目
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示