Always Encrypted

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Diagram of Always Encrypted.

Always Encrypted は、Azure SQL Database、Azure SQL Managed Instance や SQL Server データベースに格納された、クレジット カード番号や国民識別番号 (米国の社会保障番号など) のような機微なデータを保護することを目的とした機能です。 Always Encrypted では、クライアント内部で機密データが暗号化されるため、暗号化キーがデータベース エンジンに公開されることはありません。 これにより、データを所有し、それを表示できるユーザーと、データを管理するがアクセス権を持たないユーザー (オンプレミスのデータベース管理者、クラウド データベース オペレーター、またはその他の高い特権を持つ未承認のユーザー) が分離されます。 結果として、Always Encrypted を使用すると、顧客は自信を持って機密データをクラウドに格納し、悪意のある内部関係者によるデータ盗難の可能性を減らすことができます。

Always Encrypted は、暗号化されたデータ (等価比較を伴うクエリ) に対する制限付き機密クエリをサポートするように構成できます。 たとえば、ポイント参照検索や等値結合などです。 このようなクエリでは、決定論的な暗号化が利用されます。

Note

セキュア エンクレーブは、セキュリティで保護されたエンクレーブのパターン マッチング、他の比較演算子、およびインプレース暗号化により、Always Encrypted の機密コンピューティング機能が拡張されます。 詳細については、「セキュア エンクレーブを使用する Always Encrypted」を参照してください。

Always Encrypted は、アプリケーションに対して暗号化を透過的に実行します。 クライアント コンピューターにインストールされている、Always Encrypted が有効のドライバーは、クライアント アプリケーション内の機微なデータを自動的に暗号化および暗号化解除することで、この処理を実行します。 ドライバーは、 データベース エンジンにデータを渡す前に機微な列のデータを暗号化し、アプリケーションに対するセマンティクスが維持されるように自動的にクエリを書き換えます。 また、暗号化されたデータベース列に格納され、クエリ結果に含まれているデータを、同じように透過的に暗号化解除します。

Always Encrypted の構成

このセクションでは、Always Encrypted の設定の概要について説明します。 詳細と概要については、「チュートリアル: Always Encrypted の概要」を参照してください。

データベースで Always Encrypted を設定するには、次の操作を行う必要があります。

  1. データを保護するための暗号化キーをプロビジョニングします。 Always Encrypted では 2 種類のキーを使用します。

    • 列暗号化キー。
    • 列マスター キー。

    列暗号化キーは、暗号化された列のデータを暗号化するために使用されます。 列マスター キーは、1 つ以上の列暗号化キーを暗号化するキー保護キーです。

    列マスター キーは、Azure Key VaultWindows 証明書ストア、ハードウェア セキュリティ モジュールなど、データベース システムの外部の信頼されたキー ストアに保存する必要があります。

    次に、列暗号化キーをプロビジョニングし、各キーを列マスター キーで暗号化する必要があります。

    最後に、キーに関するメタデータをデータベースに格納する必要があります。

    • 列マスター キーメタデータは、列マスター キーの場所をキャプチャします。
    • 列暗号化キーのメタデータには、列暗号化キーの暗号化された値が含まれています。 データベース エンジンは、いずれの種類も、プレーンテキストで格納または使用しません。

    Always Encrypted キーについて詳しくは、「Always Encrypted のキー管理の概要」をご覧ください。

  2. 保護する機密データを含む選択したデータベース列 の暗号化を構成します。 これには、暗号化された列を含む新しいテーブルの作成や、既存のデータベース列と既存のデータの暗号化が含まれる場合があります。 列の暗号化を設定するときは、暗号化アルゴリズム、列内のデータを保護するための列暗号化キー、および暗号化タイプに関する情報を指定します。 Always Encrypted は、次の 2 つの暗号化タイプをサポートしています。

    • 決定論的な暗号化の場合、任意の指定されたプレーン テキスト値に対して、同じ暗号化された値が常に生成されます。 明確な暗号化を使用すると、暗号化された列で、ポイント参照、等価結合、グループ化、インデックス作成を行うことができます。 ただし、権限のないユーザーが、暗号化された列のパターンを調べることで、暗号化された値に関する情報を推測できる可能性もあります。特に、True/False や、North/South/East/West 地域など、暗号化可能な値セットが小規模である場合は注意が必要です。

    • 暗号化をランダム化 は低い予測可能な方法でデータを暗号化するためのメソッドを使用します。 ランダム化された暗号化は安全性が上がりますが、暗号化された列に対して検索、グループ化、インデックス作成、結合ができなくなります。

    パラメーターの検索またはグループ化に使用される列については、明確な暗号化を使用します。 たとえば、身分登録番号などです。 他のレコードとグループ化されておらず、テーブルの結合に使用されていない信用調査情報などのデータについては、ランダム化された暗号化を使用します。

