Always Encrypted を使用した暗号化データの列への一括読み込み
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance
一括コピー操作中にサーバーでメタデータ チェックを実行せずに暗号化されたデータを読み込むには、 ALLOW_ENCRYPTED_VALUE_MODIFICATIONS オプションを指定してユーザーを作成します。 このオプションは、Always Encrypted を使用できないレガシ ツールまたはサードパーティの ETL (Extract-Transform-Load) ワークフローで使用するためのものです。 これにより、ユーザーは、暗号化された列を含むあるテーブル セットから、暗号化された列を含む別のテーブル セット (同じデータベースまたは別のデータベース内) に、暗号化されたデータを安全に移動できます。
ALLOW_ENCRYPTED_VALUE_MODIFICATIONS オプション
CREATE USER と ALTER USER の両方に ALLOW_ENCRYPTED_VALUE_MODIFICATIONS オプションがあります。 このオプションを ON に設定すると (既定値は OFF)、一括コピー操作でサーバーに対する暗号化メタデータ チェックが抑制されます。これにより、ユーザーはデータの暗号化を解除せずにテーブルまたはデータベース間で暗号化されたデータの一括コピーを行うことができます。
データの移行シナリオ
次の表では、いくつかの移行シナリオに適した推奨設定を示しています。
暗号化されたデータの一括読み込み
次のプロセスを使用して、暗号化されたデータを読み込みます。
- 一括コピー操作の対象となるデータベース内のユーザーに対して、オプションを ON に設定します。 次に例を示します:
ALTER USER Bob WITH ALLOW_ENCRYPTED_VALUE_MODIFICATIONS = ON;
そのユーザーとして接続して、一括コピー アプリケーションまたはツールを実行します。 (アプリケーションが Always Encrypted を有効にしたクライアント・ドライバを使用している場合は、暗号化された列から取得したデータが暗号化されたままであることを保証するために、データソースの接続文字列に列の暗号化設定=enabled が含まれていないことを確認してください。詳細については、「Always Encrypted を使用するアプリケーションの開発」を参照してください。)
ALLOW_ENCRYPTED_VALUE_MODIFICATIONS オプションを OFF に戻します。 次に例を示します:
ALTER USER Bob WITH ALLOW_ENCRYPTED_VALUE_MODIFICATIONS = OFF;
データ破損の可能性
このオプションを不適切に使用すると、データが破損する場合があります。 ALLOW_ENCRYPTED_VALUE_MODIFICATIONS オプションでは、ユーザーはデータベース内の暗号化された列に任意のデータを挿入することができます。これには、さまざまなキーで暗号化されたデータ、適切に暗号化されていないか、まったく暗号化されていないデータが含まれます。 ユーザーが、対象列に設定されている暗号化スキーム (列暗号化キー、アルゴリズム、暗号化の種類) を使用して適切に暗号化されていないデータを誤ってコピーした場合、データの暗号化を解除することはできません (データが破損します)。 このオプションは、データベース内のデータが破損する場合があるため、慎重に使用する必要があります。
次のシナリオでは、データが破損する可能性のあるデータの不適切なインポートについて説明します:
あるユーザーに対して、オプションを ON に設定します。
このユーザーは、データベースに接続されているアプリケーションを実行します。 アプリケーションは一括 API を使用して、暗号化された列にプレーン テキスト値を挿入します。 アプリケーションには、挿入時にデータを暗号化するために Always Encrypted が有効なクライアント ドライバーが必要です。 しかし、アプリケーションが正しく構成されていないため、結局、Always Encrypted をサポートしていないドライバー、または column encryption setting=enabledが含まれていない接続文字列が使用されます。
アプリケーションはプレーンテキスト値をサーバーに送信します。 暗号化メタデータ チェックがユーザーのサーバーでは無効になっているため、サーバーでは不適切なデータ (適切に暗号化された暗号化テキストではなくプレーンテキスト) を暗号化された列に挿入することができます。
同じアプリケーションまたは別のアプリケーションは、Always Encrypted が有効なドライバーを使用し、接続文字列で column encryption setting=enabled を指定してデータベースに接続し、データを取得します。 アプリケーションは、透過的にデータの暗号化が解除されることを期待します。 しかし、データが不適切な暗号化テキストであるため、ドライバーはデータの暗号化を解除できません。
ベスト プラクティス
長時間実行のワークロードの場合は、このオプションを使用して指定されたユーザー アカウントを使用します。
暗号化されたデータの暗号化を解除せずに移動する必要がある、短時間実行の一括コピー アプリケーションまたはツールの場合は、アプリケーションを実行する直前にオプションを ON に設定し、操作の実行直後に OFF に戻します。
新しいアプリケーションの開発には、このオプションを使用しないでください。 代わりに、単一セッションに対して暗号化メタデータ チェックを抑制するための API が提供されているクライアント ドライバーを使用します (たとえば、SQL Server 用の .NET Framework Data Provider での AllowEncryptedValueModifications オプションなど)。「SqlBulkCopy を使用して暗号化されたデータをコピーする」を参照してください。