チュートリアル:ランダム化された暗号化を使用してエンクレーブ対応の列でインデックスを作成して使用する

適用対象: はいSQL Server 2019 (15.x) - Windows のみ はいAzure SQL データベース

このチュートリアルでは、セキュリティで保護されたエンクレーブが設定された Always Encrypted でサポートされているランダム化された暗号化を使用して、エンクレーブ対応の列にインデックスを作成して使用する方法を説明します。 次のことを示します。

  • 列を保護しているキー (列マスター キーと列暗号化キー) にアクセスできるときに、インデックスを作成する方法。
  • 列を保護しているキーにアクセスできないときに、インデックスを作成する方法。

前提条件

このチュートリアルの次の手順に従う前に、以下のチュートリアルのいずれかを完了していることを確認してください。

手順 1:データベースで高速データベース復旧 (ADR) を有効にする

注意

この手順は SQL Server にのみ適用されます。 Azure SQL データベース を使用している場合は、この手順をスキップしてください。 ADR は Azure SQL データベース で自動的に有効になり、無効化はサポートされていません。

ランダム化された暗号化を使用してエンクレーブ対応の列で最初のインデックスを作成する前に、データベースで ADR を有効にすることを強くお勧めします。 「セキュリティで保護されたエンクレーブが設定された Always Encrypted」の「データベース復旧」セクションを参照してください。

  1. 前のチュートリアルで使ったすべての SSMS インスタンスを閉じます。 これにより、開いたデータベース接続が閉じられます。ADR を有効にするにはこうする必要があります。

  2. SSMS の新しいインスタンスを開き、データベース接続の Always Encrypted を有効に しないで、sysadmin として SQL Server インスタンスに接続します。

    1. SSMS を起動します。
    2. [サーバーへの接続] ダイアログで、サーバーの名前を指定し、認証方法を選択して、資格情報を指定します。
    3. [オプション >>] をクリックして、 [Always Encrypted] タブを選択します。
    4. [Always Encrypted を有効にする (列の暗号化)] チェック ボックスがオンになって いない ことを確認します。
    5. [接続] を選択します。
  3. 新しいクエリ ウィンドウを開き、下のステートメントを実行して ADR を有効にします。

    ALTER DATABASE ContosoHR SET ACCELERATED_DATABASE_RECOVERY = ON;
    

手順 2:ロールを分離せずにインデックスを作成してテストする

