Always Encrypted

適用対象: SQL Server Azure SQL DatabaseAzure SQL Managed Instance

Always Encryptedの図。

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

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

注意

セキュリティで保護されたエンクレーブは、パターン マッチング、その他の比較演算子、インプレース暗号化を使用して、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 ツールはそれを自動化できます)。

注意

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

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

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

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

注意

ユーザーがデータを読み取るために必要なデータベースアクセス許可を持っていて、それを保護するキーへのアクセス権がない場合でも、ユーザーはデータベース接続で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 ツールを使用して、暗号化された列のクエリを実行することもできます。

制限事項

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

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

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

    注意

    セキュリティで保護されたエンクレーブを使用した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、user-defined 型のいずれかを使用する列。
    • FILESTREAM
    • IDENTITY プロパティを持つ列。
    • ROWGUIDCOL プロパティを持つ列。
    • 決定論的暗号化を使用する場合、バイナリ コード ポイント (_BIN2) 照合順序以外の照合順序を持つ文字列 (varcharchar など) 列。
    • ランダム化された暗号化を使用する場合のクラスター化インデックスと非クラスター化インデックスのキーである列 (決定論的暗号化を使用する列のインデックスがサポートされています)。
    • フルテキスト インデックスに含まれる列 (Always Encryptedはフルテキスト検索をサポートしていません)。
    • 計算列
    • 計算列によって参照される列 (式が Always Encrypted でサポート外の演算を実行するとき)。
    • スパース列セット
    • ランダム化された暗号化を使用する場合に 統計 によって参照される列 (決定論的暗号化がサポートされています)。
    • 列のパーティション分割
    • 既定の 制約を持つ列。
    • ランダム化された暗号化を使用する場合に 一意の制約 によって参照される列 (決定論的暗号化がサポートされています)。
    • ランダムな暗号化を使用するときの主キー列 (明確な暗号化はサポートされます)。
    • ランダム化された暗号化を使用する場合、または決定論的暗号化を使用する場合、参照される列と参照する列が異なるキーまたはアルゴリズムを使用する場合は、 外部キー制約 の列を参照します。
    • check 制約によって参照される列。
    • 変更データ キャプチャを使用してキャプチャ/追跡される列。
    • 変更の追跡が行われるテーブルの主キー列。
    • マスクされた列 ( 動的データ マスクを使用)。
    • ストレッチ データベース テーブル内の列。 (Always Encrypted で暗号化された列を持つテーブルは Stretch で有効にできます)。

    重要

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

    • 外部 (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 任意の列の暗号化キーを変更します。 任意の列のマスター_キーの定義の表示 列の暗号化キーの定義を表示します。
キー管理 (データベース内のキーの作成/変更/確認) 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 DEFINITIONVIEW ANY COLUMN ENCRYPTION KEY DEFINITION 権限の両方が、既定でパブリック固定データベース ロールに付与されます。 データベース管理者は、 パブリック ロールに対するアクセス許可を取り消す (または拒否する) 選択し、特定のロールまたはユーザーに対して、より制限された制御を実装するように許可することができます。

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

次の手順

関連項目