チュートリアル: セキュリティで保護されたエンクレーブが設定された Always Encrypted を、HGS を使用する構成証明 を含む SQL Server で使い始める

適用対象: Windows 上の SQL Server 2019 (15.x) 以降のバージョン

このチュートリアルでは、エンクレーブ構成証明にホスト ガーディアン サービス (HGS) を使用して、SQL Server において、セキュリティで保護されたエンクレーブを使用する Always Encrypted を開始する方法について説明します。 次のことを示します。

  • エンクレーブ認証のためにHGSが構成されているエンクレーブを使用して、Always Encryptedをテストおよび評価するための基本的な環境を作成する方法。
  • SQL Server Management Studio (SSMS) を使用して、データのインプレース暗号化を行い、暗号化された列に対して高度な機密クエリを実行する方法。

構成証明なしでセキュリティで保護されたエンクレーブを使用する Always Encrypted を設定する方法についてお知りになりたいのであれば、「チュートリアル: SQL Serverでセキュリティで保護されたエンクレーブを使用する Always Encrypted の使用を開始する方法」を参照してください。

前提条件

セキュア エンクレーブを使用する Always Encrypted を開始するには、少なくとも 2 台のコンピューター (仮想マシンも可) が必要です。

  • SQL Server と SSMS をホストする SQL Server コンピューター。
  • エンクレーブの構成証明に必要なホスト ガーディアン サービスを実行する HGS コンピューター。

SQL Server コンピューターの要件

  • SQL Server 2019 (15.x) 以降
  • Windows 10 バージョン 1809 以降 - Enterprise Edition、Windows 11 以降 - Enterprise Edition、Windows Server 2019 以降 - Datacenter Edition。 Windows 10 または 11 および Windows Server の他のエディションでは、HGS を使用した構成証明はサポートされていません。
  • 仮想化テクノロジに対する CPU サポート:
    • 拡張ページテーブルを備えたインテル 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 7.0 以降では、 VMware ドキュメントで説明されているように、VM の仮想化ベースのセキュリティ サポートを有効にします。
      • 他のハイパーバイザーおよびパブリック クラウドでは、VBS エンクレーブが設定された Always Encrypted を有効にする入れ子になった仮想化機能がサポートされている場合もあります。 互換性と構成手順については、仮想化ソリューションのドキュメントを確認してください。
  • 最新バージョンの SQL Server Management Studio 代わりに、別のコンピューター上に SSMS をインストールすることができます。

警告

運用環境では、SSMS や他のキー管理ツールを SQL Server コンピューター上で実行すると、Always Encrypted を使用するセキュリティ上の利点が減少する可能性があります。 一般に、このようなツールは別のコンピューター上で実行することをお勧めします。 詳細については、「 キー管理でのセキュリティに関する考慮事項」を参照してください。

HGS コンピューターの要件

  • Windows Server 2019 Standard または Datacenter Edition
  • 2 つの CPU
  • 8 GB の RAM
  • 100 GB ストレージ

注記

開始する前に、HGS コンピューターがドメインに参加していてはなりません。

手順 1: HGS コンピューターを構成する

この手順では、ホスト キーの構成証明をサポートしているホスト ガーディアン サービスを実行するように HGS コンピューターを構成します。

  1. HGS コンピューターに管理者 (ローカル管理者) としてサインインし、管理者特権の Windows PowerShell コンソールを開き、次のコマンドを実行してホスト ガーディアン サービスの役割を追加します。

    Install-WindowsFeature -Name HostGuardianServiceRole -IncludeManagementTools -Restart
    
  2. HGS コンピューターが再起動した後、管理者アカウントでもう一度サインインし、管理者特権の Windows PowerShell コンソールを開きます。次のコマンドを実行してホスト ガーディアン サービスをインストールし、そのドメインを構成します。 ここで指定するパスワードは、Active Directory のディレクトリ サービスの修復モードのパスワードのみに該当します。管理者アカウントのログイン パスワードは変更されません。 -HgsDomainName に対して任意のドメイン名を指定できます。

    $adminPassword = ConvertTo-SecureString -AsPlainText '<password>' -Force
    Install-HgsServer -HgsDomainName 'bastion.local' -SafeModeAdministratorPassword $adminPassword -Restart
    
  3. コンピューターが再起動したら、管理者アカウント (現在はドメイン管理者を兼ねている) でサインインします。 管理者権限で Windows PowerShell コンソールを開き、HGS インスタンスのホストキー認証を構成します。

    Initialize-HgsAttestation -HgsServiceName 'hgs' -TrustHostKey  
    
  4. 次のコマンドを実行して、HGS コンピューターの IP アドレスを検索します。 後の手順で使用するために、この IP アドレスを保存します。

    Get-NetIPAddress  
    

注記

または、HGS コンピューターを DNS 名によって参照する場合は、企業の DNS サーバーから新しい HGS ドメイン コントローラーにフォワーダーを設定できます。