この手順では、暗号化された列でインデックスを作成してテストします。 データベースを管理する DBA と、データを保護しているキーにアクセスできるデータ所有者の両方のロールを担う、1 人のユーザーとして作業します。

  1. 新しい SSMS インスタンスを開き、データベース接続に対して Always Encrypted を有効に して、SQL Server インスタンスに接続します。

    1. SSMS の新しいインスタンスを開始します。
    2. [サーバーへの接続] ダイアログで、サーバーの名前を指定し、認証方法を選択して、資格情報を指定します。
    3. [オプション >>] をクリックして、 [Always Encrypted] タブを選択します。
    4. [Always Encrypted を有効にする (列の暗号化)] チェック ボックスをオンにして、エンクレーブ構成証明 URL (たとえば、http://hgs.bastion.local/Attestationhttps://MyAttestationProvider.us.attest.azure.net/attest/SgxEnclave) を指定します。
    5. [接続] を選択します。
    6. Always Encrypted クエリのパラメーター化を有効にすることの確認を求められたら、[有効] をクリックします。
  2. Always Encrypted のパラメーター化を有効にすることを求められなかった場合は、有効になっていることを確認します。

    1. SSMS のメイン メニューから [ツール] を選択します。
    2. [オプション...] を選択します。
    3. [クエリ実行] > [SQL Server] > [詳細] の順に移動します。
    4. [Always Encrypted のパラメーター化を有効にする] がオンであることを確認します。
    5. [OK] を選択します。
  3. クエリ ウィンドウを開き、下のステートメントを実行して、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
    
  4. LastName 列にインデックスを作成します。 Always Encrypted を有効にしてデータベースに接続しているため、SSMS 内のクライアント ドライバーによって、CEK1 (LastName 列を保護している列暗号化キー) がエンクレーブに透過的に提供されます。インデックスを作成するにはこれが必要です。

    CREATE INDEX IX_LastName ON [HR].[Employees] ([LastName])
    INCLUDE ([EmployeeID], [FirstName], [SSN], [Salary]);
    GO
    
  5. LastName 列に対して高度なクエリを実行し、クエリの実行時に SQL Server によってインデックスが使われることを確認します。

    1. 同じクエリ ウィンドウまたは新しいクエリ ウィンドウで、ツール バーの [ライブ クエリ統計を含む] ボタンがオンになっていることを確認します。

    2. 下のクエリを実行します。

      DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%';
      SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix;
      GO
      
    3. [ライブ クエリ統計] タブ (クエリ ウィンドウの下部) で、クエリによりインデックスが使われていることを確認します。

手順 3: ロールを分離してインデックスを作成する

この手順では、2 人の異なるユーザーとして、暗号化された列にインデックスを作成します。 1 人のユーザーは、インデックスを作成する必要がありますが、キーにアクセスできない DBA です。 もう 1 人のユーザーは、キーにアクセスできるデータ所有者です。

  1. Always Encrypted が有効になって いない SSMS インスタンスを使い、下のステートメントを実行して LastName 列のインデックスを削除します。

    DROP INDEX IX_LastName ON [HR].[Employees]; 
    GO
    
  2. データ所有者 (または、キーにアクセスできるアプリケーション) として、エンクレーブ内のキャッシュに CEK1 を設定します。

    注意

    手順 2: ロールを分離せずにインデックスを作成してテストする」の後で SQL Server インスタンスを再起動していない場合、CEK1 はキャッシュに既に存在しているので、この手順は冗長です。 キーがエンクレーブにまだ存在しない場合に、データ所有者がエンクレーブにキーを提供できる方法を示すため、キーを追加しました。

    1. Always Encrypted が有効になって いる SSMS インスタンスにおいて、次のステートメントをクエリ ウィンドウで実行します。 そのステートメントでは、エンクレーブ対応の列のすべての暗号化キーがエンクレーブに送信されます。 詳しくは、「sp_enclave_send_keys」をご覧ください。

      EXEC sp_enclave_send_keys;
      GO
      
    2. 上のストアド プロシージャを実行する代わりに、エンクレーブを使う DML クエリを LastName 列に対して実行してもかまいません。 これにより、エンクレーブに CEK1 だけが設定されます。

      DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%';
      SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix;
      GO
      
  3. DBA として、インデックスを作成します。

    1. Always Encrypted が有効になって いない SSMS インスタンスにおいて、次のステートメントをクエリ ウィンドウで実行します。

      CREATE INDEX IX_LastName ON [HR].[Employees] ([LastName])
      INCLUDE ([EmployeeID], [FirstName], [SSN], [Salary]);
      GO
      
  4. データ所有者として、LastName 列に対して高度なクエリを実行し、クエリの実行時に SQL Server によってインデックスが使われることを確認します。

    1. Always Encrypted が有効になって いる SSMS インスタンスで、既存のクエリ ウィンドウを選択するか、または新しいクエリ ウィンドウを開き、ツール バーの [ライブ クエリ統計を含む] ボタンがオンになっていることを確認します。

    2. 下のクエリを実行します。

      DECLARE @LastNamePrefix NVARCHAR(50) = 'Aber%';
      SELECT * FROM [HR].[Employees] WHERE [LastName] LIKE @LastNamePrefix;
      GO
      
    3. [ライブ クエリ統計] (クエリ ウィンドウの下部) で、クエリによりインデックスが使われていることを確認します。

次のステップ

関連項目