チュートリアル: セキュリティで保護されたエンクレーブが設定された 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) が有効になっていることを確認する

  1. コンピューターにローカル管理者としてサインインし、管理者特権の Windows PowerShell コンソールを開いて、msinfo32.exe を実行します。 VBS が実行されているか確認します。 VBS が実行されている場合は、このセクションの残りの手順をスキップして、次のセクションに進みます。

    Screenshot of the System Information virtualization-based security details.

  2. PowerShell セッションで次のコマンドレットを実行して、VBS を有効にします。

    Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard -Name EnableVirtualizationBasedSecurity -Value 1
    
  3. 使用している SQL Server コンピューターが仮想マシンの場合、UEFI セキュア ブートをサポートしていない物理マシンの場合、または IOMMU が搭載されていない物理マシンの場合は、プラットフォームのセキュリティ機能に関する VBS 要件を削除する必要があります。 SQL Server コンピューター上で、管理者特権の PowerShell コンソールで次のコマンドを実行して、セキュアブートと IOMMU の要件を削除します。

    Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard -Name RequirePlatformSecurityFeatures -Value 0
    
  4. SQL Server コンピューターを再起動し、VBS をオンラインにします。

    Restart-Computer
    
  5. 手順 1 を繰り返して、VBS が実行されているかどうかを確認します。

手順 2: SQL Server 上でセキュリティで保護されたエンクレーブを使用する Always Encrypted を有効にする

この手順では、SQL Server インスタンス上でエンクレーブを使用する Always Encrypted の機能を有効にします。

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

    1. SSMS を起動します。

    2. [サーバーへの接続] ダイアログで、サーバーの名前を指定し、認証方法を選択して、資格情報を指定します。

    3. [オプション >>] をクリックして、[Always Encrypted] タブを選択します。

    4. [Always Encrypted を有効にする (列の暗号化)] チェック ボックスがオンになっていないことを確認します。

      Screenshot of the SSMS connection option for Always Encrypted disabled.

    5. [接続] を選択します。

  2. 新しいクエリ ウィンドウを開き、次のステートメントを実行して、セキュリティで保護されたエンクレーブの型を仮想化ベースのセキュリティ (VBS) に設定します。

    EXEC sys.sp_configure 'column encryption enclave type', 1;
    RECONFIGURE;
    
  3. SQL Server インスタンスを再起動して、前の変更を反映します。 SSMS でインスタンスを再起動するには、オブジェクト エクスプローラー上でそのインスタンスを右クリックし、[再起動] を選択します。 インスタンスの再起動後に、再接続します。

  4. 次のクエリを実行して、セキュア エンクレーブが読み込まれていることを確認します。

    SELECT [name], [value], [value_in_use] FROM sys.configurations
    WHERE [name] = 'column encryption enclave type';
    

    クエリでは、次の結果が返されるはずです。

    name value value_in_use
    列暗号化エンクレーブの型 1 1

手順 3: サンプル データベースを作成する

この手順では、いくつかのサンプル データを含むデータベースを作成し、その後暗号化します。

  1. 前の手順の SSMS インスタンスを使用し、クエリ ウィンドウで次のステートメントを実行して、ContosoHR という名前の新しいデータベースを作成します。

    CREATE DATABASE [ContosoHR];
    
  2. 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];
    
  3. いくつかの従業員レコードを 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:エンクレーブ対応キーをプロビジョニングする

