Transact-SQL を使用してインプレースでの列の暗号化を構成する
適用対象: SQL Server 2019 (15.x) 以降 - Windows のみ Azure SQL データベース
この記事では、セキュリティで保護されたエンクレーブが設定された Always Encrypted と ALTER TABLE/ALTER COLUMN
ステートメントを使用して、列に対する暗号化操作をインプレースで実行する方法について説明します。 インプレース暗号化および一般的な前提条件に関する基本的な情報については、「セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用して列の暗号化をインプレースで構成する」をご覧ください。
ALTER TABLE
または ALTER COLUMN
ステートメントを使うと、列のターゲット暗号化構成を設定できます。 ステートメントを実行すると、ステートメントの列定義で指定されている現在およびターゲットの暗号化構成に応じて、サーバー側のセキュリティで保護されたエンクレーブにより、列に格納されているデータの暗号化、再暗号化、暗号化解除が行われます。
- 列が現在暗号化されていない場合は、列の定義で
ENCRYPTED WITH
句を指定すると、暗号化が行われます。 - 列が現在暗号化されている場合は、列の定義で
ENCRYPTED WITH
句を指定しないと、暗号化解除 (プレーンテキスト列への変換) が行われます。 - 列が現在暗号化されている場合、
ENCRYPTED WITH
句を指定し、指定した列の暗号化の種類または列の暗号化キーが、現在使用されている暗号化の種類または列の暗号化キーと異なる場合は、再暗号化が行われます。
Note
列を NULL
または NOT NULL
に変更したり、照合順序を変更したりする場合を除き、暗号化操作と他の変更を 1 つの ALTER TABLE
/ALTER COLUMN
ステートメントで組み合わせることはできません。 たとえば、1 つの ALTER TABLE
/ALTER COLUMN
Transact-SQL ステートメントで、列の暗号化と、列のデータ型の変更を、同時に行うことはできません。 2 つの異なるステートメントを使用します。
サーバー側のセキュリティで保護されたエンクレーブを使用する他のクエリと同様、インプレース暗号化をトリガーする ALTER TABLE
/ALTER COLUMN
ステートメントは、Always Encrypted とエンクレーブ計算が有効になっている接続を通して送信する必要があります。
この記事の残りの部分では、SQL Server Management Studio から ALTER TABLE
/ALTER COLUMN
ステートメントを使用して、インプレース暗号化をトリガーする方法について説明します。 または、Azure Data Studio やアプリケーションから ALTER TABLE
/ALTER COLUMN
を発行することもできます。
Note
現在、SqlServer PowerShell モジュールの Invoke-Sqlcmd コマンドレットや sqlcmd では、インプレース暗号化操作に対する ALTER TABLE
/ALTER COLUMN
の使用はサポートされていません。
SSMS で Transact-SQL を使用してインプレース暗号化を実行する
前提条件
- 「セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用して列の暗号化をインプレースで構成する」で説明されている前提条件。
- SQL Server Management Studio (SSMS) の最新の一般提供 (GA) バージョンをダウンロードします。
手順
データベース接続で Always Encrypted とエンクレーブ計算を有効にしてクエリ ウィンドウを開きます。 詳しくは、「 データベース接続での Always Encrypted の有効化と無効化」をご覧ください。
クエリ ウィンドウで、暗号化、暗号化解除または再暗号化する列のターゲット暗号化構成を指定して、
ALTER TABLE
/ALTER COLUMN
ステートメントを実行します。 列を暗号化または再暗号化する場合は、ENCRYPTED WITH
句を使用します。 列が文字列型の列 (char
、varchar
、nchar
、nvarchar
など) の場合は、照合順序を BIN2 の照合順序に変更する必要があります。Note
列マスター キーが Azure Key Vault に格納されている場合は、Azure にサインインするように求められることがあります。
テーブルにアクセスするすべてのバッチおよびストアド プロシージャのプラン キャッシュをクリアして、パラメーター暗号化情報を更新します。
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
Note
影響を受けたクエリのプランをキャッシュから削除しないと、暗号化後のクエリの最初の実行が失敗する可能性があります。
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE
またはDBCC FREEPROCCACHE
を使用してプランのキャッシュをクリアするときは、クエリのパフォーマンスが一時的に低下する可能性があるため、慎重に行ってください。 キャッシュのクリアによる悪影響を最小限に抑えるため、影響を受けるクエリのプランのみを選択して削除することができます。sp_refresh_parameter_encryption を呼び出し、sys.parameters に保存されていて、列の暗号化によって無効にされた可能性のある各モジュール (ストアド プロシージャ、関数、ビュー、トリガー) のパラメーターのメタデータを更新します。
例
インプレースでの列の暗号化
以下の例の前提:
CEK1
は、エンクレーブ対応の列暗号化キーです。SSN
列はプレーンテキストであり、現在は既定のデータベース照合順序 (Latin1 で BIN2 以外の照合順序など) を使用しています (たとえば、Latin1_General_CI_AI_KS_WS
)。
このステートメントは、決定論的暗号化とエンクレーブ対応の SSN
列暗号化キーをインプレースで使用して列を暗号化します。 また、既定のデータベースの照合順序は、(同じコード ページ内の) 対応する BIN2 の照合順序で上書きされます。
その操作はオンラインで実行されます (ONLINE = ON
)。 また、クエリのプランを再作成する ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE
の呼び出しは、テーブル スキーマの変更によって影響を受けることに注意してください。
ALTER TABLE [dbo].[Employees]
ALTER COLUMN [SSN] [char](11) COLLATE Latin1_General_BIN2
ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL
WITH
(ONLINE = ON);
GO
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
GO
インプレースで列を再暗号化して暗号化の種類を変更する
以下の例の前提:
SSN
列は、決定論的暗号化と、エンクレーブ対応の列暗号化キーCEK1
を使用して暗号化されています。- 列レベルで設定されている現在の照合順序は
Latin1_General_BIN2
です。
次のステートメントでは、ランダム化された暗号化と同じキー (CEK1
) を使用して、列が再暗号化されます
ALTER TABLE [dbo].[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;
GO
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
GO
インプレースで列を再暗号化して列暗号化キーをローテーションする
以下の例の前提:
SSN
列は、ランダム化された暗号化と、エンクレーブ対応の列暗号化キーCEK1
を使用して暗号化されています。CEK2
は、エンクレーブ対応の (CEK1
とは異なる) 列暗号化キーです。- 列レベルで設定されている現在の照合順序は
Latin1_General_BIN2
です。
次のステートメントでは、CEK2
を使用して列が再暗号化されます。
ALTER TABLE [dbo].[Employees]
ALTER COLUMN [SSN] [char](11) COLLATE Latin1_General_BIN2
ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK2]
, ENCRYPTION_TYPE = Randomized
, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL;
GO
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
GO
列をインプレースで復号化する
以下の例の前提:
SSN
列は、エンクレーブ対応の列暗号化キーを使用して暗号化されています。- 列レベルで設定されている現在の照合順序は
Latin1_General_BIN2
です。
以下のステートメントの場合、列の暗号化を解除し、照合順序を変更せずに保持します。 照合順序を変更することもできます。 たとえば、同じステートメントで照合順序をBIN2 以外の照合順序に変更します。
ALTER TABLE [dbo].[Employees]
ALTER COLUMN [SSN] [char](11) COLLATE Latin1_General_BIN2
WITH (ONLINE = ON);
GO
ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
GO
次のステップ
- セキュリティで保護されたエンクレーブを使用して Transact-SQL ステートメントを実行する
- セキュリティで保護されたエンクレーブ列が設定された Always Encrypted でのインデックスの作成と使用
- セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用するアプリケーションを開発する