En esta guía, puedes aprender a gestionar tus colecciones cifradas y los costes de almacenamiento y escritura de Queryable Encryption.
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 en texto sin formato dado siempre se cifra en un texto cifrado diferente, aunque sigue siendo consultable. Para habilitar esta funcionalidad, Queryable Encryption utiliza cuatro estructuras de datos:
Tres colecciones de metadatos
Un campo en cada documento de la colección cifrada llamado
__safeContent__
Importante
Es fundamental que estas estructuras de datos no se modifiquen ni eliminen, o los resultados de la consulta serán incorrectos.
Colecciones de metadatos
Cuando creas una colección cifrada usando Queryable Encryption, MongoDB crea tres colecciones de metadatos:
enxcol_.<collectionName>.escllamadoESCenxcol_.<collectionName>.eccllamadoECCenxcol_.<collectionName>.ecocllamadoECOC
Ejemplo
Si crea una colección llamada "pacientes", MongoDB crea las siguientes colecciones de metadatos:
enxcol_.patients.escenxcol_.patients.eccenxcol_.patients.ecoc
Cuando se insertan documentos con campos cifrados sobre los que se desea consultar, MongoDB actualiza las colecciones de metadatos para mantener un índice que permita la query. MongoDB se refiere a esto como "campo indexado". Esto tiene un costo en términos de almacenamiento y velocidad de escritura.
Costos de almacenamiento
Los costos de almacenamiento y escritura aumentan según la cantidad de campos indexados por documento.
Importante
Presentación técnica
La recomendación de MongoDB durante la vista previa técnica es esperar de dos a tres veces el requisito de almacenamiento para una colección de Queryable Encryption y las colecciones de metadatos asociadas. Por ejemplo, una colección de 1 GB puede requerir entre 2 y 3 GB de almacenamiento para las colecciones de metadatos asociadas.
Esta orientación será ajustada en una futura actualización.
Costos de escritura
Operaciones de inserción
Al insertar un documento, cada campo indexado requiere dos escrituras en las colecciones de metadatos.
Una grabación sobre
ESCUna grabación sobre
ECOC
Ejemplo
Para insertar un documento con dos campos indexados se 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 cuatro escrituras en las colecciones de metadatos.
Una grabación sobre
ESCUna grabación sobre
ECCDos guardados a
ECOC
Ejemplo
Actualizar un documento con dos campos indexados requiere:
Un guardado en la colección cifrada.
Ocho escribe en las colecciones de metadatos.
Operaciones de borrar
Al borrar un documento, cada campo indexado requiere dos guardados en las colecciones de metadatos.
Una grabación sobre
ECCUna grabación sobre
ECOC
Ejemplo
Para eliminar un documento con dos campos indexados se requiere:
Una operación de guardar en la colección cifrada.
Cuatro escrituras en las colecciones de metadatos.
Compactación de índices
Importante
Presentación técnica
Debes ejecutar la compactación de índices durante la vista previa técnica. MongoDB planea ejecutar automáticamente la compactación de índices en una próxima versión.
A medida que se insertan, actualizan y borran documentos, las colecciones de metadatos cambian y crecen. La compactación de índices es un proceso que recorta las colecciones de metadatos y reduce su tamaño.
Debe ejecutar la compactación de índice cuando el tamaño de ECOC supere 1 GB.
Puedes comprobar el tamaño de tus colecciones usando mongosh y ejecutando el comando db.collection.totalSize().
Ejemplo
En este ejemplo, la colección cifrada se llama "pacientes".
db.enxcol_.patients.ecoc.totalSize()
1407960328
Importante
Debe configurar su cliente para cifrado consultable para ejecutar la compactación de índice.
Para ejecutar la compactación de índice, utilice y ejecute mongosh el db.collection.compactStructuredEncryptionData() comando para reducir el tamaño de las colecciones de metadatos.
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, ... }