Pular para o conteúdo
em repouso em trânsito em uso TLS no caminho com o certificado conferido o menos comum cifrado até na memória
em repouso em trânsito em uso TLS no caminho com o certificado conferido o menos comum cifrado até na memória

Criptografia em repouso e em trânsito — o que é e como ativar no Postgres e no MongoDB

De onde vem o termo, o que cada tipo protege (e o que não protege) e como ativar no RDS, no Postgres autogerenciado, no MongoDB Atlas e no MongoDB fora do Atlas.

Cesar Schutz21 min de leituraCódigo deste artigo no GitHub
Neste artigo

Outro dia, revisando a documentação de infraestrutura de um banco, encontrei esta linha sobre uma réplica de leitura:

Criptografada em repouso com KMS (StorageEncrypted=true), como a primária.

É o tipo de frase que aparece em todo documento de arquitetura, checklist de auditoria e questionário de segurança. Todo mundo marca “sim” e segue em frente. Mas vale entender o que ela garante, o que ela não garante e qual é a irmã dela, a criptografia em trânsito.

Neste post vou passar pelos dois conceitos e mostrar como ativar cada um no PostgreSQL (no RDS e fora dele) e no MongoDB (no Atlas e fora dele). No final, falo rapidamente de um terceiro tipo, bem menos comum: a criptografia em uso.

De onde vem o termo

“Criptografia em repouso” é a tradução literal de encryption at rest. Em segurança da informação, é comum separar o dado em três estados, porque cada um tem riscos diferentes e pede proteções diferentes:

EstadoEm inglêsOnde o dado estáProteção típica
Em repousoat restParado no disco, no backup, no snapshotCriptografia de disco, TDE
Em trânsitoin transit (ou in motion)Viajando pela redeTLS
Em usoin useNa memória, sendo processadoCriptografia no cliente, computação confidencial

“Repouso” é o dado descansando: gravado em algum lugar, esperando ser lido. Em português o termo soa um pouco estranho no começo, mas é o que aparece em normas e documentações traduzidas.

Criptografia em repouso

A ideia é simples: tudo o que o banco grava fica cifrado. Arquivos de dados, logs, backups e snapshots. Se alguém sair com o disco, copiar o volume ou conseguir um snapshot, vai encontrar só bytes sem sentido.

Na maioria das implementações ela é transparente: o banco (ou o storage por baixo dele) cifra ao gravar e decifra ao ler, e a aplicação não percebe nada. Não muda query, não muda driver. Quando é o próprio banco que cifra os arquivos, o recurso costuma se chamar TDE, de Transparent Data Encryption, como no Oracle e no SQL Server. No RDS, a criptografia acontece no storage, e a AWS não a chama de TDE (nota: é no storage, não no banco).

Onde entra o KMS

A frase do começo fala em KMS. O KMS (Key Management Service) é o cofre de chaves, e o esquema usado quase sempre é o de envelope encryption.

Na figura, o KMS, o banco e o disco ficam lado a lado, e os números seguem a ordem do que acontece: a chave de dados cifra o dado, a chave mestra cifra a chave de dados e, para ler, o banco pede ao KMS para abrir a chave. Em Passo a passo, a figura se monta um passo por vez, e o traço embaixo dela mostra quando cada passo terminou.

KMS chave mestra Banco o servidor Disco dados e backups 1 Maria Souza com a chave de dados 9fQk2xPzA… cifrado 2 chave de dados cifra com a chave mestra chave cifrada 3 guarda a chave cifrada chave de dados cifrada 4 abrir a chave cifrada permissão ok chave aberta Maria Souza só na memória 5 chave mestra desativada abrir a chave cifrada recusa Sem a chave mestra, dados e backups ficam ilegíveis.
  1. O banco cifra Maria Souza com a chave de dados e grava no disco.
  2. O KMS cifra a chave de dados com a chave mestra, que nunca sai dele.
  3. O banco guarda a chave cifrada no disco, junto dos dados.
  4. Para ler, o banco pede ao KMS para abrir a chave e decifra na memória.
  5. Depois, com a chave mestra desativada, o KMS recusa: dados e backups ficam ilegíveis.
