セキュリティで保護されたエンクレーブを使用して Transact-SQL ステートメントを実行する

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

セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用すると、一部の Transact-SQL (T-SQL) ステートメントで、サーバー側のセキュリティで保護されたエンクレーブ内にある暗号化されたデータベース列に対して機密計算を実行できます。

セキュリティで保護されたエンクレーブを使用するステートメント

次の種類の T-SQL ステートメントで、セキュリティで保護されたエンクレーブが利用されます。

セキュリティで保護されたエンクレーブを使用する DDL ステートメント

次の種類のデータ定義言語 (DDL) ステートメントを使用するときは、セキュリティで保護されたエンクレーブが必要です。

セキュリティで保護されたエンクレーブを使用する DML ステートメント

ランダム化された暗号化を使用するエンクレーブ対応列に対して次のデータ操作言語 (DML) ステートメントまたはクエリを使用するには、セキュリティで保護されたエンクレーブが必要です。

Note

エンクレーブを使用するインデックスおよび機密 DML クエリに対する操作は、ランダム化された暗号化を使用するエンクレーブ対応列でのみサポートされます。 決定論的な暗号化はサポートされていません。

データベースの互換性レベルを SQL Server 2022 (160) 以上に設定する必要があります。

Azure SQL Database および SQL Server 2022 (16.x) では、文字列型の列 (charnchar) に対してエンクレーブを使用する秘密クエリを実行するには、列でバイナリ コード ポイント (_BIN2) 照合順序または UTF-8 照合順序が使用されている必要があります。 SQL Server 2019 (15.x) では、_BIN2 照合順序が必要です。

セキュリティで保護されたエンクレーブを使用する DBCC コマンド

ランダム化された暗号化を使用するエンクレーブ対応列のインデックスがデータベースに含まれている場合は、インデックスの整合性のチェックを伴う DBCC (Transact-SQL) の管理コマンドでも、セキュリティで保護されたエンクレーブが必要になることがあります。 たとえば、DBCC CHECKDB (Transact-SQL)DBCC CHECKTABLE (Transact-SQL) などです。

セキュリティで保護されたエンクレーブを使用してステートメントを実行するための前提条件

セキュリティで保護されたエンクレーブを使用するステートメントの実行をサポートするには、環境で次の要件が満たされている必要があります。

  • SQL Server インスタンス、または Azure SQL Database 内のデータベース サーバーは、エンクレーブと構成証明をサポートするように正しく構成されている必要があります。 詳細については、「セキュリティで保護されたエンクレーブと構成証明を設定する」を参照してください。

  • アプリケーションまたはツール (SQL Server Management Studio など) からデータベースに接続する場合は、次の操作を行ってください。

    • セキュリティで保護されたエンクレーブがある Always Encrypted をサポートするクライアント ドライバーのバージョンまたはツール バージョンを使用します。

      • セキュリティで保護されたエンクレーブを使用する Always Encrypted をサポートするクライアント ドライバーの詳細については、「Always Encrypted を使用したアプリケーションの開発」を参照してください。
      • セキュリティで保護されたエンクレーブを使用して Always Encrypted をサポートするツールについては、次のセクションを参照してください。
    • データベース接続に対して Always Encrypted を有効にします。

    • 構成証明プロトコルを指定します。これは、エンクレーブ クエリを送信する前にアプリケーションまたはツールがエンクレーブを構成証明する必要があるかどうか、および使用する構成証明サービスを決定します。 ほとんどのツールとドライバーでは、次の構成証明プロトコルがサポートされています。

      • Microsoft Azure Attestation - Microsoft Azure Attestation を使用して認証を強制します。
      • ホスト ガーディアン サービス - ホスト ガーディアン サービスを使用して構成証明を適用します。
      • なし - 構成証明なしでエンクレーブを使用できます。

      次の表は、特定の SQL 製品とエンクレーブ テクノロジに対して有効な構成証明プロトコルを示しています。

      Product エンクレーブ テクノロジ サポートされている構成証明プロトコル
      SQL Server 2019 (15.x) 以降 VBS エンクレーブ ホスト ガーディアン サービス、なし
      Azure SQL Database SGX エンクレーブ (DC シリーズ データベース内) Microsoft Azure Attestation
      Azure SQL Database VBS エンクレーブ なし
  • 構成証明を使用している場合は、環境に対して有効な構成証明 URL を指定します。

SSMS でエンクレーブを使用して T-SQL ステートメントを実行するための前提条件

最新バージョンの SQL Server Management Studio (SSMS) をダウンロードします。

Always Encrypted と構成証明パラメーターが正しく構成された接続を使用するクエリ ウィンドウからステートメントを実行していることを確認してください。

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

  2. [オプション]>> を選択し、[接続プロパティ] タブを選択します。データベース名を指定します。

  3. [Always Encrypted] タブを選択します。

  4. [Always Encrypted を有効にする]を選択します。

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

  6. プロトコル を以下に設定

    1. ホスト ガーディアン サービス (SQL Server を使用している場合)。
    2. Microsoft Azure Attestation (Intel SGX エンクレーブで Azure SQL Database を使用している場合)
    3. なし (VBS エンクレーブで Azure SQL Database を使用している場合)
  7. エンクレーブ構成証明 URL を指定します。 [プロトコル] が [なし] に設定されている場合は適用されません。 たとえば、https://hgs.bastion.local/Attestation または https://contososqlattestation.uks.attest.azure.net/attest/SgxEnclave です。

    SSMS を使用して、構成証明を指定してサーバーに接続する

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

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

