客户端字段级加密
客户端字段级加密
自 MongoDB 4.2 版本新增客户端字段级加密(CSFLE) 允许管理员和开发人员除了其他 MongoDB 加密功能外,还可以加密特定的数据字段。
使用 CSFLE,开发人员可以在客户端加密字段,无需任何服务器端配置或指令。客户端字段级加密支持需要确保未经授权的各方,包括服务器管理员,无法读取加密数据的工作负载。
有关 CSFLE 的概述,请参阅手册中的官方 MongoDB 文档。
安装
libmongocrypt
客户端字段级加密依赖于一个名为 libmongocrypt
的 C 库来执行加密工作。这个依赖由 C 驱动程序管理。只要 C 驱动程序的安装版本为 1.16.0 或更高版本,并且已经编译了客户端字段级加密支持,这个依赖应该由内部管理。请参阅 C 驱动程序的 使用客户端字段级加密 以获取更多信息。
mongocryptd
自动 CSFLE 依赖于一个名为 mongocryptd
的新二进制文件,作为守护进程在驱动程序运行时运行。此二进制文件仅在 MongoDB 企业版中可用。
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()});
示例
自动客户端字段级加密
自动客户端字段级加密通过创建一个设置了 auto_encryption_opts
选项为 mongocxx::options::auto_encryption
实例的 mongocxx::client
来启用。以下示例展示了如何使用 mongocxx::client_encryption
类创建新的加密数据密钥来设置自动客户端字段级加密。
注意
自动客户端字段级加密需要 MongoDB 4.2 企业版或 MongoDB 4.2 Atlas 集群。服务器社区版本支持自动解密以及显式客户端字段级加密。
提供本地自动加密规则
以下示例展示了如何通过 schema_map 选项指定自动加密规则。自动加密规则使用 JSON Schema 语法的一个严格子集。 来表达。
提供 schema_map
比依赖于从服务器获得的 JSON Schema 提供更多的安全性。它可以防止恶意服务器广告虚假 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 架构的完整示例。
服务器端字段级加密强制执行
MongoDB 4.2 服务器支持使用模式验证来强制执行集合中特定字段的加密。这种模式验证将阻止应用程序为标记有 "encrypt"
JSON 模式关键字的任何字段插入未加密的值。
可以使用 mongocxx::client_encryption
设置自动客户端字段级加密,以创建一个新的加密数据密钥,并使用 自动加密 JSON 架构语法。
// 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社区的一个功能,不使用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以了解使用显式加密和自动解密示例。