Cada cor é um ator: o KMS (azul), o banco (roxo) e o disco (âmbar); em vermelho, o que falha.

O ganho é que o acesso ao dado passa a depender também de quem pode usar a chave. Se a chave for desativada ou apagada, os dados ficam ilegíveis, inclusive os backups. Tirar a permissão de um usuário não basta: no RDS, o banco guarda uma autorização própria na chave (um grant), criada junto com a instância.

O que ela protege e o que não protege

Ela protege contra:

  • roubo ou descarte indevido de disco;
  • acesso a snapshots e backups por quem não tem permissão na chave;
  • parte das exigências de auditoria: as normas do Banco Central (Resolução CMN 4.893) põem a criptografia entre os controles mínimos de segurança cibernética, e a LGPD, que pede medidas de segurança sem citar a criptografia, leva em conta, num incidente, se os dados vazados estavam ininteligíveis. Para número de cartão ela ajuda, mas não basta: desde a versão 4.0, o PCI DSS (requisito 3.5.1.2 (nota: vale desde 31/03/2025)) não aceita a criptografia de disco como única proteção do número do cartão, e é preciso também tokenizar, truncar ou cifrar o campo.

Ela não protege contra:

  • quem tem usuário e senha do banco. Para essa pessoa, o dado aparece em texto claro, porque a decifragem acontece por baixo;
  • uma aplicação comprometida ou uma injeção de SQL;
  • o dado viajando pela rede. Para isso existe a criptografia em trânsito.
(nota: nada disso muda com o disco cifrado)

O primeiro item é o mais mal-entendido.

Criptografia em repouso não é controle de acesso.

Ela protege o meio onde o dado está gravado, e não o dado contra quem pode consultá-lo.

Criptografia em trânsito

Aqui o dado está saindo da aplicação e indo para o banco, voltando, ou indo de um nó do cluster para outro. A proteção é o TLS, o mesmo protocolo do HTTPS, e ele resolve dois problemas:

  • Sigilo: quem intercepta o tráfego não consegue ler.
  • Autenticidade: quando o cliente valida o certificado, ele tem certeza de que está falando com o banco certo, e não com alguém no meio do caminho.

O segundo ponto é o que mais se perde na prática. Muita configuração liga o TLS mas não valida o certificado. O tráfego fica cifrado, mas nada impede um ataque man-in-the-middle. No Postgres, essa é a diferença entre sslmode=require, que cifra mas não confere quem está do outro lado, e sslmode=verify-full, que confere a CA e o nome do servidor.

Na figura, as duas linhas mostram a mesma conexão, com alguém no meio do caminho: em cima, com require; embaixo, com verify-full. Em Passo a passo, primeiro se vê o que acontece com require e depois com verify-full.

sslmode=require Cliente a aplicação pede TLS Intermediário finge ser o banco certificado próprio Banco PostgreSQL sslmode=verify-full Cliente a aplicação pede TLS Intermediário finge ser o banco certificado próprio Banco PostgreSQL 1 aceita o certificado sem conferir quem é 2 repassa lê tudo em claro O intermediário lê tudo, e o cliente nem percebe. 3 confere a CA e o nome recusado 4 A conexão nem abre: ninguém lê nada.
  1. Com require, o cliente aceita o certificado sem conferir quem está do outro lado.
  2. O intermediário repassa ao banco e lê tudo em claro, sem o cliente perceber.
  3. Com verify-full, o cliente confere a CA e o nome, e recusa o certificado.
  4. A conexão nem abre, e ninguém lê nada.
Cada cor é um ator: o cliente (petróleo), o intermediário (âmbar) e o banco (roxo); vermelho é o que falha, e verde, o que dá certo.

