El cifrado a nivel de campo conlleva costos de rendimiento y almacenamiento. Cada campo que elijas cifrar:
Agrega guardados a las operaciones de inserción y actualización.
Requiere almacenamiento adicional, ya que MongoDB mantiene un índice de los campos cifrados para mejorar el rendimiento de las consultas.
Esta sección resume el impacto de almacenamiento y escritura de cifrar colecciones, y explica cómo compactar los índices de las colecciones cifradas para minimizar estos costes. Si desea cifrar campos y configurarlos para consultarlos, consulte Campos cifrados y consultas habilitadas.
Overview
Queryable Encryption introduce la capacidad de cifrar campos sensibles en tus documentos utilizando cifrado aleatorizado, al mismo tiempo que puedes consultar los campos cifrados.
Con Queryable Encryption, un valor de texto sin formato dado siempre se cifra en un texto cifrado diferente, aunque siga siendo consultable. Para habilitar esta funcionalidad, Queryable Encryption utiliza tres estructuras de datos:
Dos colecciones de metadatos
Un campo en cada documento de la colección cifrada llamado
__safeContent__
Advertencia
Es fundamental que estas estructuras de datos no se modifiquen ni se borren; de lo contrario, los resultados de las queries serán incorrectos.
Colecciones de metadatos
Cuando creas una colección encriptada, MongoDB crea dos colecciones de metadatos:
enxcol_.<collectionName>.escllamadoESCenxcol_.<collectionName>.ecocllamadoECOC
Ejemplo
Si crea una colección llamada "pacientes", MongoDB crea las siguientes colecciones de metadatos:
enxcol_.patients.escenxcol_.patients.ecoc
Al insertar documentos con un campo encriptado consultable, MongoDB actualiza las colecciones de metadatos para mantener un índice que permita la consulta. El campo se convierte en un "campo indexado". Esto genera un costo en almacenamiento y velocidad de escritura para cada campo de este tipo.
Importante
Cuando descartas una colección cifrada, descarta inmediatamente las colecciones de metadatos relacionadas:
enxcol_.<collectionName>.escenxcol_.<collectionName>.ecoc
De lo contrario, recrear la colección con el mismo nombre pone a las colecciones de metadatos en un estado de conflicto que consume espacio de almacenamiento excesivo y degrada el rendimiento de las operaciones CRUD.
Igualdad e impacto de query de rango
Las **query** de igualdad generan **costos** adicionales fijos para las operaciones de **almacenamiento** y escritura. Los costos de la consulta por rango dependen de los parámetros del campo consultable. Restringir estrictamente estas consultas disminuye en gran medida su impacto en el rendimiento.
Guardar Costos para Campos de Igualdad Consultables
Operaciones de inserción
Al insertar un documento, cada campo indexado requiere dos escrituras adicionales en colecciones de metadatos.
Una grabación sobre
ESCUna grabación sobre
ECOC
Ejemplo
Insertar un documento con dos campos indexados requiere:
Un guardado en la colección cifrada.
Cuatro escrituras en las colecciones de metadatos.
Operaciones de actualizar
Al actualizar un documento, cada campo indexado requiere dos escrituras adicionales en las colecciones de metadatos.
Una grabación sobre
ESCUna grabación sobre
ECOC
Ejemplo
Actualizar un documento con dos campos indexados requiere:
Un guardado en la colección cifrada.
Cuatro escrituras en las colecciones de metadatos.
Operaciones de borrar
Al borrar un documento, los campos indexados no requieren escrituras adicionales.
Costos de almacenamiento para campos consultables de igualdad
Antes de cualquier compactación de metadatos, el ESC y el ECOC contienen un documento de metadatos para cada par campo/valor de cada campo indexado. Indexación un par de campo/valor cifrado en 1000 documentos requiere 1000 documentos en el ESC y 1000 documentos en el ECOC.
Nota
Una colección de Queryable Encryption que cifra todos los campos puede requerir hasta 2-3 veces el espacio de almacenamiento para acomodar colecciones de metadatos. Por ejemplo, una colección de 1 GB puede tener un requisito de almacenamiento de 2-3 GB.
Mejores prácticas
No cifres los campos que no lo necesiten. La mayoría de los datos solo requieren que un pequeño subconjunto de campos sea cifrado, como aquellos que contienen información personal identificable.
No habilites consultas por rango en un campo si las consultas de igualdad son suficientes para tus usuarios.
Para los campos cifrados con consultas de rango habilitadas, revisa la configuración del campo, especialmente los parámetros mínimo, máximo, y precisión. Establecer límites precisos en las consultas de rango reduce considerablemente el impacto que estos campos tienen en el rendimiento.
Modela tus datos y crea un prototipo para determinar los aumentos reales de almacenamiento y guardado para tu implementación.
Compactación de la colección de metadatos
A medida que insertas o actualizas documentos, las colecciones de metadatos cambian y crecen. La compactación de la colección de metadatos vacía el ECOC y reduce el tamaño del ESC.
Programación de compactación de metadatos
Importante
En el peor de los casos, ejecutar la compactación de metadatos revela el número de pares únicos de campo/valor insertados en todos los documentos desde la compactación anterior.
Para obtener detalles sobre la información exacta que revela la compactación de metadatos, consulta «Sección 6: Análisis teórico» y «Sección 9: Directrices» en el Artículo técnico de Queryable Encryption de MongoDB.
Como mejores prácticas, lleva un control de la siguiente información:
encfields: el número de campos cifrados por documento.docinserts: el número de documentos insertados desde la última compactación.valinserts: el número de pares únicos de campo/valor insertados desde la última compactación.
Para reducir el tamaño de la colección de metadatos ESC en al menos t documentos, ejecute la compactación de metadatos cuando se cumpla la siguiente fórmula:
(encfields · docinserts) - valinserts ≥ t
El número de campos cifrados por documento multiplicado por el número de inserciones desde la última compactación, menos el número de pares campo/valor únicos insertados en todos los documentos desde la última compactación, debe ser mayor o igual que el número de documentos a eliminar del ESC.
Ejemplo
Por ejemplo, en una colección con seis campos cifrados, puedes reducir el tamaño de ESC en al menos 1000 documentos cuando el total de documentos insertados y los pares únicos de campo/valor insertados desde la última compactación cumplan las siguientes condiciones:
(6 · docinserts) - valinserts ≥ 1000
La fórmula se satisfaría, por ejemplo, si se insertaran 200 documentos desde la última compactación con un total de 200 pares únicos de campo/valor en todos los documentos, o si se insertaran 400 documentos desde la última compactación con 700 pares únicos de campo/valor.
Ejecución de la compactación de metadatos
Se debe ejecutar manualmente la compactación de metadatos. Use mongosh y ejecute el comando db.collection.compactStructuredEncryptionData():
Ejemplo
const eDB = "encryption" const eKV = "__keyVault" const secretDB = "records" const secretCollection = "patients" const localKey = fs.readFileSync("master-key.txt") const localKeyProvider = { key: localKey } const queryableEncryptionOpts = { kmsProviders: { local: localKeyProvider }, keyVaultNamespace: `${eDB}.${eKV}`, } const encryptedClient = Mongo("localhost:27017", queryableEncryptionOpts) const encryptedDB = encryptedClient.getDB(secretDB) const encryptedCollection = encryptedDB.getCollection(secretCollection) encryptedCollection.compactStructuredEncryptionData()
{ "stats": { ... }, "ok": 1, ... }
Puedes comprobar el tamaño de una colección de metadatos utilizando mongosh y ejecutando el comando db.collection.totalSize().
Ejemplo
En este ejemplo, la colección cifrada se llama "pacientes".
db.enxcol_.patients.esc.totalSize()
1407960328