セキュリティで保護されたエンクレーブを使用して Transact-SQL ステートメントを実行する
適用対象: SQL Server 2019 (15.x) 以降 - Windows のみ Azure SQL データベース
セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用すると、一部の Transact-SQL (T-SQL) ステートメントで、サーバー側のセキュリティで保護されたエンクレーブ内にある暗号化されたデータベース列に対して機密計算を実行できます。
セキュリティで保護されたエンクレーブを使用するステートメント
次の種類の T-SQL ステートメントで、セキュリティで保護されたエンクレーブが利用されます。
セキュリティで保護されたエンクレーブを使用する DDL ステートメント
次の種類のデータ定義言語 (DDL) ステートメントを使用するときは、セキュリティで保護されたエンクレーブが必要です。
- エンクレーブ対応キーを使用するインプレース暗号化操作をトリガーする ALTER TABLE column_definition (Transact-SQL) ステートメント。 詳細については、「セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用して列の暗号化をインプレースで構成する」を参照してください。
- ランダム化された暗号化を使用してエンクレーブ対応列のインデックスを作成または変更する CREATE INDEX (Transact-SQL) および ALTER INDEX (Transact-SQL) ステートメント。 詳細については、「セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用する列でインデックスを作成して使用する」を参照してください。
セキュリティで保護されたエンクレーブを使用する DML ステートメント
ランダム化された暗号化を使用するエンクレーブ対応列に対して次のデータ操作言語 (DML) ステートメントまたはクエリを使用するには、セキュリティで保護されたエンクレーブが必要です。
- セキュリティで保護されたエンクレーブ内でサポートされている次の Transact-SQL 演算子の 1 つ以上を使用するクエリ:
- 比較演算子
- BETWEEN (Transact-SQL)
- IN (Transact-SQL)
- LIKE (Transact-SQL)
- DISTINCT
- 結合 - SQL Server 2019 (15.x) では、入れ子になったループ結合のみがサポートされます。 SQL Server 2022 (16.x) と Azure SQL Database では、入れ子になったループ、ハッシュ、マージ結合がサポートされています
- SELECT - ORDER BY 句 (Transact-SQL) SQL Server 2022 (16.x) と Azure SQL Database でサポート対象 SQL Server 2019 (15.x) ではサポートされていません
- SELECT - GROUP BY 句 (Transact-SQL). SQL Server 2022 (16.x) と Azure SQL Database でサポート対象 SQL Server 2019 (15.x) ではサポートされていません
- 行を挿入、更新、または削除するクエリ。これにより、エンクレーブ対応列のインデックスのインデックス キーの挿入または削除がトリガーされます。 詳細については、「セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用する列でインデックスを作成して使用する」を参照してください。
Note
エンクレーブを使用するインデックスおよび機密 DML クエリに対する操作は、ランダム化された暗号化を使用するエンクレーブ対応列でのみサポートされます。 決定論的な暗号化はサポートされていません。
データベースの互換性レベルを SQL Server 2022 (160) 以上に設定する必要があります。
Azure SQL Database および SQL Server 2022 (16.x) では、文字列型の列 (char
、nchar
) に対してエンクレーブを使用する秘密クエリを実行するには、列でバイナリ コード ポイント (_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 を指定します。
- SQL Server とホスト ガーディアン サービス (HGS) を使用している場合は、「HGS 構成証明 URL を確認して共有する」を参照してください。
- Azure SQL Database と Intel SGX エンクレーブおよび Microsoft Azure Attestation を使用している場合は、「構成証明ポリシーの構成証明 URL を確認する」を参照してください。
SSMS でエンクレーブを使用して T-SQL ステートメントを実行するための前提条件
最新バージョンの SQL Server Management Studio (SSMS) をダウンロードします。
Always Encrypted と構成証明パラメーターが正しく構成された接続を使用するクエリ ウィンドウからステートメントを実行していることを確認してください。
[サーバーへの接続] ダイアログで、サーバーの名前を指定し、認証方法を選択して、資格情報を指定します。
[オプション]>> を選択し、[接続プロパティ] タブを選択します。データベース名を指定します。
[Always Encrypted] タブを選択します。
[Always Encrypted を有効にする]を選択します。
[Enable secure enclaves] (セキュリティで保護されたエンクレーブを有効にする) を選択します。
プロトコル を以下に設定
- ホスト ガーディアン サービス (SQL Server を使用している場合)。
- Microsoft Azure Attestation (Intel SGX エンクレーブで Azure SQL Database を使用している場合)
- なし (VBS エンクレーブで Azure SQL Database を使用している場合)
エンクレーブ構成証明 URL を指定します。 [プロトコル] が [なし] に設定されている場合は適用されません。 たとえば、
https://hgs.bastion.local/Attestation
またはhttps://contososqlattestation.uks.attest.azure.net/attest/SgxEnclave
です。[接続] を選択します。
Always Encrypted クエリのパラメーター化を有効にするよう求められたら、 [有効] を選択します。
詳細については、「データベース接続での Always Encrypted の有効化と無効化」を参照してください。
Azure Data Studio でエンクレーブを使用して T-SQL ステートメントを実行するための前提条件
推奨される最小バージョンは 1.23 以降です。 Always Encrypted が有効になっていて、正しい構成証明プロトコルと構成証明 URL の両方が構成されている接続を使用するクエリ ウィンドウから、ステートメントを実行してください。
[接続] ダイアログで、[詳細設定] を選択します。
接続に対して Always Encrypted を有効にするには、[Always Encrypted] フィールドを [有効] に設定します。
セキュリティで保護されたエンクレーブを有効にするには、[セキュリティで保護されたエンクレーブ] フィールドを [有効] に設定します。
構成証明プロトコルと構成証明 URL を指定します。
- SQL Server を使用している場合は、構成証明プロトコルをホスト ガーディアン サービスに設定し、ホスト ガーディアン サービスの構成証明 URL を [エンクレーブ構成証明 URL] フィールドに入力します。
- Azure SQL Database で Intel SGX を備えた DC シリーズ データベースを使用している場合は、[構成証明プロトコル]を [Azure Attestation] に設定し、Microsoft Azure Attestation でポリシーを参照する構成証明 URL を [エンクレーブ構成証明 URL] フィールドに入力します。
- Azure SQL Database で VBS エンクレーブが有効になっているデータベースを使用している場合は、構成証明プロトコルを [なし] に設定します。
[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