En esta guía, puedes aprender a gestionar tus colecciones cifradas y los costes de almacenamiento y escritura de Queryable Encryption.
Overview
El cifrado consultable presenta la capacidad de cifrar campos confidenciales en sus documentos mediante cifrado aleatorio, sin dejar de poder 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>.esc, conocido comoESCenxcol_.<collectionName>.ecc, conocido comoECCenxcol_.<collectionName>.ecoc, conocido comoECOC
Ejemplo
Si crea una colección llamada "pacientes", MongoDB crea las siguientes colecciones de metadatos:
enxcol_.patients.escenxcol_.patients.eccenxcol_.patients.ecoc
Al insertar documentos con campos cifrados que desea consultar, MongoDB actualiza las colecciones de metadatos para mantener un índice que le permita realizar consultas. MongoDB lo denomina "campo indexado". Esto implica un consumo 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
Vista previa 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 colecciones de metadatos.
Uno escribe a
ESCUno escribe a
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 colecciones de metadatos.
Uno escribe a
ESCUno escribe a
ECCDos escrituras a
ECOC
Ejemplo
Para actualizar un documento con dos campos indexados se requiere:
Un guardado en la colección cifrada.
Ocho escrituras en las colecciones de metadatos.
Operaciones de borrar
Al eliminar un documento, cada campo indexado requiere dos escrituras en las colecciones de metadatos.
Uno escribe a
ECCUno escribe a
ECOC
Ejemplo
Para eliminar un documento con dos campos indexados se requiere:
Una escritura en la colección cifrada.
Cuatro escrituras en las colecciones de metadatos.
Compactación de índices
Importante
Vista previa técnica
Es necesario ejecutar la compactación de índice durante la vista previa técnica. MongoDB planea ejecutar la compactación de índice automáticamente en una versión futura.
A medida que se insertan, actualizan y eliminan documentos, las colecciones de metadatos cambian y crecen. La compactación de índices es un proceso que reduce las colecciones de metadatos y su tamaño.
Debe ejecutar la compactación de índice cuando el tamaño de ECOC exceda 1 GB.
Puede comprobar el tamaño de sus colecciones utilizando y emitiendo mongosh el db.collection.totalSize() comando.
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, ... }