Encriptación a nivel de campo
Novedades en MongoDB 4.2 El cifrado a nivel de campo del lado del cliente (CSFLE) permite a los administradores y desarrolladores cifrar campos de datos específicos además de otras funciones de cifrado de MongoDB.
Con CSFLE, los desarrolladores pueden cifrar campos del lado del cliente sin necesidad de configuración ni directivas del lado del servidor. El cifrado a nivel de campo del lado del cliente admite cargas de trabajo donde las aplicaciones deben garantizar que terceros no autorizados, incluidos los administradores del servidor, no puedan leer los datos cifrados.
Para obtener una descripción general de CSFLE, lea la documentación oficial de MongoDB en el manual.
Instalación
libmongocrypt
El cifrado a nivel de campo del lado del cliente se basa en una biblioteca de C llamada libmongocrypt para realizar la mayor parte del cifrado. Esta dependencia la gestiona el controlador de C. Siempre que la instalación del controlador de C sea 1.16.0 o superior y se haya compilado con compatibilidad con el cifrado a nivel de campo del lado del cliente, esta dependencia debería gestionarse internamente. Consulte la guía de cifrado a nivel de campo del lado del cliente en la documentación del controlador de C para obtener más información.
mongocryptd
El CSFLE automático se basa en un nuevo binario llamado mongocryptd, que se ejecuta como demonio mientras el controlador está en funcionamiento. Este binario solo está disponible con MongoDB Enterprise.
mongocryptd puede iniciarse por separado del controlador o dejarse que se genere automáticamente cuando se utiliza cifrado.
Para ejecutar mongocryptd por separado, pase el indicador mongocryptdBypassSpawn a las opciones de cifrado automático del cliente:
auto mongocryptd_options = make_document(kvp("mongocryptdBypassSpawn", true)); options::auto_encryption auto_encrypt_opts{}; auto_encrypt_opts.extra_options({mongocryptd_options.view()});
Si el binario de mongocryptd se encuentra en la ruta actual, el controlador podrá generarlo sin indicadores personalizados. Sin embargo, si el binario de mongocryptd se encuentra en una ruta diferente, configure la ruta con la opción 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()});
Ejemplos
Cifrado automático a nivel de campo en el lado del cliente
El cifrado automático a nivel de campo del cliente se habilita creando un mongocxx::client con la opción auto_encryption_opts establecida en una instancia de mongocxx::options::auto_encryption. Los siguientes ejemplos muestran cómo configurar el cifrado automático a nivel de campo del cliente mediante la clase mongocxx::client_encryption para crear una nueva clave de datos de cifrado.
Nota
El cifrado automático a nivel de campo del lado del cliente requiere MongoDB 4.2 Enterprise o un clúster MongoDB 4.2 Atlas. La versión comunitaria del servidor admite el descifrado automático, así como el cifrado explícito a nivel de campo del lado del cliente.
Proporcionar reglas de cifrado automático local
El siguiente ejemplo muestra cómo especificar reglas de cifrado automático mediante la opción schema_map. Las reglas de cifrado automático se expresan mediante un subset estricto de la sintaxis del JSON Schema..
Proporcionar un schema_map ofrece mayor seguridad que depender de los esquemas JSON obtenidos del servidor. Protege contra servidores maliciosos que publicitan un esquema JSON falso, lo que podría engañar al cliente para que envíe datos sin cifrar que deberían estar cifrados.
Los esquemas JSON proporcionados en el schema_map solo se aplican a la configuración automática del cifrado a nivel de campo del lado del cliente. El driver no aplicará otras reglas de validación en el esquema JSON y causarán un error.
// // The schema map has the following form: // // { // "test.coll" : { // "bsonType" : "object", // "properties" : { // "encryptedFieldName" : { // "encrypt" : { // "keyId" : [ <datakey as UUID> ], // "bsonType" : "string", // "algorithm" : <algorithm> // } // } // } // } // } //
Consulte examples/mongocxx/automatic_client_side_field_level_encryption.cpp para obtener un ejemplo completo de cómo configurar un esquema json para el cifrado automático.
Aplicación del cifrado a nivel de campo del lado del servidor
El servidor MongoDB 4.2 admite la validación de esquemas para forzar el cifrado de campos específicos de una colección. Esta validación evitará que una aplicación inserte valores sin cifrar en los campos marcados con la palabra clave de esquema JSON "encrypt".
Es posible configurar el cifrado automático a nivel de campo del lado del cliente utilizando mongocxx::client_encryption para crear una nueva clave de datos de cifrado y crear una colección con la sintaxis de esquema JSON de cifrado automático.
// 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());
Consulte examples/mongocxx/server_side_field_level_encryption_enforcement.cpp para ver un ejemplo completo de cómo configurar la aplicación de cifrado en el servidor.
Cifrado explícito
El cifrado explícito es una función de la comunidad de MongoDB y no utiliza el proceso mongocryptd. Lo proporciona la clase 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);
Consulta examples/mongocxx/explicit_encryption.cpp para ver un ejemplo completo de cifrado y descifrado explícito.
Cifrado explícito con desencriptado automático
Aunque el cifrado automático requiere MongoDB 4.2 Enterprise o un clúster MongoDB 4.2 Atlas, el descifrado automático es compatible con todos los usuarios. Para configurar el descifrado automático sin cifrado automático, configure bypass_auto_encryption=True en la clase options::auto_encryption.
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)};
Por favor, consulta examples/mongocxx/explicit_encryption_auto_decryption.cpp para ver un ejemplo de cómo usar cifrado explícito con descifrado automático.