客户端字段级加密 (Client-Side Field Level Encryption)
客户端字段级加密 (Client-Side Field Level Encryption)
MongoDB新增功能4.2 除了其他MongoDB加密功能外,客户端字段级加密(CSFLE) 还允许管理员和开发者加密特定数据字段。
使用 CSFLE,开发者可以加密客户端字段,而无需任何服务器端配置或指令。 客户端字段级加密支持应用程序必须保证包括服务器管理员在内的未经授权方无法读取加密数据的工作负载。
有关 CSFLE 的概述,请阅读手册中的MongoDB官方文档。
安装
libmongocrypt
客户端字段级加密依赖于名为libmongocrypt
的C库来完成繁重的加密工作。 此依赖项由C驾驶员托管。 只要C驾驶员安装版本为1.16.0或更高版本,并且已使用 客户端字段级加密支持进行编译,则应在内部托管此依赖项。 请参阅C驱动程序的 使用客户端字段级加密 以了解更多信息。
mongocryptd
自动 CSFLE 依赖于在驱动程序运行时作为守护进程运行的名为mongocryptd
的新二进制文件。 此二进制文件仅适用于 MongoDB Enterprise。
mongocryptd
可以与驱动程序分开启动,也可以在使用加密时自动生成。
要单独运行 mongocryptd,请将mongocryptdBypassSpawn
标志传递给客户端的自动加密选项:
auto mongocryptd_options = make_document(kvp("mongocryptdBypassSpawn", true)); options::auto_encryption auto_encrypt_opts{}; auto_encrypt_opts.extra_options({mongocryptd_options.view()});
如果 mongocryptd 二进制文件位于当前路径上,则驱动程序将能够在没有任何自定义标志的情况下生成它。 但是,如果 mongocryptd 二进制文件位于不同路径上,请使用mongocryptdSpawnPath
选项设置路径:
auto mongocryptd_options = make_document(kvp("mongocryptdSpawnPath", "path/to/mongocryptd")); options::auto_encryption auto_encrypt_opts{}; auto_encrypt_opts.extra_options({mongocryptd_options.view()});
示例
自动客户端字段级加密
通过创建mongocxx::client
来启用自动客户端字段级加密,并将auto_encryption_opts
选项设置为mongocxx::options::auto_encryption
的实例。 以下示例展示了如何使用mongocxx::client_encryption
类设置自动客户端字段级加密,以创建新的加密数据密钥。
注意
客户端字段级自动加密需要 MongoDB 4.2企业版或 MongoDB 4.2 Atlas 集群。 服务器的社区版本支持自动解密以及显式客户端字段级加密。
提供本地自动加密规则
以下示例演示如何通过 schema_map 选项指定自动加密规则。 自动加密规则使用JSON schema 语法的严格子集来表示。
与依赖从服务器获取的 JSON schemas 相比,提供schema_map
提供了更高的安全性。 它可以防止恶意服务器宣传虚假 JSON schema,这种情况可能会诱骗客户端发送应加密的未加密数据。
schema_map
中提供的 JSON schema仅适用于配置自动客户端字段级加密。 JSON schema中的其他验证规则不会由驱动程序执行,并会导致错误。
// // The schema map has the following form: // // { // "test.coll" : { // "bsonType" : "object", // "properties" : { // "encryptedFieldName" : { // "encrypt" : { // "keyId" : [ <datakey as UUID> ], // "bsonType" : "string", // "algorithm" : <algorithm> // } // } // } // } // } //
请参阅 examples/mongocxx/automatic_client_side_field_level_encryption.cpp JSON schema有关如何设立用于自动加密的 的完整示例。
服务器端字段级加密实施
MongoDB 4.2服务器支持使用模式验证来强制对集合中的特定字段进行加密。 此模式验证将防止应用程序为任何标有"encrypt"
JSON schema关键字的字段插入未加密的值。
可以使用mongocxx::client_encryption
设立自动客户端字段级加密,创建新的加密数据密钥,并使用自动加密JSON schema事务语法创建集合。
// Please see the linked example below for full json_schema construction. bsoncxx::document::value json_schema{}; // Create the collection with the encryption JSON Schema. auto cmd = document{} << "create" << "coll" << "validator" << open_document << "$jsonSchema" << json_schema.view() << close_document << finalize; db.run_command(cmd.view());
请参阅 examples/mongocxx/server_side_field_level_encryption_enforcement.cpp 有关在服务器上设置强制加密的完整示例。
显式加密
显式加密是MongoDB Community的一项功能,不使用 mongocryptd
进程。 显式加密由mongocxx::client_encryption
类提供。
// Explicitly encrypt a BSON value. auto to_encrypt = bsoncxx::types::bson_value::make_value("secret message"); auto encrypted_message = client_encryption.encrypt(to_encrypt, encrypt_opts); // Explicitly decrypt a BSON value. auto decrypted_message = client_encryption.decrypt(encrypted_message);
请参阅 examples/mongocxx/explicit_encryption.cpp 有关使用显式加密和解密的完整示例。
带自动解密的显式加密
虽然自动加密需要 MongoDB 4.2企业版或 MongoDB 4.2 Atlas 集群,支持所有用户自动解密。 要配置自动解密而不自动加密,请在options::auto_encryption
类中设置bypass_auto_encryption=True
。
options::auto_encryption auto_encrypt_opts{}; auto_encrypt_opts.bypass_auto_encryption(true); // Please see full example for complete options construction. // Create a client with automatic decryption enabled, but automatic encryption bypassed. options::client client_opts{}; client_opts.auto_encryption_opts(std::move(auto_encrypt_opts)); class client client_encrypted {uri{}, std::move(client_opts)};
请参阅 examples/mongocxx/explicit_encryption_auto_decryption.cpp 有关使用显式加密和自动解密的示例。