手順 2: SQL Server コンピューターを保護されたホストとして構成する

この手順では、ホスト キーの構成証明を使用して、HGS に登録されている保護されたホストとして SQL Server コンピューターを構成します。

警告

ホスト キーの構成証明は、より弱い構成証明モードと見なされます。 可能であれば、運用環境では TPM 構成証明を使用してください。 詳細については、「証明モード」を参照してください。

  1. 管理者として SQL Server コンピューターにサインインし、管理者特権で Windows PowerShell コンソールを開き、computername 変数にアクセスしてコンピューターの名前を取得します。

    $env:computername 
    
  2. 保護されたホスト機能をインストールすると、まだインストールされていない場合は、Hyper-V も自動的にインストールされます。

    Enable-WindowsOptionalFeature -Online -FeatureName HostGuardian -All
    
  3. Hyper-V のインストールを完了するように求められたら、SQL Server コンピューターを再起動します。

  4. 使用している SQL Server コンピューターが仮想マシンの場合、UEFI セキュア ブートをサポートしていない物理マシンの場合、または IOMMU が搭載されていない物理マシンの場合は、プラットフォームのセキュリティ機能に関する VBS 要件を削除する必要があります。

    1. SQL Server コンピューター上で、管理者特権の PowerShell コンソールで次のコマンドを実行して、セキュアブートと IOMMU の要件を削除します。

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

      Restart-Computer
      
  5. もう一度 SQL Server コンピューターに管理者としてサインインし、管理者特権の Windows PowerShell コンソールを開きます。一意のホスト キーを生成し、結果の公開キーをファイルにエクスポートします。

    Set-HgsClientHostKey 
    Get-HgsClientHostKey -Path $HOME\Desktop\hostkey.cer
    
  6. 前の手順で生成したホスト キー ファイルを HGS マシンに手動でコピーします。 次の手順では、ファイル名が hostkey.cer で、これを HGS マシン上のデスクトップにコピーすることを想定しています。

  7. HGS コンピューター上で、管理者特権の Windows PowerShell コンソールを開き、SQL Server コンピューターのホスト キーを HGS に登録します。

    Add-HgsAttestationHostKey -Name <your SQL Server computer name> -Path $HOME\Desktop\hostkey.cer
    
  8. SQL Server コンピューター上で、管理者特権の Windows PowerShell コンソール内で次のコマンドを実行して、SQL Server コンピューターに証明する場所を指示します。 両方のアドレスの場所で HGS コンピューターの IP アドレスまたは DNS 名を必ず指定します。

    # use http, and not https
    Set-HgsClientConfiguration -AttestationServerUrl http://<IP address or DNS name>/Attestation -KeyProtectionServerUrl http://<IP address or DNS name>/KeyProtection/  
    

上記のコマンドの結果として、AttestationStatus = Passed と表示されます。

HostUnreachable エラーが発生する場合、SQL Server コンピューターが HGS と通信できないことを意味します。 HGS コンピューターに対して ping を実行できることを確認します。

UnauthorizedHost エラーは公開キーが HGS サーバーに登録されていないことを示します。 手順 5 と 6 を繰り返してエラーを解決します。

他のすべてが失敗した場合は、Remove-HgsClientHostKey を実行し、手順 4 から 7 を繰り返します。

手順 3: SQL Server 上でセキュア エンクレーブを使用する Always Encrypted を有効にする

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

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

    1. SSMS を起動します。

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

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

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

      Always Encrypted が無効になっている SSMS 接続オプションのスクリーンショット。

    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';
    

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

    名前 使用価値
    列暗号化エンクレーブの型 1 1

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

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

  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);
    

手順 5: エンクレーブ対応のキーをプロビジョニングする

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

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

  2. エンクレーブ対応の列マスターキーを作成します。

    1. [Always Encrypted Keys] を右クリックし、 [New Column Master Key...] を選択します。

    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] を選択します。

      新しい列マスター キーを作成するときに SSMS で [エンクレーブ計算を許可する] をオンにしたスクリーンショット。

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

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

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

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

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

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

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

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

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

    5. [Enable secure enclaves] (セキュリティで保護されたエンクレーブを有効にする) を選択します。 (この手順は SSMS 19 以降に適用されます。)

    6. プロトコルホスト ガーディアン サービスに設定します。 (この手順は SSMS 19 以降に適用されます。)

    7. エンクレーブ保証 URL (例http://hgs.bastion.local/Attestation など) を指定してください。

      SSMS を使用した [サーバーに接続] ダイアログの [Always Encrypted] タブでのスクリーンショット。認証が行われています。

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

    9. 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;
    

    注記

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

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

    SELECT * FROM [HR].[Employees];
    

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

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

  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 インスタンスで同じクエリをもう一度試行して、発生するエラーに注意します。

次のステップ

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

関連項目