A própria documentação do PostgreSQL resume isso numa tabela: com require, a coluna de proteção contra man-in-the-middle diz “No”; só com verify-full ela diz “Yes”.

Tabela da documentação do PostgreSQL com os valores de sslmode: require protege contra escuta, mas não contra man-in-the-middle; verify-full protege contra os dois; prefer, o padrão, não protege contra man-in-the-middle.
Documentação do PostgreSQL, a tabela dos modos de sslmode · postgresql.org

PostgreSQL no Amazon RDS

Em repouso

No RDS, a criptografia em repouso é ligada na criação da instância e usa uma chave do AWS KMS. Ela cobre o storage, os backups automáticos, os snapshots, os logs e as réplicas de leitura. No console é a opção Enable encryption. Na API, na CLI e no CloudFormation é o StorageEncrypted.

Pela CLI:

Janela do terminal
aws rds create-db-instance \
--db-instance-identifier pedidos-db \
--engine postgres \
--db-instance-class db.t4g.medium \
--allocated-storage 50 \
--master-username pgadmin \
--manage-master-user-password \
--storage-encrypted \ (nota: é isto que liga)
--kms-key-id alias/rds-pedidos

Com Terraform:

main.tf HCL
resource "aws_kms_key" "rds" {
description = "Chave do RDS de pedidos"
}
resource "aws_db_instance" "pedidos" {
identifier = "pedidos-db"
engine = "postgres"
instance_class = "db.t4g.medium"
allocated_storage = 50
username = "pgadmin"
manage_master_user_password = true
storage_encrypted = true
kms_key_id = aws_kms_key.rds.arn (nota: liga e escolhe a chave)
}

Para conferir as instâncias que você já tem:

Janela do terminal
aws rds describe-db-instances \
--query "DBInstances[].{instancia:DBInstanceIdentifier,criptografada:StorageEncrypted,chave:KmsKeyId}" \
--output table

Três pontos de atenção:

Não dá para ligar numa instância que já existe. O caminho é tirar um snapshot, copiar o snapshot informando uma chave KMS (a cópia sai criptografada) e restaurar uma instância nova a partir dela. Isso significa uma instância nova, com outro endpoint (a menos que você renomeie a antiga e dê o nome dela à nova), e janela de manutenção. Se o downtime for um problema, dá para migrar com replicação lógica ou AWS DMS.

Janela do terminal
aws rds create-db-snapshot \
--db-instance-identifier pedidos-db \
--db-snapshot-identifier pedidos-sem-cripto
aws rds wait db-snapshot-available --db-snapshot-identifier pedidos-sem-cripto
aws rds copy-db-snapshot \
--source-db-snapshot-identifier pedidos-sem-cripto \
--target-db-snapshot-identifier pedidos-cripto \
--kms-key-id alias/rds-pedidos
aws rds wait db-snapshot-available --db-snapshot-identifier pedidos-cripto
aws rds restore-db-instance-from-db-snapshot \
--db-instance-identifier pedidos-db-v2 \
--db-snapshot-identifier pedidos-cripto

Na restauração, informe também o parameter group e os security groups da instância original (--db-parameter-group-name e --vpc-security-group-ids). Sem eles, o RDS usa os padrões, e um rds.force_ssl = 1 configurado à mão, como na seção seguinte, se perde.

Réplicas herdam a criptografia. Uma réplica de uma primária criptografada é obrigatoriamente criptografada, e é daí que vem o “como a primária” da frase do começo. Uma réplica em outra região usa uma chave KMS daquela região.

Prefira uma chave gerenciada por você (customer managed key) em vez da padrão aws/rds. Com a chave padrão, não dá para compartilhar snapshots com outra conta AWS, e você não controla a política de acesso da chave.

Em trânsito

O RDS já cria o certificado da instância. Faltam duas coisas: o servidor exigir TLS e o cliente validar o certificado.

