での自動 の使用Queryable EncryptionAmazon Web Services
項目一覧
Overview
このガイドでは、 MongoDB Queryable Encryption機能を実装してドキュメント フィールドを自動的に暗号化および復号化し、 Amazon Web Services ( Amazon Web Services ) KMSをキー管理に使用するアプリケーションを構築する方法について説明します。
このガイドの手順を完了すると、次のものが作成されます。
Amazon Web Services KMSによって管理される カスタマー マスター キー
のカスタマー マスター キーにアクセスする権限を持つ IAM ユーザーAmazon Web ServicesAmazon Web ServicesKMS
カスタマー マスター キーを使用して暗号化されたフィールドを持つドキュメントを挿入する動作するクライアント アプリケーション
始める前に
このガイドのコードを完了して実行するには、インストール要件ページに示されているように開発環境を設定する必要があります。
Tip
詳細: フルアプリケーション
このサンプル アプリケーションの完全なコードを確認するには、プログラミング言語に対応するタブを選択し、表示されたリンクに従ってください。 各サンプル アプリケーション リポジトリには README.md
ファイルが含まれており、環境を設定しアプリケーションを実行する方法を学習できます。
KMS を設定する
CMK の作成
AmazonAmazon Web Services Web Servicesマネジメント コンソール にログインします。
Amazon Web ServicesAmazon Web ServicesKMS KMS コンソール に移動します。
CMK の作成
対称 キーの作成 に関する の公式ドキュメントに従って、新しい対称キーを作成しますAmazon Web Services KMS。作成したキーが CMK です。 それを識別するのに役立つ名前と説明を選択します。これらのフィールドは、 CMKの機能や構成に影響を与えません。
キー生成プロセスの Usage Permissionsステップで、カスタマー マスター キーへのアクセスを許可する ID およびアクセス管理( IAM )ポリシーを有効にする次のデフォルトのキー ポリシーを適用します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "<ARN of your AWS account principal>" }, "Action": "kms:*", "Resource": "*" } ] }
重要
カスタマー マスター キーの Amazon リソース名( ARN )とリージョンを記録します。 これらはこのガイドの後の手順で使用します。
Tip
キー ポリシー
キーAmazon Web ServicesKMS ポリシーの詳細については、「 のキー ポリシーAmazon Web Services 」を参照してください。 の公式ドキュメントを参照してください。
Amazon Web Services IAM ユーザーの作成
IAM ユーザーの作成
ユーザーの 追加 に関する の公式ドキュメントに従って、 マネジメントコンソールに新しいプログラム IAM ユーザーを作成しますAmazon Web Services Amazon Web Services。このIAMユーザーは、Queryable Encryption 対応アプリケーションのサービス アカウントとして使用します。 アプリケーションは、Amazon Web ServicesKMS IAM ユーザーを使用して で認証され、CMK(Customer Master Key)でデータ暗号化キー(DEK)を暗号化および復号化します。
重要
認証情報の記録
IAM ユーザーを作成する最後のステップで、次の IAM 認証情報を必ず記録してください。
アクセスキー ID
シークレット アクセス キー
これらの認証情報を記録する機会が 1 つあります。 このステップの実行中にこれらの認証情報を記録しない場合は、別のIAMユーザーを作成する必要があります。
権限の付与
リモート マスター キーに対するIAMユーザーにkms:Encrypt
とkms:Decrypt
権限を付与します。
重要
新しいクライアントIAMユーザーには、マスター キーの管理権限があってはなりません。 データを安全に保つに は、最小特権の原則に従います。
次のインライン ポリシーにより、 IAMユーザーは最小限の特権で CMK を使用して暗号化および復号化を実行できます。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["kms:Decrypt", "kms:Encrypt"], "Resource": "<the Amazon Resource Name (ARN) of your remote master key>" } ] }
IAM Amazon Web Servicesユーザーに前述のポリシーを適用するには、次のようにします。 IAM ID 権限の追加 ガイドを参照して 。
重要
本番環境での IAM ロールによる認証
Queryable Encryption が有効なアプリケーションを本番環境に配置するときは、 IAM ユーザー ではなく IAM ロール を使用してアプリケーションを認証します。
IAMロールの詳細については、 Amazon Web Servicesの公式ドキュメントの次のページを参照してください。
アプリケーションを作成する
アプリケーション変数を割り当てる
このチュートリアルのコード サンプルでは、次の変数を使用して Queryable Encryption ワークフローを実行します。
kmsProviderName - CMK の保存に使用している KMS。 このチュートリアルでは、この変数を
"aws"
に設定します。uri - MongoDB 配置接続 URI。
MONGODB_URI
環境変数で接続 URI を設定するか、値を直接置き換えます。keyVaultDatabaseName - データ暗号化キー(DEK)が保存される MongoDB のデータベース。 この変数を
"encryption"
に設定します。keyVaultCollectionName - DEK が保存される MongoDB のコレクション。 この変数を
"__keyVault"
に設定します。keyVaultNamespace - DEK が保存される MongoDB の名前空間。 この変数に、ピリオドで区切られた
keyVaultDatabaseName
変数とkeyVaultCollectionName
変数の値を設定します。encryptionDatabaseName -暗号化されたデータが保存される MongoDB のデータベース。 この変数を
"medicalRecords"
に設定します。encryptedCollectionName - 暗号化されたデータが保存される MongoDB のコレクション。 この変数を
"patients"
に設定します。
次のコードを使用して、これらの変数を宣言できます。
// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local" const kmsProviderName = "<Your KMS Provider Name>"; const uri = process.env.MONGODB_URI; // Your connection URI const keyVaultDatabaseName = "encryption"; const keyVaultCollectionName = "__keyVault"; const keyVaultNamespace = `${keyVaultDatabaseName}.${keyVaultCollectionName}`; const encryptedDatabaseName = "medicalRecords"; const encryptedCollectionName = "patients";
kmsProviderName - CMK の保存に使用している KMS。 このチュートリアルでは、この値を
"aws"
に設定します。keyVaultDatabaseName - データ暗号化キー(DEK)が保存される MongoDB のデータベース。 の値を
keyVaultDatabaseName
"encryption"
に設定します。keyVaultCollectionName - DEK が保存される MongoDB のコレクション。 の値を
keyVaultCollectionName
"__keyVault"
に設定します。keyVaultNamespace - DEK が保存される MongoDB の名前空間。 新しい
keyVaultNamespace
CollectionNamespace
オブジェクトにkeyVaultDatabaseName
keyVaultCollectionName
を設定します。このオブジェクトは、 変数と 変数の値をピリオドで区切った値です。encryptionDatabaseName -暗号化されたデータが保存される MongoDB のデータベース。 の値を
encryptedDatabaseName
"medicalRecords"
に設定します。encryptedCollectionName - 暗号化されたデータが保存される MongoDB のコレクション。 の値を
encryptedCollectionName
"patients"
に設定します。uri - MongoDB 配置接続 URI。
appsettings.json
ファイルで接続 URI を設定するか、値を直接置き換えます。
次のコードを使用して、これらの変数を宣言できます。
// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local" const string kmsProviderName = "<your KMS provider name>"; const string keyVaultDatabaseName = "encryption"; const string keyVaultCollectionName = "__keyVault"; var keyVaultNamespace = CollectionNamespace.FromFullName($"{keyVaultDatabaseName}.{keyVaultCollectionName}"); const string encryptedDatabaseName = "medicalRecords"; const string encryptedCollectionName = "patients"; var appSettings = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build(); var uri = appSettings["MongoDbUri"];
kmsProviderName - CMK の保存に使用している KMS。 このチュートリアルでは、この変数を
"aws"
に設定します。uri - MongoDB 配置接続 URI。
MONGODB_URI
環境変数で接続 URI を設定するか、値を直接置き換えます。keyVaultDatabaseName - データ暗号化キー(DEK)が保存される MongoDB のデータベース。 この変数を
"encryption"
に設定します。keyVaultCollectionName - DEK が保存される MongoDB のコレクション。 この変数を
"__keyVault"
に設定します。keyVaultNamespace - DEK が保存される MongoDB の名前空間。 この変数に、ピリオドで区切られた
keyVaultDatabaseName
変数とkeyVaultCollectionName
変数の値を設定します。encryptionDatabaseName -暗号化されたデータが保存される MongoDB のデータベース。 この変数を
"medicalRecords"
に設定します。encryptedCollectionName - 暗号化されたデータが保存される MongoDB のコレクション。 この変数を
"patients"
に設定します。
次のコードを使用して、これらの変数を宣言できます。
// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local" kmsProviderName := "<KMS provider name>" uri := os.Getenv("MONGODB_URI") // Your connection URI keyVaultDatabaseName := "encryption" keyVaultCollectionName := "__keyVault" keyVaultNamespace := keyVaultDatabaseName + "." + keyVaultCollectionName encryptedDatabaseName := "medicalRecords" encryptedCollectionName := "patients"
kmsProviderName - CMK の保存に使用している KMS。 このチュートリアルでは、この変数を
"aws"
に設定します。uri - MongoDB 配置接続 URI。
MONGODB_URI
環境変数で接続 URI を設定するか、値を直接置き換えます。keyVaultDatabaseName - データ暗号化キー(DEK)が保存される MongoDB のデータベース。 この変数を
"encryption"
に設定します。keyVaultCollectionName - DEK が保存される MongoDB のコレクション。 この変数を
"__keyVault"
に設定します。keyVaultNamespace - DEK が保存される MongoDB の名前空間。 この変数に、ピリオドで区切られた
keyVaultDatabaseName
変数とkeyVaultCollectionName
変数の値を設定します。encryptionDatabaseName -暗号化されたデータが保存される MongoDB のデータベース。 この変数を
"medicalRecords"
に設定します。encryptedCollectionName - 暗号化されたデータが保存される MongoDB のコレクション。 この変数を
"patients"
に設定します。
次のコードを使用して、これらの変数を宣言できます。
// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local" String kmsProviderName = "<KMS provider name>"; String uri = QueryableEncryptionHelpers.getEnv("MONGODB_URI"); // Your connection URI String keyVaultDatabaseName = "encryption"; String keyVaultCollectionName = "__keyVault"; String keyVaultNamespace = keyVaultDatabaseName + "." + keyVaultCollectionName; String encryptedDatabaseName = "medicalRecords"; String encryptedCollectionName = "patients";
kmsProviderName - CMK の保存に使用している KMS。 このチュートリアルでは、この変数を
"aws"
に設定します。uri - MongoDB 配置接続 URI。
MONGODB_URI
環境変数で接続 URI を設定するか、値を直接置き換えます。keyVaultDatabaseName - データ暗号化キー(DEK)が保存される MongoDB のデータベース。 この変数を
"encryption"
に設定します。keyVaultCollectionName - DEK が保存される MongoDB のコレクション。 この変数を
"__keyVault"
に設定します。keyVaultNamespace - DEK が保存される MongoDB の名前空間。 この変数に、ピリオドで区切られた
keyVaultDatabaseName
変数とkeyVaultCollectionName
変数の値を設定します。encryptionDatabaseName -暗号化されたデータが保存される MongoDB のデータベース。 この変数を
"medicalRecords"
に設定します。encryptedCollectionName - 暗号化されたデータが保存される MongoDB のコレクション。 この変数を
"patients"
に設定します。
次のコードを使用して、これらの変数を宣言できます。
// KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local" const kmsProviderName = "<Your KMS Provider Name>"; const uri = process.env.MONGODB_URI; // Your connection URI const keyVaultDatabaseName = "encryption"; const keyVaultCollectionName = "__keyVault"; const keyVaultNamespace = `${keyVaultDatabaseName}.${keyVaultCollectionName}`; const encryptedDatabaseName = "medicalRecords"; const encryptedCollectionName = "patients";
kms_provider_name - CMK の保存に使用している KMS。 このチュートリアルでは、この変数を
"aws"
に設定します。uri - MongoDB 配置接続 URI。
MONGODB_URI
環境変数で接続 URI を設定するか、値を直接置き換えます。key_vault_database_name - データ暗号化キー(DEK)が保存される MongoDB のデータベース。 この変数を
"encryption"
に設定します。key_vault_collection_name - DEK が保存される MongoDB のコレクション。 この変数を
"__keyVault"
に設定します。key_vault_namespace - DEK が保存される MongoDB の名前空間。 この変数に、ピリオドで区切られた
key_vault_database_name
変数とkey_vault_collection_name
変数の値を設定します。encrypted_database_name - 暗号化されたデータが保存される MongoDB のデータベース。 この変数を
"medicalRecords"
に設定します。encrypted_collection_name - 暗号化されたデータが保存される MongoDB のコレクション。 この変数を
"patients"
に設定します。
次のコードを使用して、これらの変数を宣言できます。
# KMS provider name should be one of the following: "aws", "gcp", "azure", "kmip" or "local" kms_provider_name = "<KMS provider name>" uri = os.environ['MONGODB_URI'] # Your connection URI key_vault_database_name = "encryption" key_vault_collection_name = "__keyVault" key_vault_namespace = f"{key_vault_database_name}.{key_vault_collection_name}" encrypted_database_name = "medicalRecords" encrypted_collection_name = "patients"
重要
キーヴォールトコレクションの名前空間権限
Key Vault コレクションはencryption.__keyVault
名前空間にあります。 アプリケーションが MongoDB への接続に使用するデータベースユーザーが、この名前空間に対する 読み取り /書き込み権限を持っていることを確認します。
Tip
環境変数
このチュートリアルのサンプル コードは、設定する必要がある環境変数を参照します。 あるいは、コード内で値を直接置き換えることもできます。
これらの環境変数を設定する方法については、 README.md Githubを参照してください。 のサンプル アプリケーションに含まれる ファイル。
Tip
環境変数
このチュートリアルのサンプル コードは、設定する必要がある環境変数を参照します。 あるいは、コード内で値を直接置き換えることもできます。
これらの環境変数を設定する方法については、 README.md Githubを参照してください。 のサンプル アプリケーションに含まれる ファイル。
Tip
環境変数
このチュートリアルのサンプル コードは、設定する必要がある環境変数を参照します。 あるいは、コード内で値を直接置き換えることもできます。
これらの環境変数を設定する方法については、 README.md Githubを参照してください。 のサンプル アプリケーションに含まれる ファイル。
Tip
環境変数
このチュートリアルのサンプル コードは、設定する必要がある環境変数を参照します。 あるいは、コード内で値を直接置き換えることもできます。
これらの環境変数を設定する方法については、 README.md Githubを参照してください。 のサンプル アプリケーションに含まれる ファイル。
Tip
環境変数
このチュートリアルのサンプル コードは、設定する必要がある環境変数を参照します。 あるいは、コード内で値を直接置き換えることもできます。
これらの環境変数を設定する方法については、 README.md Githubを参照してください。 のサンプル アプリケーションに含まれる ファイル。
Tip
環境変数
このチュートリアルのサンプル コードは、設定する必要がある環境変数を参照します。 あるいは、コード内で値を直接置き換えることもできます。
これらの環境変数を設定する方法については、 README.md Githubを参照してください。 のサンプル アプリケーションに含まれる ファイル。
暗号化されたコレクションの作成
Amazon Web Services KMS認証情報の追加
次の構造を持つAmazon Web Services KMS認証情報を含む変数を作成します。 このチュートリアルの「 IAM ユーザーの作成」ステップで作成したアクセス キー ID と シークレット アクセス キー を使用します。
kmsProviderCredentials = { aws: { accessKeyId: process.env["AWS_ACCESS_KEY_ID"], // Your AWS access key ID secretAccessKey: process.env["AWS_SECRET_ACCESS_KEY"], // Your AWS secret access key }, };
var kmsProviderCredentials = new Dictionary<string, IReadOnlyDictionary<string, object>>(); var kmsOptions = new Dictionary<string, object> { { "accessKeyId", _appSettings["Aws:AccessKeyId"] }, // Your AWS access key ID { "secretAccessKey", _appSettings["Aws:SecretAccessKey"] } // Your AWS secret access key }; kmsProviderCredentials.Add(kmsProvider, kmsOptions);
kmsProviderCredentials := map[string]map[string]interface{}{ "aws": { "accessKeyId": os.Getenv("AWS_ACCESS_KEY_ID"), // AWS access key ID "secretAccessKey": os.Getenv("AWS_SECRET_ACCESS_KEY"), // AWS secret access key }, }
Map<String, Object> kmsProviderDetails = new HashMap<>(); kmsProviderDetails.put("accessKeyId", getEnv("AWS_ACCESS_KEY_ID")); // Your AWS access key ID kmsProviderDetails.put("secretAccessKey", getEnv("AWS_SECRET_ACCESS_KEY")); // Your AWS secret access key Map<String, Map<String, Object>> kmsProviderCredentials = new HashMap<String, Map<String, Object>>(); kmsProviderCredentials.put("aws", kmsProviderDetails);
kmsProviders = { aws: { accessKeyId: process.env.AWS_ACCESS_KEY_ID, // Your AWS access key ID secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, // Your AWS secret access key }, };
kms_provider_credentials = { "aws": { "accessKeyId": os.environ['AWS_ACCESS_KEY_ID'], # Your AWS access key ID "secretAccessKey": os.environ['AWS_SECRET_ACCESS_KEY'] # Your AWS secret access key } }
重要
ヒント: 本番環境で IAM ロールを使用して認証する
IAM ユーザーではなく IAM ロールを使用してアプリケーションを認証するには、KMS プロバイダー オブジェクトで認証情報の空のオブジェクトを指定します。これは、環境から認証情報を自動的に検索するようにドライバーに指示します。
kmsProviders = { aws: { } };
kmsProviderCredentials.Add("aws", new Dictionary<string, object>);
kmsProviderCredentials := map[string]map[string]interface{}{ "aws": { }, }
kmsProviderCredentials.put("aws", new HashMap<>());
kmsProviders = { aws: { } };
kms_provider_credentials = { "aws": { } }
CMK 認証情報の追加
次の構造を持つ、CMK の認証情報を含む変数を作成します。 このチュートリアルの 「 カスタマー マスター キーの作成 」ステップで記録した ARN とリージョンを使用します。
customerMasterKeyCredentials = { key: process.env["AWS_KEY_ARN"], // Your AWS Key ARN region: process.env["AWS_KEY_REGION"], // Your AWS Key Region };
var customerMasterKeyCredentials = new BsonDocument { { "key", _appSettings["Aws:KeyArn"] }, // Your AWS Key ARN { "region", _appSettings["Aws:KeyRegion"] } // Your AWS Key Region };
customerMasterKeyCredentials := map[string]string{ "key": os.Getenv("AWS_KEY_ARN"), // Your AWS Key ARN "region": os.Getenv("AWS_KEY_REGION"), // Your AWS Key Region }
BsonDocument customerMasterKeyCredentials = new BsonDocument(); customerMasterKeyCredentials.put("provider", new BsonString(kmsProviderName)); customerMasterKeyCredentials.put("key", new BsonString(getEnv("AWS_KEY_ARN"))); // Your AWS Key ARN customerMasterKeyCredentials.put("region", new BsonString(getEnv("AWS_KEY_REGION"))); // Your AWS Key Region
customerMasterKeyCredentials = { key: process.env.AWS_KEY_ARN, // Your AWS Key ARN region: process.env.AWS_KEY_REGION, // Your AWS Key Region };
customer_master_key_credentials = { "key": os.environ['AWS_KEY_ARN'], # Your AWS Key ARN "region": os.environ['AWS_KEY_REGION'] # Your AWS Key Region }
自動暗号化オプションを設定する
次のオプションを含むautoEncryptionOptions
オブジェクトを作成します。
キーヴォールト コレクションの名前空間
Amazon Web Services KMS認証情報を含む
kmsProviderCredentials
オブジェクト
const autoEncryptionOptions = { keyVaultNamespace: keyVaultNamespace, kmsProviders: kmsProviderCredentials, };
次のオプションを含むAutoEncryptionOptions
オブジェクトを作成します。
キーヴォールト コレクションの名前空間
Amazon Web Services KMS認証情報を含む
kmsProviderCredentials
オブジェクト自動暗号化共有ライブラリへのパスを含む
extraOptions
オブジェクト
var extraOptions = new Dictionary<string, object> { { "cryptSharedLibPath", _appSettings["CryptSharedLibPath"] } // Path to your Automatic Encryption Shared Library }; var autoEncryptionOptions = new AutoEncryptionOptions( keyVaultNamespace, kmsProviderCredentials, extraOptions: extraOptions);
次のオプションを含むAutoEncryption
オブジェクトを作成します。
キーヴォールト コレクションの名前空間
Amazon Web Services KMS認証情報を含む
kmsProviderCredentials
オブジェクト自動暗号化共有ライブラリへのパスを含む
cryptSharedLibraryPath
オブジェクト
cryptSharedLibraryPath := map[string]interface{}{ "cryptSharedLibPath": os.Getenv("SHARED_LIB_PATH"), // Path to your Automatic Encryption Shared Library } autoEncryptionOptions := options.AutoEncryption(). SetKeyVaultNamespace(keyVaultNamespace). SetKmsProviders(kmsProviderCredentials). SetExtraOptions(cryptSharedLibraryPath)
次のオプションを含むAutoEncryptionSettings
オブジェクトを作成します。
キーヴォールト コレクションの名前空間
Amazon Web Services KMS認証情報を含む
kmsProviderCredentials
オブジェクト自動暗号化共有ライブラリへのパスを含む
extraOptions
オブジェクト
Map<String, Object> extraOptions = new HashMap<String, Object>(); extraOptions.put("cryptSharedLibPath", getEnv("SHARED_LIB_PATH")); // Path to your Automatic Encryption Shared Library AutoEncryptionSettings autoEncryptionSettings = AutoEncryptionSettings.builder() .keyVaultNamespace(keyVaultNamespace) .kmsProviders(kmsProviderCredentials) .extraOptions(extraOptions) .build();
次のオプションを含むautoEncryptionOptions
オブジェクトを作成します。
キーヴォールト コレクションの名前空間
Amazon Web Services KMS認証情報を含む
kmsProviders
オブジェクト自動暗号化共有ライブラリへのパスを含む
sharedLibraryPathOptions
オブジェクト
const extraOptions = { cryptSharedLibPath: process.env.SHARED_LIB_PATH, // Path to your Automatic Encryption Shared Library }; const autoEncryptionOptions = { keyVaultNamespace, kmsProviders, extraOptions, };
次のオプションを含むAutoEncryptionOpts
オブジェクトを作成します。
Amazon Web Services KMS認証情報を含む
kms_provider_credentials
オブジェクトキーヴォールト コレクションの名前空間
自動暗号化共有ライブラリへのパス
auto_encryption_options = AutoEncryptionOpts( kms_provider_credentials, key_vault_namespace, crypt_shared_lib_path=os.environ['SHARED_LIB_PATH'] # Path to your Automatic Encryption Shared Library> )
注意
自動暗号化オプション
自動暗号化オプションは、暗号化共有ライブラリに構成情報を提供し、暗号化されたフィールドにアクセスするときにアプリケーションの動作を変更します。
自動暗号化共有ライブラリの詳細については、「 Queryable Encryption のための自動暗号化共有ライブラリ」ページを参照してください。
暗号化されたコレクションを設定するためのクライアントの作成
コレクション内のデータの暗号化と復号化に使用されるクライアントを作成するには、接続 URI と 自動暗号化オプションを使用して新しいMongoClient
をインスタンス化します。
const encryptedClient = Mongo(uri, autoEncryptionOptions);
var clientSettings = MongoClientSettings.FromConnectionString(uri); clientSettings.AutoEncryptionOptions = qeHelpers.GetAutoEncryptionOptions( keyVaultNamespace, kmsProviderCredentials); var encryptedClient = new MongoClient(clientSettings);
encryptedClient, err := mongo.Connect( context.TODO(), options.Client().ApplyURI(uri).SetAutoEncryptionOptions(autoEncryptionOptions), ) if err != nil { panic(fmt.Sprintf("Unable to connect to MongoDB: %v\n", err)) } defer func() { _ = encryptedClient.Disconnect(context.TODO()) }()
MongoClientSettings clientSettings = MongoClientSettings.builder() .applyConnectionString(new ConnectionString(uri)) .autoEncryptionSettings(autoEncryptionSettings) .build(); try (MongoClient encryptedClient = MongoClients.create(clientSettings)) {
const encryptedClient = new MongoClient(uri, { autoEncryption: autoEncryptionOptions, });
encrypted_client = MongoClient( uri, auto_encryption_opts=auto_encryption_options)
暗号化するフィールドの指定
フィールドを暗号化するには、暗号化スキーマに追加します。 フィールドでクエリを有効にするには、「クエリ」プロパティを追加します。 暗号化スキーマは、次のように作成します。
const encryptedFieldsMap = { encryptedFields: { fields: [ { path: "patientRecord.ssn", bsonType: "string", queries: { queryType: "equality" }, }, { path: "patientRecord.billing", bsonType: "object", }, ], }, };
var encryptedFields = new BsonDocument { { "fields", new BsonArray { new BsonDocument { { "keyId", BsonNull.Value }, { "path", "record.ssn" }, { "bsonType", "string" }, { "queries", new BsonDocument("queryType", "equality") } }, new BsonDocument { { "keyId", BsonNull.Value }, { "path", "record.billing" }, { "bsonType", "object" } } } } };
encryptedFieldsMap := bson.M{ "fields": []bson.M{ bson.M{ "keyId": nil, "path": "patientRecord.ssn", "bsonType": "string", "queries": []bson.M{ { "queryType": "equality", }, }, }, bson.M{ "keyId": nil, "path": "patientRecord.billing", "bsonType": "object", }, }, }
BsonDocument encryptedFieldsMap = new BsonDocument().append("fields", new BsonArray(Arrays.asList( new BsonDocument() .append("keyId", new BsonNull()) .append("path", new BsonString("patientRecord.ssn")) .append("bsonType", new BsonString("string")) .append("queries", new BsonDocument() .append("queryType", new BsonString("equality"))), new BsonDocument() .append("keyId", new BsonNull()) .append("path", new BsonString("patientRecord.billing")) .append("bsonType", new BsonString("object")))));
const encryptedFieldsMap = { encryptedFields: { fields: [ { path: "patientRecord.ssn", bsonType: "string", queries: { queryType: "equality" }, }, { path: "patientRecord.billing", bsonType: "object", }, ], }, };
encrypted_fields_map = { "fields": [ { "path": "patientRecord.ssn", "bsonType": "string", "queries": [{"queryType": "equality"}] }, { "path": "patientRecord.billing", "bsonType": "object", } ] }
注意
前のコード例では、「ssn」フィールドと「 Billing 」フィールドの両方が暗号化されていますが、クエリは「ssn」フィールドのみです。
コレクションの作成
暗号化ヘルパー メソッドの API にアクセスするには、 ClientEncryption
をインスタンス化します。
const clientEncryption = encryptedClient.getClientEncryption()
var clientEncryptionOptions = new ClientEncryptionOptions( keyVaultClient: keyVaultClient, keyVaultNamespace: keyVaultNamespace, kmsProviders: kmsProviderCredentials ); var clientEncryption = new ClientEncryption(clientEncryptionOptions);
opts := options.ClientEncryption(). SetKeyVaultNamespace(keyVaultNamespace). SetKmsProviders(kmsProviderCredentials) clientEncryption, err := mongo.NewClientEncryption(encryptedClient, opts) if err != nil { panic(fmt.Sprintf("Unable to create a ClientEncryption instance due to the following error: %s\n", err)) }
ClientEncryptionSettings clientEncryptionSettings = ClientEncryptionSettings.builder() .keyVaultMongoClientSettings(MongoClientSettings.builder() .applyConnectionString(new ConnectionString(uri)) .build()) .keyVaultNamespace(keyVaultNamespace) .kmsProviders(kmsProviderCredentials) .build(); ClientEncryption clientEncryption = ClientEncryptions.create(clientEncryptionSettings);
const clientEncryption = new ClientEncryption(encryptedClient, autoEncryptionOptions);
client_encryption = ClientEncryption( kms_providers=kms_provider_credentials, key_vault_namespace=key_vault_namespace, key_vault_client=encrypted_client, codec_options=CodecOptions(uuid_representation=STANDARD) )
ClientEncryption
クラスからアクセスされる暗号化ヘルパー メソッドを使用して、暗号化されたコレクションを作成します。 このメソッドは、暗号化されたフィールドのデータ暗号化キーを自動的に生成し、暗号化されたコレクションを作成します。
await clientEncryption.createEncryptedCollection( encryptedDatabaseName, encryptedCollectionName, { provider: kmsProviderName, createCollectionOptions: encryptedFieldsMap, masterKey: customerMasterKeyCredentials, } );
このチュートリアルの C# バージョンでは、ドキュメント構造を表すためのデータモデルとして個別の クラスを使用します。 次のPatient
、 PatientRecord
、 PatientBilling
クラスをプロジェクトに追加します。
using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; [ ]public class Patient { public ObjectId Id { get; set; } public string Name { get; set; } public PatientRecord Record { get; set; } }
public class PatientRecord { public string Ssn { get; set; } public PatientBilling Billing { get; set; } }
public class PatientBilling { public string CardType { get; set; } public long CardNumber { get; set; } }
これらのクラスを追加したら、 ClientEncryption
クラスからアクセスされる暗号化ヘルパー メソッドを使用して暗号化されたコレクションを作成します。 このメソッドは、暗号化されたフィールドのデータ暗号化キーを自動的に生成し、暗号化されたコレクションを作成します。
var createCollectionOptions = new CreateCollectionOptions<Patient> { EncryptedFields = encryptedFields }; clientEncryption.CreateEncryptedCollection(patientDatabase, encryptedCollectionName, createCollectionOptions, kmsProviderName, customerMasterKeyCredentials);
Tip
データベースとデータベース名
暗号化されたコレクションを作成するメソッドには、データベース名ではなく 、データベースオブジェクトへの参照が必要です。 この参照は、クライアント オブジェクトで メソッドを使用して取得できます。
このチュートリアルのGoバージョンでは、データモデルを使用してドキュメント構造を表します。 コレクション内のデータを表すには、次の構造体をプロジェクトに追加します。
type PatientDocument struct { PatientName string `bson:"patientName"` PatientID int32 `bson:"patientId"` PatientRecord PatientRecord `bson:"patientRecord"` }
type PatientRecord struct { SSN string `bson:"ssn"` Billing PaymentInfo `bson:"billing"` }
type PaymentInfo struct { Type string `bson:"type"` Number string `bson:"number"` }
これらのクラスを追加したら、 ClientEncryption
クラスからアクセスされる暗号化ヘルパー メソッドを使用して暗号化されたコレクションを作成します。 このメソッドは、暗号化されたフィールドのデータ暗号化キーを自動的に生成し、暗号化されたコレクションを作成します。
createCollectionOptions := options.CreateCollection().SetEncryptedFields(encryptedFieldsMap) _, _, err = clientEncryption.CreateEncryptedCollection( context.TODO(), encryptedClient.Database(encryptedDatabaseName), encryptedCollectionName, createCollectionOptions, kmsProviderName, customerMasterKey, )
Tip
データベースとデータベース名
暗号化されたコレクションを作成するメソッドには、データベース名ではなく 、データベースオブジェクトへの参照が必要です。 この参照は、クライアント オブジェクトで メソッドを使用して取得できます。
ClientEncryption
クラスからアクセスされる暗号化ヘルパー メソッドを使用して、暗号化されたコレクションを作成します。 このメソッドは、暗号化されたフィールドのデータ暗号化キーを自動的に生成し、暗号化されたコレクションを作成します。
CreateCollectionOptions createCollectionOptions = new CreateCollectionOptions().encryptedFields(encryptedFieldsMap); CreateEncryptedCollectionParams encryptedCollectionParams = new CreateEncryptedCollectionParams(kmsProviderName); encryptedCollectionParams.masterKey(customerMasterKeyCredentials); try { clientEncryption.createEncryptedCollection( encryptedClient.getDatabase(encryptedDatabaseName), encryptedCollectionName, createCollectionOptions, encryptedCollectionParams); }
Tip
データベースとデータベース名
暗号化されたコレクションを作成するメソッドには、データベース名ではなく 、データベースオブジェクトへの参照が必要です。 この参照は、クライアント オブジェクトで メソッドを使用して取得できます。
注意
ClientEncryption のインポート
Node.js ドライバー v6.0 以降を使用する場合は、 mongodb
ClientEncryption
をインポートする必要があります。
以前のドライバー バージョンの場合は、 mongodb-client-encryption
ClientEncryption
をインポートします。
ClientEncryption
クラスからアクセスされる暗号化ヘルパー メソッドを使用して、暗号化されたコレクションを作成します。 このメソッドは、暗号化されたフィールドのデータ暗号化キーを自動的に生成し、暗号化されたコレクションを作成します。
await clientEncryption.createEncryptedCollection( encryptedDatabase, encryptedCollectionName, { provider: kmsProviderName, createCollectionOptions: encryptedFieldsMap, masterKey: customerMasterKeyCredentials, } );
Tip
データベースとデータベース名
暗号化されたコレクションを作成するメソッドには、データベース名ではなく 、データベースオブジェクトへの参照が必要です。 この参照は、クライアント オブジェクトで メソッドを使用して取得できます。
ClientEncryption
クラスからアクセスされる暗号化ヘルパー メソッドを使用して、暗号化されたコレクションを作成します。 このメソッドは、暗号化されたフィールドのデータ暗号化キーを自動的に生成し、暗号化されたコレクションを作成します。
client_encryption.create_encrypted_collection( encrypted_client[encrypted_database_name], encrypted_collection_name, encrypted_fields_map, kms_provider_name, customer_master_key_credentials, )
Tip
データベースとデータベース名
暗号化されたコレクションを作成するメソッドには、データベース名ではなく 、データベースオブジェクトへの参照が必要です。 この参照は、クライアント オブジェクトで メソッドを使用して取得できます。
暗号化されたフィールドを含むドキュメントの挿入
ユーザの個人情報を説明するサンプルドキュメントを作成します。 次の例に示すように、暗号化されたクライアントを使用して、 patients
コレクションに挿入します。
const patientDocument = { patientName: "Jon Doe", patientId: 12345678, patientRecord: { ssn: "987-65-4320", billing: { type: "Visa", number: "4111111111111111", }, }, }; const encryptedCollection = encryptedClient.getDB(encryptedDatabaseName).getCollection(encryptedCollectionName); const insertResult = await encryptedCollection.insertOne(patientDocument);
ユーザの個人情報を説明するサンプルドキュメントを作成します。 次の例に示すように、暗号化されたクライアントを使用して、 patients
コレクションに挿入します。
var patient = new Patient { Name = "Jon Doe", Id = new ObjectId(), Record = new PatientRecord { Ssn = "987-65-4320", Billing = new PatientBilling { CardType = "Visa", CardNumber = 4111111111111111 } } }; var encryptedCollection = encryptedClient.GetDatabase(encryptedDatabaseName). GetCollection<Patient>(encryptedCollectionName); encryptedCollection.InsertOne(patient);
ユーザの個人情報を説明するサンプルドキュメントを作成します。 次の例に示すように、暗号化されたクライアントを使用して、 patients
コレクションに挿入します。
patientDocument := &PatientDocument{ PatientName: "John Doe", PatientID: 12345678, PatientRecord: PatientRecord{ SSN: "987-65-4320", Billing: PaymentInfo{ Type: "Visa", Number: "4111111111111111", }, }, } coll := encryptedClient.Database(encryptedDatabaseName).Collection(encryptedCollectionName) _, err = coll.InsertOne(context.TODO(), patientDocument) if err != nil { panic(fmt.Sprintf("Unable to insert the patientDocument: %s", err)) }
このチュートリアルでは、ドキュメント構造を表すデータモデルとして POJO を使用します。 POJO を使用するようにアプリケーションを設定するには、次のコードを追加します。
CodecProvider pojoCodecProvider = PojoCodecProvider.builder().automatic(true).build(); CodecRegistry pojoCodecRegistry = fromRegistries(getDefaultCodecRegistry(), fromProviders(pojoCodecProvider));
Java POJO について詳しくは、 Wikipedia で Plain Old Java Object に関する記事を参照してください。
このチュートリアルでは、次の POJO を使用します。
Patient
PatientRecord
PatientBilling
これらのクラスは 、完全な Java アプリケーションのモデル パッケージで表示できます。
これらの POJO クラスをアプリケーションに追加します。 次に、対象の個人情報を記述するPatient
のインスタンスを作成します。 次の例に示すように、暗号化されたクライアントを使用して、 patients
コレクションに挿入します。
MongoDatabase encryptedDb = encryptedClient.getDatabase(encryptedDatabaseName).withCodecRegistry(pojoCodecRegistry); MongoCollection<Patient> collection = encryptedDb.getCollection(encryptedCollectionName, Patient.class); PatientBilling patientBilling = new PatientBilling("Visa", "4111111111111111"); PatientRecord patientRecord = new PatientRecord("987-65-4320", patientBilling); Patient patientDocument = new Patient("Jon Doe", patientRecord); InsertOneResult result = collection.insertOne(patientDocument);
ユーザの個人情報を説明するサンプルドキュメントを作成します。 次の例に示すように、暗号化されたクライアントを使用して、 patients
コレクションに挿入します。
const patientDocument = { patientName: "Jon Doe", patientId: 12345678, patientRecord: { ssn: "987-65-4320", billing: { type: "Visa", number: "4111111111111111", }, }, }; const encryptedCollection = encryptedClient .db(encryptedDatabaseName) .collection(encryptedCollectionName); const result = await encryptedCollection.insertOne(patientDocument);
ユーザの個人情報を説明するサンプルドキュメントを作成します。 次の例に示すように、暗号化されたクライアントを使用して、 patients
コレクションに挿入します。
patient_document = { "patientName": "Jon Doe", "patientId": 12345678, "patientRecord": { "ssn": "987-65-4320", "billing": { "type": "Visa", "number": "4111111111111111", }, }, } encrypted_collection = encrypted_client[encrypted_database_name][encrypted_collection_name] result = encrypted_collection.insert_one(patient_document)
暗号化されたフィールドに対するクエリ
次のコード サンプルでは、暗号化されたフィールドに対して検索クエリを実行し、復号化されたデータを出力します。
const findResult = await encryptedCollection.findOne({ "patientRecord.ssn": "987-65-4320", }); console.log(findResult);
var ssnFilter = Builders<Patient>.Filter.Eq("record.ssn", patient.Record.Ssn); var findResult = await encryptedCollection.Find(ssnFilter).ToCursorAsync(); Console.WriteLine(findResult.FirstOrDefault().ToJson());
var findResult PatientDocument err = coll.FindOne( context.TODO(), bson.M{"patientRecord.ssn": "987-65-4320"}, ).Decode(&findResult)
Patient findResult = collection.find( new BsonDocument() .append("patientRecord.ssn", new BsonString("987-65-4320"))) .first(); System.out.println(findResult);
const findResult = await encryptedCollection.findOne({ "patientRecord.ssn": "987-65-4320", }); console.log(findResult);
find_result = encrypted_collection.find_one({ "patientRecord.ssn": "987-65-4320" }) print(find_result)
上記のコード サンプルの出力は、次のようになります。
{ "_id": { "$oid": "648b384a722cb9b8392df76a" }, "name": "Jon Doe", "record": { "ssn": "987-65-4320", "billing": { "type": "Visa", "number": "4111111111111111" } }, "__safeContent__": [ { "$binary": { "base64": "L1NsYItk0Sg+oL66DBj6IYHbX7tveANQyrU2cvMzD9Y=", "subType": "00" } } ] }
警告
MongoDB_ENUS_JAJP フィールドを変更しないでください
__safeContent__
フィールドは Queryable Encryption に必須です。 このフィールドの内容は変更しないでください。
詳細
Queryable Encryptionの仕組みについては、「基礎 」を参照してください。
このガイドで言及されているトピックについて詳しくは、次のリンクを参照してください。
Queryable Encryption コンポーネントの詳細については、リファレンスページを参照してください。
カスタマー マスター キーとデータ暗号化キーの仕組みについては、「キーとキーヴォールト」ページを参照してください。
KMS プロバイダーが Queryable Encryption キーを管理する方法については、 KMS プロバイダーのページで確認してください。