この手順では、エンクレーブ計算を可能にする列マスター キーと列暗号化キーを作成します。

  1. 前の手順の SSMS インスタンスを使用し、オブジェクト エクスプローラーでデータベースを展開して、 [セキュリティ]>[Always Encrypted キー] に移動します。

  2. エンクレーブ対応の列マスター キーをプロビジョニングします。

    1. [Always Encrypted キー] を右クリックし、 [新しい列マスター キー...] を選択します。

    2. 列マスター キー名 CMK1 を選択します。

    3. [Windows 証明書ストア -現在のユーザー] または [Windows 証明書ストア - ローカル コンピューター] か、[Azure Key Vault] を選択します。

    4. [エンクレーブ計算を許可する] を選択します。

    5. [Azure Key Vault] を選択した場合は、Azure にサインインし、キー コンテナーを選択します。 Always Encrypted のキー コンテナーを作成する方法について詳しくは、「Manage your key vaults from Azure portal」(Azure portal からキー コンテナーを管理する) を参照してください。

    6. 証明書または Azure Key Value キーが既に存在する場合はそれを選択します。または、[証明書の生成] ボタンをクリックして、新しい証明書を作成します。

    7. [OK] を選択します。

      Screenshot of the allow enclave computations selection in SSMS when creating a new column master key.

  3. 新しいエンクレーブ対応の列暗号化キーを作成します。

    1. [Always Encrypted キー] を右クリックし、 [新しい列の暗号化キー] を選択します。
    2. 新しい列暗号化キーの名前「CEK1」を入力します。
    3. [列マスター キー] ドロップダウンで、前の手順で作成した列マスター キーを選択します。
    4. [OK] を選択します。

手順 5:一部の列のインプレース暗号化を行う

この手順では、サーバー側エンクレーブ内の SSN および Salary 列に格納されたデータを暗号化し、そのデータに対して SELECT クエリをテストします。

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

    1. SSMS の新しいインスタンスを開始します。

    2. [サーバーへの接続] ダイアログで、サーバーの名前を指定し、認証方法を選択して、資格情報を指定します。

    3. [オプション >>] をクリックして、[Always Encrypted] タブを選択します。

    4. [Always Encrypted を有効にする (列の暗号化)] チェック ボックスをオンにします。

    5. [Enable secure enclaves] (セキュリティで保護されたエンクレーブを有効にする) を選択します。

    6. [プロトコル][なし] に設定します。

      Screenshot of the connect to server Always Encrypted tab without attestation using SSMS.

    7. [接続] を選択します。

    8. Always Encrypted クエリのパラメーター化を有効にするよう求められたら、 [有効] を選択します。

  2. 同じ 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;
    

    注意

    上記のスクリプト内でデータベース用のクエリ プラン キャッシュをクリアする ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE ステートメントに注目してください。 テーブルを変更したら、テーブルにアクセスするすべてのバッチおよびストアド プロシージャのプランをクリアして、パラメーター暗号化情報を更新する必要があります。

  3. SSN 列と Salary 列が暗号化されたことを確認するには、データベース接続の Always Encrypted が有効になっていない SSMS インスタンスで新しいクエリ ウィンドウを開き、下のステートメントを実行します。 クエリ ウィンドウで、SSN 列と Salary 列に暗号化された値が返される必要があります。 Always Encrypted が有効な SSMS インスタンスを使用して同じクエリを実行した場合は、復号化されたデータが表示されます。

    SELECT * FROM [HR].[Employees];
    

手順 6:暗号化された列に対して高度なクエリを実行する

ここで、暗号化された列に対して高度なクエリを実行できます。 いくつかのクエリ処理は、サーバー側エンクレーブ内で実行されます。

  1. Always Encrypted が有効になっている SSMS インスタンスで、Always Encrypted のパラメーター化も有効になっていることを確認します。

    1. SSMS のメイン メニューから [ツール] を選択します。
    2. [オプション...] を選択します。
    3. [クエリ実行]>[SQL Server]>[詳細] の順に移動します。
    4. [Always Encrypted のパラメーター化を有効にする] がオンであることを確認します。
    5. [OK] を選択します。
  2. 新しいクエリ ウィンドウを開き、下のクエリを貼り付けて実行します。 クエリでは、指定した検索条件を満たすプレーンテキスト値と行が返されます。

    DECLARE @SSNPattern [char](11) = '%6818';
    DECLARE @MinSalary [money] = $1000;
    SELECT * FROM [HR].[Employees]
    WHERE SSN LIKE @SSNPattern AND [Salary] >= @MinSalary;
    
  3. Always Encrypted が有効になっていない SSMS インスタンスで同じクエリをもう一度試行して、発生するエラーに注意します。

次のステップ

このチュートリアルを完了すると、次のいずれかのチュートリアルに進むことができます。

関連項目