クライアント側の暗号化
v 4.2以降、 MongoDB はクライアント側の暗号化をサポートしています。 クライアント側暗号化を使用すると、管理者や開発者は、MongoDB の他の暗号化機能を提供するだけでなく、特定のデータ フィールドを暗号化できます。
フィールドレベルの暗号化を使用すると、開発者はサーバー側の設定やディレクティブなしで、クライアント側のフィールドを暗号化できます。 クライアント側のフィールドレベル暗号化は、暗号化されたデータをサーバー管理者などの権限のないユーザーが読み取れることをアプリケーションが保証する必要があるワークロードをサポートします。
注意
このガイドでは、 クイック スタート プライマリで説明されている Observable
の暗黙的な方法を使用します。
インストール
プロジェクトでフィールドレベルの暗号化の使用を開始するには、依存関係管理システムを使用することをお勧めします。 フィールドレベルの暗号化には、ドライバーに加えて追加のパッケージが必要です。
注意
Scala ドライバーをインストールする方法について詳しくは、「インストールガイド 」を参照してください。
libmongocrypt
libmongocrypt
バインディングを含む別の JAR ファイルがあります。
Maven を使用してパッケージを管理している場合は、次のエントリをpom.xml
依存関係リストに追加します。
<dependencies> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-crypt</artifactId> <version>1.2.1</version> </dependency> </dependencies>
Gradle を使用している場合 パッケージを管理するには、次のエントリを 依存関係リストに追加します。
dependencies { implementation 'org.mongodb:mongodb-crypt:1.2.1' }
mongocryptd の構成
libmongocrypt
バインディングでは、 mongocryptd
のデーモンまたは プロセスが実行されている必要があります。 特定のデーモンまたはプロセス URI は、 extraOptions
設定でmongocryptdURI
を設定することで、 AutoEncryptionSettings
クラスで構成できます。
例
自動暗号化と復号化
次の例は、キーとスキーマが MongoDB ですでに作成されていることを前提としているサンプル アプリです。 この例ではローカル キーを使用していますが、 Amazon Web Services 、 Azure 、 GCP KMSを使用することもできます。 encryptedField
フィールドのデータは、挿入時に自動的に暗号化され、クライアント側で find を使用するときに復号化されます。
コード例は ClientSideEncryptionSimpleTour.scala Githubからのものです ドライバー ソース コード リポジトリ内のファイル。
import java.security.SecureRandom import org.mongodb.scala.{AutoEncryptionSettings, Document, MongoClient, MongoClientSettings} import tour.Helpers._ import scala.collection.JavaConverters._ object ClientSideEncryptionSimpleTour { def main(args: Array[String]): Unit = { val localMasterKey = new Array[Byte](96) new SecureRandom().nextBytes(localMasterKey) val kmsProviders = Map("local" -> Map[String, AnyRef]("key" -> localMasterKey).asJava).asJava val keyVaultNamespace = "admin.datakeys" val autoEncryptionSettings = AutoEncryptionSettings.builder() .keyVaultNamespace(keyVaultNamespace).kmsProviders(kmsProviders).build() val clientSettings = MongoClientSettings.builder() .autoEncryptionSettings(autoEncryptionSettings).build() val mongoClient = MongoClient(clientSettings) val collection = mongoClient.getDatabase("test").getCollection("coll") collection.drop().headResult() collection.insertOne(Document("encryptedField" -> "123456789")).headResult() collection.find().first().printHeadResult() // release resources mongoClient.close() } }
注意
自動暗号化はEnterprise のみの機能です。
データ暗号化キーと暗号化フィールドの指定
次の例は、AutoEncryptionSettings
インスタンスを構成して新しいキーを作成し、 JSON schemaマップを設定する方法を示しています。
コード例は ClientSideEncryptionAutoEncryptionSettingsTour.scala からのものです ドライバー ソース コードGithub リポジトリ内のファイル。
import java.security.SecureRandom import java.util.Base64 import scala.collection.JavaConverters._ import org.mongodb.scala._ import org.mongodb.scala.bson.BsonDocument import org.mongodb.scala.model.vault.DataKeyOptions import org.mongodb.scala.vault.ClientEncryptions import tour.Helpers._ ... val keyVaultNamespace = "admin.datakeys" val clientEncryptionSettings = ClientEncryptionSettings.builder() .keyVaultMongoClientSettings( MongoClientSettings.builder().applyConnectionString(ConnectionString("mongodb://localhost")).build()) .keyVaultNamespace(keyVaultNamespace).kmsProviders(kmsProviders).build() val clientEncryption = ClientEncryptions.create(clientEncryptionSettings) val dataKey = clientEncryption.createDataKey("local", DataKeyOptions()).headResult() val base64DataKeyId = Base64.getEncoder.encodeToString(dataKey.getData) val dbName = "test" val collName = "coll" val autoEncryptionSettings = AutoEncryptionSettings.builder() .keyVaultNamespace(keyVaultNamespace) .kmsProviders(kmsProviders) .schemaMap(Map(s"$dbName.$collName" -> BsonDocument( s"""{ properties: { encryptedField: { encrypt: { keyId: [{ "$$binary": { "base64": "$base64DataKeyId", "subType": "04" } }], bsonType: "string", algorithm: "AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic" } } }, bsonType: "object" }""")).asJava) .build()
明示的な暗号化と復号化
明示的な暗号化と復号化は MongoDB Community の機能であり、 mongocryptd
プロセスは使用されません。 明示的な暗号化はClientEncryption
クラスによって提供されます。
コード例は ClientSideEncryptionExpriteEncryptionAndDecryptionTour.scala からのものです ドライバー ソースGithub コード リポジトリ内のファイル。
// This would have to be the same master key as was used to create the encryption key val localMasterKey = new Array[Byte](96) new SecureRandom().nextBytes(localMasterKey) val kmsProviders = Map("local" -> Map[String, AnyRef]("key" -> localMasterKey).asJava).asJava val keyVaultNamespace = new MongoNamespace("encryption.testKeyVault") val clientSettings = MongoClientSettings.builder().build() val mongoClient = MongoClient(clientSettings) // Set up the key vault for this example val keyVaultCollection = mongoClient.getDatabase(keyVaultNamespace.getDatabaseName) .getCollection(keyVaultNamespace.getCollectionName) keyVaultCollection.drop().headResult() // Ensure that two data keys cannot share the same keyAltName. keyVaultCollection.createIndex(Indexes.ascending("keyAltNames"), new IndexOptions().unique(true) .partialFilterExpression(Filters.exists("keyAltNames"))) val collection = mongoClient.getDatabase("test").getCollection("coll") collection.drop().headResult() // Create the ClientEncryption instance val clientEncryptionSettings = ClientEncryptionSettings .builder() .keyVaultMongoClientSettings( MongoClientSettings.builder() .applyConnectionString(ConnectionString("mongodb://localhost")).build() ) .keyVaultNamespace(keyVaultNamespace.getFullName) .kmsProviders(kmsProviders) .build() val clientEncryption = ClientEncryptions.create(clientEncryptionSettings) val dataKeyId = clientEncryption.createDataKey("local", DataKeyOptions()).headResult() // Explicitly encrypt a field val encryptedFieldValue = clientEncryption.encrypt(BsonString("123456789"), EncryptOptions("AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic").keyId(dataKeyId)) .headResult() collection.insertOne(Document("encryptedField" -> encryptedFieldValue)).headResult() val doc = collection.find.first().headResult() println(doc.toJson()) // Explicitly decrypt the field println( clientEncryption.decrypt(doc.get[BsonBinary]("encryptedField").get).headResult() )
明示的な暗号化と自動復号化
ただし、自動暗号化には MongoDB 4.2 Enterprise または MongoDB 4.2 800} が必要です Atlas クラスターでは、すべてのユーザーに対して自動復号化がサポートされています。 自動暗号化を使用せずに自動復号化を構成するには、 bypassAutoEncryption(true)
を設定します。
コード例は ClientSideEncryptionExplitEncryptionOnlyTour.scala からのものです ドライバー ソースGithub コード リポジトリ内のファイル。
... val clientSettings = MongoClientSettings.builder() .autoEncryptionSettings(AutoEncryptionSettings.builder() .keyVaultNamespace(keyVaultNamespace.getFullName) .kmsProviders(kmsProviders) .bypassAutoEncryption(true) .build()) .build() val mongoClient = MongoClient(clientSettings) ... // Explicitly encrypt a field val encryptedFieldValue = clientEncryption.encrypt(BsonString("123456789"), EncryptOptions("AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic").keyId(dataKeyId)) .headResult() collection.insertOne(Document("encryptedField" -> encryptedFieldValue)).headResult() val doc = collection.find.first().headResult() println(doc.toJson())