Transact-SQL を使用してインプレースでの列の暗号化を構成する

適用対象: SQL Server 2019 (15.x) 以降 - Windows のみ Azure SQL Database

この記事では、セキュリティで保護されたエンクレーブが設定された Always Encrypted と ALTER TABLE/ALTER COLUMN ステートメントを使用して、列に対する暗号化操作をインプレースで実行する方法について説明します。 インプレース暗号化および一般的な前提条件に関する基本的な情報については、「セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用して列の暗号化をインプレースで構成する」をご覧ください。

ALTER TABLE または ALTER COLUMN ステートメントを使うと、列のターゲット暗号化構成を設定できます。 ステートメントを実行すると、ステートメントの列定義で指定されている現在およびターゲットの暗号化構成に応じて、サーバー側のセキュリティで保護されたエンクレーブにより、列に格納されているデータの暗号化、再暗号化、暗号化解除が行われます。

  • 列が現在暗号化されていない場合は、列の定義で ENCRYPTED WITH 句を指定すると、暗号化が行われます。
  • 列が現在暗号化されている場合は、列の定義で ENCRYPTED WITH 句を指定しないと、暗号化解除 (プレーンテキスト列への変換) が行われます。
  • 列が現在暗号化されている場合、ENCRYPTED WITH 句を指定し、指定した列の暗号化の種類または列の暗号化キーが、現在使用されている暗号化の種類または列の暗号化キーと異なる場合は、再暗号化が行われます。

注意

列を 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 を発行することもできます。

注意

現在、SqlServer PowerShell モジュールの Invoke-Sqlcmd コマンドレットや sqlcmd では、インプレース暗号化操作に対する ALTER TABLE/ALTER COLUMN の使用はサポートされていません。

SSMS で Transact-SQL を使用してインプレース暗号化を実行する

前提条件

手順

  1. データベース接続で Always Encrypted とエンクレーブ計算を有効にしてクエリ ウィンドウを開きます。 詳しくは、「 データベース接続での Always Encrypted の有効化と無効化」をご覧ください。

  2. クエリ ウィンドウで、暗号化、暗号化解除または再暗号化する列のターゲット暗号化構成を指定して、ALTER TABLE/ALTER COLUMN ステートメントを実行します。 列を暗号化または再暗号化する場合は、ENCRYPTED WITH 句を使用します。 列が文字列型の列 (charvarcharncharnvarchar など) の場合は、照合順序を BIN2 の照合順序に変更する必要があります。

    注意

    列マスター キーが Azure Key Vault に格納されている場合は、Azure にサインインするように求められることがあります。

  3. テーブルにアクセスするすべてのバッチおよびストアド プロシージャのプラン キャッシュをクリアして、パラメーター暗号化情報を更新します。

    ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
    

    注意

    影響を受けたクエリのプランをキャッシュから削除しないと、暗号化後のクエリの最初の実行が失敗する可能性があります。

    ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE または DBCC FREEPROCCACHE を使用してプランのキャッシュをクリアするときは、クエリのパフォーマンスが一時的に低下する可能性があるため、慎重に行ってください。 キャッシュのクリアによる悪影響を最小限に抑えるため、影響を受けるクエリのプランのみを選択して削除することができます。

  4. 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

次のステップ

関連項目