Gerenciamento de collection criptografada
Nesta página
É importante que você entenda os custos de desempenho e armazenamento da criptografia em nível de campo. Cada campo criptografado:
Adiciona gravações para inserir e atualizar operações.
Requer armazenamento adicional, pois o MongoDB mantém um índice de campo criptografado.
Esta seção lista as gravações por operação e explica como compactar índices de collection criptografados para minimizar os custos de gravação e armazenamento.
Visão geral
O Queryable Encryption introduz a capacidade de criptografar campo confidenciais em seu documento usando criptografia aleatória, enquanto ainda pode query os campo criptografados.
Com o Queryable Encryption, um determinado valor de texto simples sempre é criptografado para um texto cifrado diferente, enquanto ainda permanece consultável. Para habilitar essa funcionalidade, o Queryable Encryption usa três estruturas de dados:
Duas collection de metadados
Um campo em cada documento na collection criptografada chamado
__safeContent__
Importante
É fundamental que essas estruturas de dados não sejam modificadas ou excluídas, ou os resultados da query estarão incorretos.
collection de metadados
Quando você cria uma collection criptografada, o MongoDB cria duas collection de metadados:
enxcol_.<collectionName>.esc
, denominadoESC
enxcol_.<collectionName>.ecoc
, denominadoECOC
Exemplo
Se você criar uma collection chamada "clientes", o MongoDB criará as seguintes collection de metadados:
enxcol_.patients.esc
enxcol_.patients.ecoc
Quando você insere documento com um campo criptografado que pode ser consultado, o MongoDB atualiza a collection de metadados para manter um índice que permite a consulta. O campo se torna um "campo indexado". Isso tem um custo em armazenamento e velocidade de gravação para cada um desses campos.
Descartando collection criptografadas
Ao descartar uma collection criptografada, elimine as collection de metadados associadas enxcol_.<collectionName>.esc
e enxcol_.<collectionName>.ecoc
imediatamente em seguida. Caso contrário, recriar a collection com o mesmo nome coloca a collection de metadados em um estado conflitante que consome um excesso de espaço de armazenamento e degrada o desempenho do CRUD.
Custos de Armazenamento
Os custos de armazenamento e gravação aumentam com base no número de campos indexados por documento.
Importante
Espere que uma Queryable Encryption tenha 2 a 3 vezes os requisitos de armazenamento do documento, para levar em conta a collection de metadados. Por exemplo, uma collection de 1 GB pode ter um requisito de armazenamento de 2 a 3 GB.
Custos de gravação
Inserir operações
Ao inserir um documento, cada campo indexado exige duas gravações adicionais em collection de metadados.
Uma gravação para
ESC
Uma gravação para
ECOC
Exemplo
A inserção de um documento com dois campos indexados requer:
Uma gravação na coleção criptografada.
quatro gravações na collection de metadados.
Atualizar operações
Ao atualizar um documento, cada campo indexado exige duas gravações adicionais para collection de metadados.
Uma gravação para
ESC
Uma gravação para
ECOC
Exemplo
Atualizar um documento com dois campos indexados requer:
Uma gravação na coleção criptografada.
quatro gravações na collection de metadados.
Excluir operações
Ao excluir um documento, os campos indexados não exigem gravações adicionais.
compactação da collection de metadados
À medida que você insere ou atualiza documento, a collection de metadados muda e cresce. A compactação da collection de metadados remove a collection de metadados e reduz seu tamanho.
Importante
Você deve executar manualmente a compactação da collection de metadados. A compactação só funciona em clientes configurados para Queryable Encryption.
Executar a compactação quando o tamanho do ECOC
exceder 1 GB.
Você pode verificar o tamanho de suas coleções utilizando mongosh
e emitindo o comando db.collection.totalSize()
.
Exemplo
Neste exemplo, a collection criptografada é chamada de "pacients".
db.enxcol_.patients.ecoc.totalSize()
1407960328
Para executar a compactação da coleção de metadados , utilize o mongosh
e execute o comando db.collection.compactStructuredEncryptionData()
para reduzir o tamanho das coletas de metadados.
Exemplo
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, ... }