No servidor, quem manda é o parâmetro rds.force_ssl. A partir do PostgreSQL 15 ele já vem ligado (1) por padrão. Nas versões anteriores ele vem desligado, e você precisa criar um parameter group customizado com rds.force_ssl = 1 e associá-lo à instância (com reboot, se ela já estiver rodando).

No cliente, baixe o pacote de certificados da AWS e use verify-full:

Janela do terminal
curl -o global-bundle.pem https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem
psql "host=pedidos-db.xxxx.sa-east-1.rds.amazonaws.com port=5432 dbname=pedidos \
user=app sslmode=verify-full sslrootcert=global-bundle.pem"

Em Java, pela URL do JDBC:

jdbc:postgresql://pedidos-db.xxxx.sa-east-1.rds.amazonaws.com:5432/pedidos?sslmode=verify-full&sslrootcert=/etc/certs/global-bundle.pem

Por que não confiar no padrão? Porque tanto o psql quanto o driver JDBC usam sslmode=prefer (nota: aceita conexão sem TLS): tentam TLS, aceitam cair para uma conexão sem criptografia e não validam o certificado.

Para ver quem está conectado com TLS (com o usuário mestre ou um usuário com pg_monitor, porque um usuário comum só vê as próprias sessões):

SQL
SELECT a.usename, a.client_addr, s.ssl, s.version
FROM pg_stat_ssl s (nota: uma linha por conexão)
JOIN pg_stat_activity a ON a.pid = s.pid
WHERE a.backend_type = 'client backend';

PostgreSQL fora do RDS

Em trânsito

O TLS é nativo no Postgres. Com o certificado e a chave do servidor em mãos (de uma CA interna ou pública), é só configuração.

No postgresql.conf:

postgresql.conf INI
ssl = on
ssl_cert_file = '/etc/postgresql/tls/server.crt'
ssl_key_file = '/etc/postgresql/tls/server.key'
ssl_min_protocol_version = 'TLSv1.2'

O arquivo da chave precisa pertencer ao usuário postgres, com permissão 0600, ou ao root, com 0640 e o postgres no grupo do arquivo. Senão, o servidor se recusa a usá-lo.

No pg_hba.conf, aceite conexões remotas só com TLS. Essas linhas entram no lugar das linhas host que já existem, porque vale a primeira linha que casar:

pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
hostssl all all 0.0.0.0/0 scram-sha-256
hostssl all all ::/0 scram-sha-256
hostnossl all all 0.0.0.0/0 reject
hostnossl all all ::/0 reject (nota: sem TLS, recusado)

Depois, recarregue a configuração com SELECT pg_reload_conf(); e confira no log que não apareceu SSL configuration was not reloaded. No cliente vale a mesma regra do RDS: sslmode=verify-full, com sslrootcert apontando para a CA que assinou o certificado do servidor.

Carimbo: testado no Postgres 16

Em repouso

Aqui está a maior diferença em relação ao RDS: o PostgreSQL da comunidade não tem criptografia em repouso nativa. Não existe um ssl = on para o disco. As opções são três.

1. Criptografar o volume. LUKS (dm-crypt) em servidor próprio, ou um volume criptografado na nuvem, como um EBS criptografado numa EC2. É o caminho mais comum, e protege contra roubo do disco e de snapshots do volume.

Janela do terminal
# Atenção: apaga o disco. Use um disco dedicado aos dados.
cryptsetup luksFormat /dev/nvme1n1
cryptsetup open /dev/nvme1n1 pgdata
mkfs.xfs /dev/mapper/pgdata
mount /dev/mapper/pgdata /var/lib/postgresql
# depois: chown postgres:postgres /var/lib/postgresql e as entradas no /etc/crypttab e no /etc/fstab

A limitação é que, com o volume montado, o sistema de arquivos já enxerga tudo decifrado. Quem tem acesso ao servidor ligado lê os arquivos normalmente. Também é preciso decidir como o volume é destravado no boot (senha manual, TPM, Clevis/Tang), e essa é a parte que dá trabalho.

