適用対象:Windows
Azure SQL Database の SQL Server 2019 (15.x) 以降のバージョン
セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用すると、一部の Transact-SQL (T-SQL) ステートメントで、サーバー側のセキュリティで保護されたエンクレーブ内にある暗号化されたデータベース列に対して機密計算を実行できます。
セキュア エンクレーブを使用するステートメント
次の種類の T-SQL ステートメントで、セキュリティで保護されたエンクレーブが利用されます。
セキュア エンクレーブを使用する DDL ステートメント
次の種類のデータ定義言語 (DDL) ステートメントを使用するときは、セキュリティで保護されたエンクレーブが必要です。
- ALTER TABLE column_definition ステートメント。これは、エンクレーブ対応キーを使用してインプレースの暗号化操作をトリガーします。 詳細については、「セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用して列の暗号化をインプレースで構成する」を参照してください。
- CREATE INDEX と ALTER INDEX ランダム化暗号化を使用してエンクレーブ対応列に対するインデックスを作成または変更するステートメント 詳細については、「セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用する列でインデックスを作成して使用する」を参照してください。
セキュリティで保護されたエンクレーブを使用する DML ステートメント
ランダム化された暗号化を使用するエンクレーブ対応列に対して次のデータ操作言語 (DML) ステートメントまたはクエリを使用するには、セキュリティで保護されたエンクレーブが必要です。
- セキュリティで保護されたエンクレーブ内でサポートされている次の Transact-SQL 演算子の 1 つ以上を使用するクエリ:
- 比較演算子
- BETWEEN
- IN
- LIKE
- DISTINCT
- 結合 - SQL Server 2019 (15.x) では、入れ子になったループ結合のみがサポートされます。 SQL Server 2022 (16.x) と Azure SQL Database では、入れ子になったループ、ハッシュ、マージ結合がサポートされています
- SELECT - ORDER BY clase。 SQL Server 2022 (16.x) と Azure SQL Database でサポート対象 SQL Server 2019 (15.x) ではサポートされていません
- SELECT - GROUP BY clase。 SQL Server 2022 (16.x) と Azure SQL Database でサポート対象 SQL Server 2019 (15.x) ではサポートされていません
- 行を挿入、更新、または削除するクエリ。これにより、エンクレーブ対応列のインデックスのインデックス キーの挿入または削除がトリガーされます。 詳細については、「セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用する列でインデックスを作成して使用する」を参照してください。
注
エンクレーブを使用するインデックスおよび機密 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 管理コマンドでも、セキュリティで保護されたエンクレーブが必要になる場合があります。 たとえば、 DBCC CHECKDB と DBCC CHECKTABLE です。
セキュリティで保護されたエンクレーブを使用してステートメントを実行するための前提条件
セキュリティで保護されたエンクレーブを使用するステートメントの実行をサポートするには、環境で次の要件が満たされている必要があります。
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 を使用して認証を強制します。
- Host Guardian Service - Host Guardian Service を使用して、構成証明を適用します。
- なし - 認証報告なしでエンクレーブの使用を許可します。
次の表は、特定の SQL 製品とエンクレーブ テクノロジに対して有効な構成証明プロトコルを示しています。
製品 エンクレーブ テクノロジ 対応しているアテステーション プロトコル SQL Server 2019 (15.x) 以降 VBS エンクレーブ ホスト ガーディアン サービス、なし Azure SQL Database SGX エンクレーブ (DC シリーズ データベース内) マイクロソフト Azure 証明 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 の有効化と無効化」を参照してください。
例
このセクションには、エンクレーブを使用する 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)
);
完全一致検索
次のクエリでは、暗号化された SSN 文字列型の列に対して完全一致検索を実行します。
DECLARE @SSN AS CHAR (11) = '795-73-9838';
SELECT *
FROM [HR].[Employees]
WHERE [SSN] = @SSN;
パターン マッチング検索
次のクエリでは、暗号化された SSN 文字列型の列に対してパターン マッチング検索を実行し、社会保障番号の数字の末尾が指定したものである従業員を検索します。
DECLARE @SSN AS CHAR (11) = '795-73-9838';
SELECT *
FROM [HR].[Employees]
WHERE [SSN] = @SSN;
範囲比較
次のクエリでは、暗号化された Salary 列に対して範囲比較を実行し、給与が指定した範囲内である従業員を検索します。
DECLARE @MinSalary AS MONEY = 40000;
DECLARE @MaxSalary AS MONEY = 45000;
SELECT *
FROM [HR].[Employees]
WHERE [Salary] > @MinSalary
AND [Salary] < @MaxSalary;
結合
次のクエリでは、暗号化された Employees 列を使用して、Jobs テーブルと Salary テーブルの間の結合を実行します。 このクエリにより、従業員の職務の給与範囲外の給与を受け取っている従業員が取得されます。
SELECT *
FROM [HR].[Employees] AS e
INNER JOIN [HR].[Jobs] AS j
ON e.[JobID] = j.[JobID]
AND e.[Salary] > j.[MaxSalary]
OR e.[Salary] < j.[MinSalary];
並べ替え
次のクエリでは、暗号化された Salary 列に基づいて従業員レコードが並べ替えられて、給与が最高の 10 人の従業員が取得されます。
注
暗号化された列の並べ替えは、SQL Server 2022 (16.x) と Azure SQL Database ではサポートされていますが、SQL Server 2019 (15.x) ではサポートされていません。
SELECT TOP (10) *
FROM [HR].[Employees]
ORDER BY [Salary] DESC;