クライアントサイドのフィールド レベル暗号化
バージョン 4.2の新機能
公式の MongoDB 4.2 + 互換ドライバーは、クライアント側のフィールドレベル暗号化フレームワークを提供します。 アプリケーションは、データをネットワーク経由でサーバーに送信する前に、ドキュメント内のフィールドを暗号化できます。 正しい暗号化キーにアクセスするアプリケーションのみが、保護されたデータを復号して読み取ることができます。 暗号化キーを削除すると、そのキーを使用して暗号化されたすべてのデータが永続的に読み取りできなくなります。
たとえば、 認証を強制する MongoDB クラスターはTLS 暗号化を使用して転送中のデータを保護します。 クラスターは、ディスク上のデータを保護するために、 MongoDB 暗号化ストレージ エンジンも使用します。 次のシナリオを検討してみましょう。
従業員はクラスターとそのホスト マシンへの管理アクセス権を持ちます。 従業員のアクセス レベルにより、通常のタスクの一環として復号化された状態で高機密性のデータを表示できます。
サードパーティ プロバイダーが MongoDB クラスターをホストしています。 プロバイダーは、ホストマシンまたはデータベースレベルのセキュリティ違反を導入しており、権限のないユーザーが復号化された状態でデータにアクセスします。
サードパーティのデータ分析会社は、個人情報、個人情報、または機密情報を含むデータにアクセスします。 サードパーティ会社は、復号化されたデータを、権限のないユーザーがアクセスできるセキュアされていないデータ ストレージ ボリュームにロードします。
各シナリオでは、MongoDB クラスターまたはホスト マシンのいずれかへの特権アクセスを持つユーザーは、暗号化をバイパスして、プライベート、特権、または機密性の高いデータを読み取ることができます。 サーバーに書き込まれる前にデータを保護するために、クライアント側のフィールドレベル暗号化を使用すると、ネットワークまたはディスクの暗号化がバイパスされた場合にデータが露出されるリスクを軽減します。
次の文書をご覧ください。
{ "name" : "John Doe", "address" : { "street" : "1234 Main Street", "city" : "MongoDBVille", "zip" : 99999 }, "phone" : "949-555-1212", "ssn" : "123-45-6789" }
クライアント側のフィールドレベル暗号化を使用すると、アプリケーションは ssn
やphone
などの機密情報を個別に暗号化できます。 暗号化されたフィールドは、binary data
サブタイプ6 の として保存されます :
{ "name" : "John Doe", "address" : { "street" : "1234 Main Street", "city" : "MongoDBVille", "zip" : 99999 }, "phone" : BinData(6,"U2FsdGVkX1+CGIDGUnGgtS46+c7R5u17SwPDEmzyCbA="), "ssn" : BinData(6,"AaloEw285E3AnfjP+r8ph2YCvMI1+rWzpZK97tV6iz0jx") }
クライアント側のフィールドレベル暗号化をサポートする公式の4.2 + 互換ドライバーの完全なリストについては、ドライバーの互換性テーブル を参照してください。
MongoDB 4.2 + 互換ドライバーを使用してフィールドレベルの暗号化を構成するための最初から最後までの手順については、クライアント側フィールドレベル暗号化ガイド を参照してください。
サポートされている暗号化メソッド
MongoDB は、公式の MongoDB 4.2 + 互換ドライバーを使用して、クライアント側のフィールドレベル暗号化の 2 つの方法をサポートしています。
- フィールドの明示的(手動)暗号化
公式MongoDB 4.2 + 互換ドライバー、
mongosh
、および MongoDB 4 。 2以降のレガシーmongo
shell は、特定のデータ暗号化キーと暗号化アルゴリズムを使用してフィールドを明示的に暗号化または復号化することをサポートしています。アプリケーションは、読み取りおよび書込み操作の構築に関連付けられたすべてのコードを変更して、ドライバー暗号化ライブラリ経由の暗号化/復号化ロジックを含める必要があります。 アプリケーションは、操作ごとに暗号化および復号化に適したデータ暗号化キーを選択する必要があります。
- フィールドの自動暗号化
注意
エンタープライズ機能
フィールドレベル暗号化の自動機能は、MongoDB Enterprise 4.2 以降と MongoDB Atlas 4.2 以降のクラスターでのみ使用できます。
公式MongoDB 4.2 + 互換ドライバー、
mongosh
、および MongoDB 4 。 2以降のレガシーmongo
shell は、読み取りおよび書込み操作のフィールドの自動暗号化をサポートしています。アプリケーションはデータベース接続オブジェクト(例:
MongoClient
)を含むドキュメントをインポートしようとすると、エラーを返します。 構成設定には、JSON schema 4の厳密なサブセットを使用した自動暗号化ルールが含まれている必要があります。 標準構文 は および暗号化固有のスキーマ キーワード。アプリケーションは、読み取り/書込み操作に関連付けられたコードを変更する必要はありません。 自動暗号化ルールに関する完全なドキュメントについては、「 自動暗号化ルール 」を参照してください。詳細については、「自動クライアント側フィールドレベル暗号化 」を参照してください。
MongoDB 4.2 + 互換ドライバー、 mongosh
、および MongoDB 4.2以降のレガシーmongo
shell は、クライアント側のフィールドレベル暗号化を使用して作成されたBinary
サブタイプ6オブジェクトを自動的に復号化します。 自動復号化の詳細については、「フィールドの自動復号化 」を参照してください。
重要
MongoDB のクライアント側のフィールドレベル暗号化では、ドキュメント内の単一フィールドの暗号化のみをサポートします。 ドキュメント全体を暗号化するには、ドキュメント内の個々のフィールドを暗号化する必要があります。
暗号化コンポーネント
次の図は、ドライバーと各暗号化コンポーネントの関係を示しています。
libmongocrypt
は、 Apache ライセンスのオープンソース 公式 MongoDB4 で使用されるコア暗号ライブラリ。2 +互換性のあるドライバー、mongosh
、および MongoDB 4 。クライアント側のフィールドレベル暗号化を強化するための2以降のレガシーmongo
shell。 一部のドライバーでは、ライブラリをインストールまたはリンクするために特定の統合手順が必要になる場合があります。 詳しくは、 ドライバーのドキュメント を参照してください。自動暗号化共有ライブラリは、自動クライアント側フィールドレベル暗号化をサポートしており、MongoDB Enterprise でのみ利用できます。 自動暗号化共有ライブラリは暗号化機能を実行しません。 共有ライブラリは
mongocryptd
の代替として推奨され、新しい プロセスを生成する必要はありません。mongocryptd
は引き続きサポートされます。Key Vaultは、値の暗号化に使用されるすべてのデータ暗号化キーを保存する MongoDB のコレクションです。 データ暗号化キーは、コレクションに保存される前に、CMK(Customer Master Key)を使用して暗号化されます。 キーヴォールトは、暗号化されたデータを保存している MongoDB クラスターとは異なる MongoDB クラスターに存在する場合があります。
KMS ( KMS )には、データ暗号化キーの暗号化に使用される CMK(Customer Master Key)が保存されています。 MongoDB は次の KMS プロバイダーをサポートしています。
暗号化されたデータを保存する MongoDB クラスターは、クライアント側のフィールドレベルの暗号化も強制する場合があります。 See Enforce Field Level Encryption Schema for more information.
暗号化アルゴリズム
MongoDB クライアント側のフィールドレベル暗号化では、フィールド値を暗号化するために、決定的またはランダムな初期化ベクトルと組み合わせて、暗号化-その後 MAC アプローチを使用します。 MongoDB は AEAD のみ をサポートします256 HMAC-SHA-512 MAC を使用した AES- -CBC 暗号化アルゴリズム。
決定的な暗号化
決定的な暗号化アルゴリズムにより、アルゴリズムが実行されるたびに特定の入力値が常に同じ出力値に暗号化されることが保証されます。 決定的な暗号化は読み取り操作のサポートを強化しますが、濃度の低い暗号化データは頻度分析リカバリの影響を受けやすくなります。
読み取り操作で使用されていない機密フィールドの場合、アプリケーションはランダム化暗号化を使用して頻度分析回復からの保護を向上させる場合があります。
ランダム化された暗号化
ランダム化された暗号化アルゴリズムにより、アルゴリズムが実行されるたびに、特定の入力値が常に異なる出力値に暗号化されることが保証されます。 ランダム化された暗号化はデータの機密性の強力な保証を提供しますが、クエリを評価するために暗号化されたフィールドで実行する必要がある読み取り操作のサポートも妨げられます。
ランダム化された暗号化では、オブジェクト全体または配列全体の暗号化もサポートされています。 たとえば、次のドキュメントについて考えてみます。
{ "personal_information" : { "ssn" : "123-45-6789", "credit_score" : 750, "credit_cards" : [ "1234-5678-9012-3456", "9876-5432-1098-7654"] }, "phone_numbers" : [ "(212) 555-0153" ] }
personal_information
phone_numbers
ランダム化された暗号化アルゴリズムを使用して フィールドと フィールドを暗号化すると、オブジェクト 全体が 暗号化されます。これにより、その下にネストされているすべてのフィールドが保護されますが、ネストされたフィールドに対するクエリも防止されます。
読み取り操作で使用される機密性の高いフィールドの場合、暗号化されたフィールドの読み取りサポートを向上させるために、アプリケーションは決定的な暗号化を使用する必要があります。
フィールドの自動復号化
BinData
Blob メタデータには、バイナリ データの暗号化に使用されるデータ暗号化キー_id
と暗号化アルゴリズムが含まれます。 4.2 + 互換ドライバー、 mongosh
、および MongoDB 4 。 2以降のレガシーmongo
shell はこのメタデータを使用して、 BinData
サブタイプ6オブジェクトの自動復号を試行します。 自動復号化プロセスは次のように機能します。
値の暗号化に使用されたデータ暗号化キーと暗号化アルゴリズムについて、
BinData
lob メタデータを確認します。指定されたデータ暗号化キーについて、現在のデータベース接続で構成されているキーヴォールトを確認します。 キーヴォールトに指定されたキーが含まれていない場合、自動復号は失敗し、ドライバーは
BinData
BLOB を返します。キーマテリアルの暗号化に使用される CMK(Customer Master Key)のデータ暗号化キー メタデータを確認します。
Amazon Web Services KMS 、 Azure Key Vault 、またはGoogle Cloud Platform KMSの場合は、復号化のためにデータ暗号化キーを KMS プロバイダーに送信します。 CMK が存在しない場合、または接続構成で CMK へのアクセスが許可されていない場合、復号は失敗し、ドライバーは
BinData
shell を返します。[ローカルで管理されているキー ] の場合は、ローカル キーを取得し、データ暗号化キーを復号化します。 データベース構成で指定されたローカルキーがデータ暗号化キーの暗号化に使用されなかった場合、復号は失敗し、ドライバーは
BinData
BLOB を返します。復号化されたデータ暗号化キーと適切なアルゴリズムを使用して、
BinData
値を復号化します。
MongoDB サーバーにアクセスでき、必要なマスターキーとデータ暗号化キーにもアクセスできないアプリケーションは、 BinData
値を復号化できません。
クライアント側のフィールドレベル暗号化のためのデータベース接続の構成の詳細については、 Mongo()
コンストラクターを参照するか、希望ドライバーのクライアント構築メソッドのドキュメントを参照してください。
フィールドレベル暗号化スキーマの強制
MongoDB 4.2以降、サーバーはスキーマ検証を使用して、コレクション内の特定のフィールドの暗号化を強制するをサポートしています。 自動暗号化ルール キーワードと$jsonSchema
検証オブジェクトを一緒に使用して、暗号化が必要なフィールドを示します。 サーバーは、指定されたフィールドがBinary (BinData)
サブタイプ6オブジェクトではない、そのコレクションへの書込み操作を拒否します。
たとえば、次のcollMod
コマンドは、 hr.employees
コレクションを変更してvalidator
を含めます。 $jsonSchema
検証オブジェクトには、次のことを示すクライアント側のフィールドレベル暗号化キーワードが含まれています。
taxid
フィールドは暗号化する必要があります。 クライアントは、フィールドを暗号化するときに、指定されたデータ暗号化キーとランダム化された暗号化アルゴリズムを使用する必要があります。taxid-short
フィールドは暗号化する必要があります。 クライアントは、 フィールドを暗号化するときに、指定されたデータ暗号化キーと決定的な暗号化アルゴリズムを使用する必要があります。
db.getSiblingDB("hr").runCommand( { "collMod" : "employees", "validator" : { "$jsonSchema" : { "bsonType" : "object", "properties" : { "taxid" : { "encrypt" : { "keyId" : [UUID("e114f7ad-ad7a-4a68-81a7-ebcb9ea0953a")], "algorithm" : "AEAD_AES_256_CBC_HMAC_SHA_512-Random", } }, "taxid-short" : { "encrypt" : { "keyId" : [UUID("33408ee9-e499-43f9-89fe-5f8533870617")], "algorithm" : "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic", "bsonType" : "string" } } } } } } )
明示的(手動)フィールドレベル暗号化を実行するクライアントは、書込み操作を発行する 前$jsonSchema
に、リモート と同じ設定を使用して 少なくとも フィールドと フィールドで を実行する encrypt
taxid
taxid-short
必要 があります。
自動クライアント側フィールドレベル暗号化を実行するクライアントは、データベース接続構成に応じて特定の動作をします。
注意
自動クライアント側フィールドレベル暗号化は MongoDB Enterprise 4.2以降でのみ利用できます。
接続
ClientSideFieldLevelEncryptionOptions
schemaMap
オブジェクトに指定されたコレクションのキーが含まれている場合、クライアントはそのオブジェクトを使用して自動フィールドレベルの暗号化を実行し、リモート スキーマを無視します。 ローカル ルールでは、少なくとも フィールドとtaxid
taxid-short
フィールドを暗号化する 必要があり ます。接続
ClientSideFieldLevelEncryptionOptions
schemaMap
オブジェクトに指定されたコレクションのキーが含まれていない場合、クライアントはコレクションのサーバー側リモート スキーマをダウンロードし、それを使用してフィールド レベルの自動暗号化を実行します。この構成では、クライアントは、自動フィールドレベル暗号化に関してサーバーが有効なスキーマを持っていると信頼する必要があります。 クライアントはリモート スキーマを使用して自動フィールドレベル暗号化を実行するだけで、スキーマで指定された他の検証ルールは強制されません。
MongoDB サーバーは暗号化されたフィールドの内容を復号化したり、内部検証したりすることができないため、クライアントが指定された暗号化オプションを使用して特定のフィールドを暗号化したことを検証できません。 これにより、2 つのクライアントが、特定のフィールドに対して異なるキー ID や暗号化アルゴリズムを使用して暗号化されたデータを挿入できます。 一部のワークロードには独立したフィールドレベルの暗号化実装が必要になる場合がありますが、クライアント間でフィールドの暗号化オプションの実装に一貫性がない場合、暗号化されたフィールドに対するクエリの誤った動作や予期しない動作が発生する可能性があります。
たとえば、クライアントA
はランダムな暗号化を使用してPII
フィールドを暗号化し、クライアントB
は決定的な暗号化を使用してPII
フィールドを暗号化します。 ランダム化された暗号化アルゴリズムは常に異なる一意の値を返しますが、決定的なアルゴリズムは常に同じ値を返します。 そのフィールドについて決定的に暗号化されたデータを要求するクエリでは、サーバーがランダムに暗号化されたフィールドのいずれとも一致しないため、一貫性のない結果が返されます。
ドライバーの互換性テーブル
MongoDB 4.2クライアント側のフィールドレベル暗号化は、次の公式の4.2 + 互換性のあるドライバー バージョンでのみ使用できます。
ドライバー | サポートされているバージョン | クイックスタート / チュートリアル |
---|---|---|
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
| ||
|
構文と実装例については、 ドライバーのリファレンス ドキュメント を参照してください。