2. Usar TDE de uma distribuição. O Percona Distribution for PostgreSQL tem a extensão open source pg_tde, que cifra dentro do próprio banco as tabelas criadas com tde_heap (com os índices delas e, se você ligar, o WAL), com as chaves guardadas num Vault, OpenBao ou servidor KMIP. Ela depende do Percona Server for PostgreSQL, uma versão do Postgres modificada pela Percona, e não roda no Postgres da comunidade. Há também opções comerciais, como o EDB Postgres Advanced Server.

SQL
-- postgresql.conf: shared_preload_libraries = 'pg_tde' (e reinicie o servidor)
CREATE EXTENSION pg_tde;
-- configure o provedor de chaves (Vault, OpenBao ou KMIP) e a chave principal;
-- as funções mudam entre versões, então siga a documentação da versão instalada
CREATE TABLE cartao (
id bigint PRIMARY KEY,
numero text NOT NULL
) USING tde_heap; (nota: só estas tabelas são cifradas)

3. Não esquecer dos backups. Um banco criptografado com backups em texto claro num bucket qualquer não resolve nada. O pgBackRest, por exemplo, cifra o repositório de backups com repo1-cipher-type=aes-256-cbc e repo1-cipher-pass.

MongoDB Atlas

Em repouso

No Atlas, a criptografia em repouso já vem ligada em todos os clusters, sem configuração. O Atlas usa a criptografia de volume do provedor de nuvem (na AWS, EBS criptografado).

Se você precisa controlar a chave para rotacionar, revogar e auditar o uso, existe a opção Encryption at Rest using Customer Key Management, também chamada de BYOK (bring your own key). Com ela, o Atlas cifra os dados uma segunda vez, no Encrypted Storage Engine do MongoDB, usando uma chave sua no AWS KMS, no Azure Key Vault ou no Google Cloud KMS. Ela só está disponível em clusters dedicados, do M10 para cima.

Na AWS, os passos são:

  1. Criar uma chave simétrica no AWS KMS.
  2. Criar um IAM role que o Atlas possa assumir, com permissão de kms:Encrypt, kms:Decrypt e kms:DescribeKey nessa chave.
  3. No projeto do Atlas, configurar o Encryption at Rest com o AWS KMS, informando a chave, a região e o role.
  4. Ligar a opção em cada cluster que deve usar a chave.

Com Terraform:

main.tf HCL
resource "mongodbatlas_encryption_at_rest" "this" {
project_id = var.atlas_project_id
aws_kms_config {
enabled = true
customer_master_key_id = aws_kms_key.atlas.id
region = "SA_EAST_1"
role_id = mongodbatlas_cloud_provider_access_authorization.atlas.role_id
}
}
resource "mongodbatlas_advanced_cluster" "pedidos" {
# o project_id vem do recurso acima, para o cluster esperar a criptografia estar configurada
project_id = mongodbatlas_encryption_at_rest.this.project_id
encryption_at_rest_provider = "AWS" (nota: o cluster espera a chave)
# ... demais configurações do cluster
}

Um cuidado: se a chave for desativada ou apagada, ou se o role perder a permissão, o Atlas percebe na verificação seguinte (ele confere a cada 15 minutos) e desliga os processos do cluster. Ninguém lê nem grava até a chave voltar, e os snapshots cifrados com ela não podem ser restaurados. É o outro lado de ter o controle da chave.

Em trânsito

No Atlas, o TLS é obrigatório e não dá para desligar. A string de conexão mongodb+srv:// já liga o TLS no driver. O que dá para ajustar é a versão mínima do TLS nas configurações do cluster: o Atlas já recusa o 1.0 e o 1.1, então a escolha é entre 1.2 e 1.3.

conferido em set/2026

MongoDB fora do Atlas

Em trânsito

No mongod.conf:

mongod.conf YAML
net:
port: 27017
bindIp: 127.0.0.1,10.0.1.15
tls:
mode: requireTLS (nota: recusa conexão sem TLS)
certificateKeyFile: /etc/mongodb/tls/mongod.pem # certificado + chave privada
CAFile: /etc/mongodb/tls/ca.pem
# clientes sem certificado autenticam com usuário e senha (security.authorization ligado)
allowConnectionsWithoutCertificates: true
disabledProtocols: TLS1_0,TLS1_1

Com requireTLS, a comunicação entre os membros do replica set também passa a exigir TLS. Se o certificado não tiver o uso clientAuth, os membros não conseguem conversar entre si. Gere-o com clientAuth ou use setParameter: tlsWithholdClientCertificate: true com autenticação interna por keyFile.

Para migrar um ambiente que já está no ar sem derrubar tudo, reinicie os membros um de cada vez com allowTLS, passe os clientes para TLS e só então troque todos para preferTLS e, por fim, para requireTLS (com setParameter, sem reiniciar). Cada etapa precisa chegar a todos os membros (nota: senão, o primário cai) antes da próxima, e no fim o mongod.conf fica com requireTLS.

No cliente:

mongodb://app:<senha>@mongo1.interno:27017,mongo2.interno:27017/?replicaSet=rs0&tls=true&tlsCAFile=/etc/certs/ca.pem

Em repouso

Aqui depende da edição do MongoDB.

Community: não tem criptografia em repouso nativa. O caminho é o mesmo do Postgres autogerenciado: volume criptografado (LUKS, EBS criptografado e afins).

Enterprise: tem o Encrypted Storage Engine, que cifra os arquivos do WiredTiger. O recomendado é que a chave mestra venha de um servidor KMIP:

mongod.conf YAML
security:
enableEncryption: true
kmip:
serverName: kmip.interno
port: 5696
serverCAFile: /etc/mongodb/kmip/ca.pem
clientCertificateFile: /etc/mongodb/kmip/mongod-client.pem

Também existe a opção encryptionKeyFile, com a chave num arquivo local. Ela deixa a chave no mesmo servidor dos dados e, segundo a própria MongoDB, não atende à maioria das exigências regulatórias de gestão de chaves. Em produção, prefira o KMIP.

Percona Server for MongoDB: alternativa gratuita e compatível com o MongoDB, de código-fonte disponível (source available (entre aspas), pela licença SSPL), que também tem criptografia em repouso, com as chaves num Vault (ou OpenBao) ou num servidor KMIP.

Um detalhe operacional: não dá para ligar a criptografia em cima de arquivos que já existem. Num replica set, o jeito é fazer membro a membro, começando pelos secundários e, por último, o primário, depois de um rs.stepDown(): parar o membro, limpar o dbPath, subir com a criptografia ligada e deixar o initial sync repopular os dados.

E a criptografia em uso?

Existe um terceiro estado, bem menos comum no dia a dia: o dado em uso, enquanto está na memória sendo processado.

Repare que as duas proteções anteriores têm um ponto cego em comum: dentro do servidor do banco, o dado fica aberto. Um DBA, um backup lógico (pg_dump, mongodump) ou alguém que invadiu o servidor enxerga tudo.

A criptografia em uso tenta fechar esse buraco. Um bom exemplo é o Queryable Encryption do MongoDB. A aplicação cifra os campos sensíveis no próprio driver, antes de enviar, e o servidor guarda e consulta o dado sem nunca ver o valor original. A chave mestra fica num KMS que só a aplicação acessa. O banco guarda apenas as chaves de dados, cifradas por ela, e nunca consegue abri-las.

A figura põe as proteções lado a lado. Cada linha é uma proteção, e cada coluna, um lugar por onde o dado passa, da aplicação ao disco. O cadeado fechado, na cor da proteção, é onde o dado está cifrado; o aberto, em vermelho, é onde ele aparece em texto claro. Com repouso e trânsito juntos, o servidor do banco continua aberto (o quadro que pisca); com a criptografia em uso, só a aplicação vê o valor. Com o mouse numa cor da legenda, a figura destaca só aquela proteção.