Always Encrypted による暗号化アルゴリズムの詳細については、「Always Encrypted による暗号」を参照してください。

SQL ツールを使用して、上記の手順を実行できます。

Always Encrypted キーと保護された機密データが平文でデータベース環境に公開されないようにするため、データベース エンジンはキーのプロビジョニングやデータ暗号化、または復号化操作には関与できません。 そのため、Transact-SQL (T-SQL) では、キーのプロビジョニングや暗号化の操作はサポートされません。 同じ理由で、既存のデータを暗号化するか、(異なる暗号化の種類または列暗号化キーを使用して) 再暗号化する必要があります(SQL ツールはそれを自動化できます)。

Note

セキュリティで保護されたエンクレーブが設定された Always Encrypted では、T-SQL を使用して既存のデータに対する暗号化操作を許可することで、上記の制限の一部が解除され、データをデータベースの外部に移動する必要がなくなります。

暗号化された列に対するクエリの仕組み

暗号化されたデータベース列に対してクエリを実行したり、暗号化された列にデータを挿入したり、暗号化された列からプレーンテキスト値を取得したり、決定論的暗号化を使用して列に対してサポートされている操作 (ポイント検索検索など) を実行したりするには、クエリを発行するユーザーまたはアプリケーションが次の前提条件を満たしている必要があります。

  • データを保護する列マスター キーにアクセスできます。 データを含むテーブルで、SELECT などのデータベース レベルのアクセス許可に加えて、キー アクセスが必要です。
  • データベース接続で Always Encrypted を有効にしてデータベースに接続します。 ほとんどの SQL ツールと SQL クライアント ドライバーは、データベース接続に対して Always Encrypted を有効にすることをサポートしています。

Note

ユーザーがデータを読み取るために必要なデータベースアクセス許可を持っていても、データを保護するキーへのアクセス権がない場合でも、ユーザーはデータベース接続で Always Encrypted を有効にせずにデータベースに接続することで、暗号化された (暗号化された) データを取得できます。

