Coleções criptografadas
Nesta página
- Visão geral
- collection de metadados
- Impacto da query de igualdade e intervalo
- Custos de gravação para campos de query de igualdade
- Inserir operações
- Atualizar operações
- Excluir operações
- Custos de armazenamento para campos de query de igualdade
- Melhores práticas
- compactação da collection de metadados
- Agendamento de compactação de metadados
- Executando compactação de metadados
A criptografia em nível de campo vem com custos de desempenho e armazenamento. Cada campo que você escolher para criptografar:
Adiciona gravações para inserir e atualizar operações.
Requer armazenamento adicional, pois o MongoDB mantém um índice de campos criptografados para melhorar o desempenho da query.
Esta seção resume o armazenamento e o impacto de gravação da criptografia de coleções e explica como compactar índices de coleção criptografados para minimizar esses custos. Se você deseja criptografar campos e configurá-los para consulta, consulte Campos criptografados e consultas ativadas.
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__
Aviso
É 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.
Importante
Quando você descartar uma coleção criptografada, descarte as coleções de metadados associadas imediatamente em seguida:
enxcol_.<collectionName>.esc
enxcol_.<collectionName>.ecoc
Caso contrário, recriar a coleção com o mesmo nome coloca as coleções de metadados em um estado conflitante que consome excesso de espaço de armazenamento e degrada o desempenho do CRUD.
Impacto da query de igualdade e intervalo
Queries de igualdade acarretam custos adicionais fixos para operações de armazenamento e gravação. Os custos de query de faixa dependem dos parâmetros do campo que pode ser consultado. A delimitação hermética dessas queries diminui muito o impacto no desempenho .
Custos de gravação para campos de query de igualdade
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.
Custos de armazenamento para campos de query de igualdade
Antes de qualquer compactação de metadados, ESC
e ECOC
contêm um documento de metadados para cada campo/par de valor de cada campo indexado. A indexação de um par de campo/valores criptografados em 1000 documentos requer 1000 documentos nos ESC
e 1000 documentos no ECOC
.
Observação
Uma coleção do Queryable Encryption que criptografa todos os campo pode levar de 2a3 vezes o espaço de armazenamento, levando em conta as coleções de metadados. Por exemplo, uma collection 1 GB pode ter um requisito de armazenamento de 2a3 GB.
Melhores práticas
Não criptografe campos que não precisam dele. A maioria dos dados exige apenas que um pequeno subconjunto de campos seja criptografado, como aqueles que contêm informações de identificação pessoal.
Não habilite queries de intervalo em um campo se queries de igualdade forem suficientes para seus usuários.
Para campos criptografados com consultas de intervalo ativadas, revise a configuração do campo , especialmente os parâmetros mínimo, máximo e de precisão . A definição de limites rígidos para queries de intervalo diminui muito o impacto no desempenho desses campos.
Modele seus dados e faça um protótipo para determinar o armazenamento real e os aumentos de gravação para seu sistema.
compactação da collection de metadados
À medida que você insere ou atualiza documentos, as coleções de metadados mudam e crescem. A compactação da coleção de metadados vazia o ECOC
e reduz o tamanho do ESC
.
Agendamento de compactação de metadados
Importante
No pior caso, a execução da compactação de metadados revela o número de pares de campo/valor únicos inseridos em todos os documentos desde a compactação anterior.
Para obter detalhes sobre as informações exatas revelados pela compactação de metadados, consulte "Seção 6: Análise Theoretical" e "Seção 9: Diretivas" noDocumento técnico sobre Queryable Encryption do MongoDB .
Como prática recomendada, acompanhe as seguintes informações:
encfields
: o número de campos criptografados por documento.docinserts
: o número de documentos inseridos desde a última compactação.valinserts
: o número de pares de campo/valor únicos inseridos desde a última compactação.
Para reduzir o tamanho da coleção de metadados ESC
em pelo menos t
documentos, execute a compactação de metadados quando a fórmula a seguir for satisfeita:
(encfields
docinserts
) - valinserts
≥ t
O número de campos criptografados por documento multiplicado pelo número de inserções desde a última compactação, menos o número de pares de campo/valor inseridos em todos os documentos desde a última compactação, deve ser maior ou igual ao número de documentos a serem removidos do ESC
.
Exemplo
Por exemplo, em uma collection com seis campos criptografados, você pode reduzir o tamanho do ESC
em pelo menos 1000 documentos quando o total de documentos inseridos e os pares de campo/valor únicos inseridos desde a última compactação atenderem às seguintes condições:
(6 docinserts
) - valinserts
≥ 1000
A fórmula seria satisfeita, por exemplo, se 200 documentos fossem inseridos desde a última compactação com um total de 200 pares de campo/valor únicos em todos os documentos, ou se 400 documentos fossem inseridos desde a última compactação com 700 pares de campo/valor únicos.
Executando compactação de metadados
Você deve executar a compactação de metadados manualmente. Utilize o mongosh
e execute o comando db.collection.compactStructuredEncryptionData()
:
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, ... }
Você pode verificar o tamanho de uma coleção de metadados utilizando mongosh
e executando o comando db.collection.totalSize()
.
Exemplo
Neste exemplo, a collection criptografada é chamada de "pacients".
db.enxcol_.patients.esc.totalSize()
1407960328