Aplicação o driver Rede o caminho Servidor a memória do banco Disco backups e snapshots Em trânsito TLS Em repouso disco cifrado Os dois juntos o servidor fica aberto Em uso só a aplicação abre cifrado na rede cifrado no disco cifrado até no servidor em texto claro
Cada cor é uma proteção: em trânsito (petróleo), em repouso (âmbar) e em uso (roxo); em vermelho, onde o dado fica em texto claro.

Imagine uma coleção de portadores de cartão com o CPF cifrado. A aplicação, que tem acesso à chave, consulta normalmente:

JavaScript
db.portadores.find({ cpf: "123.456.789-09" })
// { nome: 'Maria Souza', cpf: '123.456.789-09', ... }

Um DBA conectado direto no banco, sem a chave, vê isto:

JavaScript
db.portadores.findOne()
// { nome: 'Maria Souza', cpf: Binary.createFromBase64('DkH2...', 6), __safeContent__: [ ... ], ... } (nota: o CPF, cifrado)

O subtipo 6 é o formato de dado cifrado do MongoDB. O banco não consegue ler o CPF e, mesmo assim, consegue responder à consulta de igualdade. A cifragem automática do exemplo exige MongoDB Enterprise ou Atlas (7.0 ou mais novo) num replica set. Na Community, só com cifragem explícita no código.

Outro exemplo é a computação confidencial, que protege o dado de quem controla a máquina (o host, o hypervisor, o operador da nuvem). Nas VMs com AMD SEV-SNP ou Intel TDX (quer dizer: memória cifrada), o processador cifra a memória da VM com uma chave que nem o hypervisor acessa. Nos AWS Nitro Enclaves, a proteção vem do isolamento: uma VM à parte, sem rede externa, sem disco e sem acesso interativo. Nenhuma das duas impede quem tem credencial do banco de consultar o dado.

No Postgres, o pgcrypto pode parecer a mesma coisa, mas não é. A chave e o valor aberto passam pelo servidor na própria query e podem acabar em logs. Para ter o efeito de “em uso”, a criptografia precisa acontecer na aplicação.

Por que é pouco usado? Porque cobra caro:

  • a aplicação passa a gerenciar chaves e o esquema de criptografia dos campos;
  • as consultas sobre campos cifrados ficam limitadas (nada de ordenar ou agregar livremente por eles);
  • ferramentas de BI, pipelines de dados e o próprio suporte deixam de enxergar o valor.
(nota: o preço da criptografia em uso)

Por isso ela costuma ficar reservada para poucos campos muito sensíveis. Em domínios como o de cartões, a tokenização muitas vezes resolve o mesmo problema com menos atrito.

Resumo

Em repousoEm trânsito
Postgres no RDSStorageEncrypted na criação, com chave no KMS. Instância existente só via cópia criptografada do snapshotrds.force_ssl = 1 (padrão a partir do 15) e cliente com verify-full
Postgres fora do RDSVolume criptografado (LUKS, EBS) ou TDE de distribuição (pg_tde, EDB). Cifrar também os backupsssl = on, hostssl e hostnossl reject no pg_hba.conf, cliente com verify-full
MongoDB AtlasSempre ligada. Chave própria (BYOK) a partir do M10Sempre ligado, com TLS 1.2 ou 1.3
MongoDB fora do AtlasCommunity: volume criptografado. Enterprise: Encrypted Storage Engine com KMIP. Ou Percona ServerrequireTLS no mongod.conf e cliente com tls=true e a CA

Se for para guardar uma coisa deste post: criptografia em repouso e em trânsito são o mínimo, e hoje custam quase nada para ligar. Mas nenhuma das duas impede quem tem credencial de ler o dado. Para isso você precisa de controle de acesso bem feito, auditoria e, nos casos mais sensíveis, criptografia em uso ou tokenização.

Fontes