暗号化された列に対するクエリのしくみを次に示します。

  1. アプリケーションがパラメーター化されたクエリを発行すると、アプリケーション内の SQL クライアント ドライバーはデータベース エンジンに透過的に接続し (sp_describe_parameter_encryption (Transact-SQL) を呼び出 して、暗号化された列を対象とするパラメーターを決定し、暗号化する必要があります。 暗号化する必要がある各パラメーターについて、ドライバーは暗号化アルゴリズム、暗号化の種類、およびキー メタデータ (暗号化された列暗号化キーと、対応する列マスター キーの場所を含む) を受け取ります。
  2. ドライバーは、暗号化された列暗号化キー値を復号化するために、列マスター キーを含むキー ストアを呼び出します。 以降、同じ列の暗号化キーを使用する際に、キー ストアに対するラウンド トリップ数を軽減するために、結果のプレーンテキスト列暗号化キーはキャッシュされます。
  3. ドライバーは、取得したプレーンテキスト列暗号化キーを使用して、暗号化された列に対応するクエリ パラメーターを暗号化します。
  4. ドライバーは、暗号化された列を対象とするパラメーターのプレーンテキスト値を、暗号化値と置き換え、処理を実行するデータベース エンジンにクエリを送信します。
  5. データベース エンジンはクエリを実行します。これには、決定論的暗号化を使用した列の等価比較が含まれる場合があります。
  6. クエリ結果に暗号化された列のデータが含まれている場合、データベース エンジンは、暗号化アルゴリズム、暗号化の種類、キー メタデータに関する情報を含む各列の暗号化メタデータを結果セットにアタッチします。
  7. データベース エンジンは、結果セットをクライアント アプリケーションに送信します。
  8. 受信した結果セット内の暗号化された列ごとに、ドライバーはまずローカル キャッシュ内で平文の列暗号化キーを見つけようとします。キャッシュ内でキーが見つからない場合にのみ、列マスター キーを保持するキー ストアで検索されます。
  9. ドライバーは結果を復号化し、プレーンテキスト値をアプリケーションに返します。

クライアント ドライバーは、列マスター キー ストア プロバイダーを使用して、列マスター キーを含むキー ストアに接続します。このプロバイダーは、列マスター キーを含むキー ストアをカプセル化するクライアント側ソフトウェア コンポーネントです。 キー ストアの一般的な種類のプロバイダーは、Microsoft からのクライアント側ドライバーのライブラリで、またはスタンドアロンのダウンロードとして入手できます。 独自のプロバイダーを実装することもできます。 組み込みの列マスター キー ストア プロバイダーを含む Always Encrypted の機能は、ドライバー ライブラリとそのバージョンによって異なります。

Always Encrypted をサポートするクライアント ドライバーの一覧と、暗号化された列にクエリを実行するアプリケーションを開発する方法については、「Always Encrypted を使用したアプリケーションの開発」を参照してください。

Azure Data StudioSSMS などの SQL ツールを使用して、暗号化された列のクエリを実行することもできます。

制限事項

暗号化された列に対するクエリには、次の制限事項が適用されます。

  • 等価比較に関連する次の操作が、決定論的な暗号化でサポートされています。他の操作は許可されません。

  • ランダム化された暗号化を使用して暗号化された列に対する計算は許可されません。

    Note

    セキュリティで保護されたエンクレーブを使用した Always Encrypted では、ランダム化された暗号化を使用した列のパターン マッチング、比較演算子、並べ替え、インデックス作成が可能になり、上記の制限が緩和されます。

  • プレーンテキストと暗号化されたデータの両方を含む計算をトリガーするクエリ ステートメントは許可されません。 次に例を示します。

    • 暗号化された列とプレーンテキスト列またはリテラルを比較します。
    • プレーンテキスト列から暗号化された列 (またはその逆の方法で) UPDATEBULK INSERTSELECT INTO、または INSERT..SELECT へデータをコピー。
    • 暗号化された列へのリテラルの挿入。

    このようなステートメントでは、次のようなオペランドの競合エラーが発生します。

    Msg 206, Level 16, State 2, Line 89
        Operand type clash: char(11) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_1', column_encryption_key_database_name = 'ssn') collation_name = 'Latin1_General_BIN2' is incompatible with char
    
  • アプリケーションでは、暗号化された列に対応する値を渡すためにクエリ パラメーターを使用する必要があります。 たとえば、暗号化された列にデータを挿入する場合、または暗号化された列でフィルター処理する場合 (決定論的暗号化を使用する場合)。 暗号化された列に対応するリテラルまたは T-SQL 変数の受け渡しはサポートされていません。 使用しているクライアント ドライバーに固有の詳細については、「Always Encrypted を使用したアプリケーションの開発」を参照してください。

  • これらのツールで暗号化された列に対応する値を渡すクエリを発行するには、Azure Data Studio または SSMS で Always Encrypted 変数のパラメーター化を使用する必要があります。 たとえば、暗号化された列にデータを挿入する場合、または暗号化された列でフィルター処理する場合 (決定論的暗号化を使用する場合)。

  • 暗号化された列を対象にしたテーブル値パラメーターはサポートされていません。

  • 次の句を使用するクエリはサポートされていません。

  • 暗号化された列の定義を変更した後、sp_refresh_parameter_encryption を実行して、オブジェクトに対する Always Encrypted のメタデータを更新します。

  • 以下の特性を持つ列に対しては、Always Encrypted はサポートされていません。

    • 次のデータ型のいずれかを使用する列: xmltimestamprowversionimagentexttextsql_varianthierarchyidgeographygeometry、alias、ユーザー定義型。
    • FILESTREAM
    • IDENTITY プロパティを持つ列
    • ROWGUIDCOL プロパティを持つ列
    • 決定論的暗号化を使用する場合、バイナリ コード ポイント (_BIN2) 照合順序以外の照合順序を持つ文字列 (varcharchar など) 列。
    • ランダム化暗号化を使用する場合、クラスター化インデックスおよび非クラスター化インデックスのキーとなる列 (決定論的な暗号化を使用する列のインデックスがサポートされています)。
    • フルテキスト インデックスに含まれる列 (Always Encrypted でフルテキスト検索はサポートされていません)。
    • 計算列
    • 計算列によって参照される列 (式が Always Encrypted でサポート外の演算を実行するとき)。
    • スパース列セット
    • ランダム化された暗号化を使用するときに統計によって参照される列 (決定論的な暗号化がサポートされています)。
    • パーティション分割列
    • 既定の制約を含む列。
    • ランダムな暗号化を使用するときに 一意制約によって参照される列 (明確な暗号化はサポートされます)。
    • ランダムな暗号化を使用するときの主キー列 (明確な暗号化はサポートされます)。
    • ランダム化された暗号化または明確な暗号化を使用する際の、外部キー制約での列の参照 (参照元および参照先の列が異なるキーまたはアルゴリズムを使用する場合)。
    • CHECK 制約によって参照される列。
    • 変更データ キャプチャを使用してキャプチャまたは追跡される列。
    • Change Tracking を持つテーブル上の主キー列。
    • マスキングされている列 (動的データ マスクを使用)。
    • ストレッチ データベース テーブル内の列。 (Always Encrypted で暗号化された列を持つテーブルは Stretch で有効にできます)。

    重要

    Stretch Database は、SQL Server 2022 (16.x) および Azure SQL Database では非推奨になります。 この機能は、Database Engine の将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。

    • 外部 (PolyBase) テーブルの列 (注: 外部テーブルと暗号化された列を持つテーブルを同じクエリで使用することはサポートされています)。
  • 次の機能は、暗号化された列では機能しません。

Always Encrypted Transact-SQL リファレンス

Always Encrypted では、次の Transact-SQL ステートメント、システム カタログ ビュー、システム ストアド プロシージャ、およびアクセス許可が使用されます。

明細書

システム カタログ ビューとストアド プロシージャ

各列に格納されている暗号化メタデータについては、sys.columns (Transact-SQL) も参照してください。

データベース権限

Always Encrypted には 4 つのデータベース アクセス許可があります。

  • ALTER ANY COLUMN MASTER KEY - 列マスター キー のメタデータを作成および削除するために必要です。

  • ALTER ANY COLUMN ENCRYPTION KEY - 列暗号化キーのメタデータを作成および削除するために必要です。

  • VIEW ANY COLUMN MASTER KEY DEFINITION - - 暗号化された列をクエリするために必要な列マスター キー メタデータにアクセスして読み取るために必須です。

  • VIEW ANY COLUMN ENCRYPTION KEY DEFINITION - 暗号化された列をクエリするために必要な列マスター キー メタデータにアクセスして読み取るために必須です。

次の表は、一般的な操作に必要なアクセス許可をまとめたものです。

シナリオ ALTER ANY COLUMN MASTER KEY ALTER ANY COLUMN ENCRYPTION KEY VIEW ANY COLUMN MASTER KEY DEFINITION VIEW ANY COLUMN ENCRYPTION KEY DEFINITION
キー管理 (データベース内のキーの作成/変更/確認) x X X x
暗号化された列のクエリ x x

重要な考慮事項

  • 暗号化された列を選択する場合は、列マスター キーに対するアクセス許可 (キー ストア内) がない場合でも、列を保護し、プレーンテキストの試行にアクセスしない場合でも、VIEW ANY COLUMN MASTER KEY DEFINITION および VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 権限が必要です。

  • SQL Server では、VIEW ANY COLUMN MASTER KEY DEFINITION アクセス許可と VIEW ANY COLUMN ENCRYPTION KEY DEFINITION アクセス許可の両方が、既定で public 固定データベース ロールに付与されます。 データベース管理者は、public ロールに対する アクセス許可を失効 (または拒否) し、特定のロールまたはユーザーに付与して、より制限が大きい制御を実装することができます。

  • SQL Database では、VIEW ANY COLUMN MASTER KEY DEFINITION および VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 権限は、既定では public 固定データベース ロールには付与されません。 これによって、(旧バージョンの DacFx を使用する) 一部の既存のレガシ ツールが正常に動作するようになります。 したがって、暗号化された列を操作するには (暗号化を解除しない場合でも)、データベース管理者は VIEW ANY COLUMN MASTER KEY DEFINITION および VIEW ANY COLUMN ENCRYPTION KEY DEFINITION 権限を明示的に付与する必要があります。

次のステップ

関連項目