詳細については、「データベース接続での Always Encrypted の有効化と無効化」を参照してください。

Azure Data Studio でエンクレーブを使用して T-SQL ステートメントを実行するための前提条件

推奨される最小バージョンは 1.23 以降です。 Always Encrypted が有効になっていて、正しい構成証明プロトコルと構成証明 URL の両方が構成されている接続を使用するクエリ ウィンドウから、ステートメントを実行してください。

  1. [接続] ダイアログで、[詳細設定] を選択します。

  2. 接続に対して Always Encrypted を有効にするには、[Always Encrypted] フィールドを [有効] に設定します。

  3. セキュリティで保護されたエンクレーブを有効にするには、[セキュリティで保護されたエンクレーブ] フィールドを [有効] に設定します。

  4. 構成証明プロトコルと構成証明 URL を指定します。

    • SQL Server を使用している場合は、構成証明プロトコルホスト ガーディアン サービスに設定し、ホスト ガーディアン サービスの構成証明 URL を [エンクレーブ構成証明 URL] フィールドに入力します。
    • Azure SQL Database で Intel SGX を備えた DC シリーズ データベースを使用している場合は、[構成証明プロトコル][Azure Attestation] に設定し、Microsoft Azure Attestation でポリシーを参照する構成証明 URL を [エンクレーブ構成証明 URL] フィールドに入力します。
    • Azure SQL Database で VBS エンクレーブが有効になっているデータベースを使用している場合は、構成証明プロトコル[なし] に設定します。

    Azure Data Studio を使用し、構成証明を指定してサーバーに接続する

  5. [OK] を選択して [詳細プロパティ] を閉じます。

詳細については、「データベース接続での Always Encrypted の有効化と無効化」を参照してください。

パラメーター化された DML クエリを実行する場合は、Always Encrypted に対してパラメーター化を有効にする必要もあります。

このセクションには、エンクレーブを使用する DML クエリの例が含まれます。

例では次のスキーマを使用します。

CREATE SCHEMA [HR];
GO

CREATE TABLE [HR].[Jobs](
 [JobID] [int] IDENTITY(1,1) PRIMARY KEY,
 [JobTitle] [nvarchar](50) NOT NULL,
 [MinSalary] [money] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
 [MaxSalary] [money] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL
);
GO

CREATE TABLE [HR].[Employees](
 [EmployeeID] [int] IDENTITY(1,1) PRIMARY KEY,
 [SSN] [char](11) ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
 [FirstName] [nvarchar](50) NOT NULL,
 [LastName] [nvarchar](50) NOT NULL,
 [Salary] [money] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
 [JobID] [int] NULL,
 FOREIGN KEY (JobID) REFERENCES [HR].[Jobs] (JobID)
);
GO

次のクエリでは、暗号化された SSN 文字列型の列に対して完全一致検索を実行します。

DECLARE @SSN char(11) = '795-73-9838';
SELECT * FROM [HR].[Employees] WHERE [SSN] = @SSN;
GO

次のクエリでは、暗号化された SSN 文字列型の列に対してパターン マッチング検索を実行し、社会保障番号の数字の末尾が指定したものである従業員を検索します。

DECLARE @SSN char(11) = '795-73-9838';
SELECT * FROM [HR].[Employees] WHERE [SSN] = @SSN;
GO

範囲比較

次のクエリでは、暗号化された Salary 列に対して範囲比較を実行し、給与が指定した範囲内である従業員を検索します。

DECLARE @MinSalary money = 40000;
DECLARE @MaxSalary money = 45000;
SELECT * FROM [HR].[Employees] WHERE [Salary] > @MinSalary AND [Salary] < @MaxSalary;
GO

結合

次のクエリでは、暗号化された Salary 列を使用して、Employees テーブルと Jobs テーブルの間の結合を実行します。 このクエリにより、従業員の職務の給与範囲外の給与を受け取っている従業員が取得されます。

SELECT * FROM [HR].[Employees] e
JOIN [HR].[Jobs] j
ON e.[JobID] = j.[JobID] AND e.[Salary] > j.[MaxSalary] OR e.[Salary] < j.[MinSalary];
GO

並べ替え

次のクエリでは、暗号化された Salary 列に基づいて従業員レコードが並べ替えられて、給与が最高の 10 人の従業員が取得されます。

Note

暗号化された列の並べ替えは、SQL Server 2022 (16.x) と Azure SQL Database ではサポートされていますが、SQL Server 2019 (15.x) ではサポートされていません。

SELECT TOP(10) * FROM [HR].[Employees]
ORDER BY [Salary] DESC;
GO

次のステップ

関連項目