Criptografia em Trânsito e em Repouso
Esta aula aborda criptografia em trânsito (TLS, SSH) e em repouso (chaves, gerenciamento de segredos), explicando conceitos, práticas e exemplos para proteger dados em movimento e armazenados.
A criptografia é um pilar fundamental da segurança da informação, garantindo confidencialidade, integridade e autenticidade dos dados. Nesta aula, vamos explorar dois contextos principais: a criptografia em trânsito, que protege dados enquanto trafegam entre sistemas, e a criptografia em repouso, que protege dados armazenados em discos, bancos de dados ou outros meios. Compreender as diferenças e as melhores práticas para cada cenário é essencial para construir sistemas seguros.
Abordaremos protocolos e tecnologias como TLS, SSH, gerenciamento de chaves e segredos, com exemplos práticos e orientações sobre configuração e uso correto.
TLS
O Transport Layer Security (TLS) é o protocolo padrão para proteger comunicações na internet. Ele sucede o SSL (Secure Sockets Layer) e é usado para criptografar o tráfego entre cliente e servidor, garantindo que dados como senhas, cartões de crédito e mensagens não sejam interceptados ou alterados.
O TLS funciona através de um handshake inicial, onde as partes negociam algoritmos de criptografia, trocam chaves e verificam certificados digitais. Após o handshake, uma sessão criptografada é estabelecida usando criptografia simétrica (ex: AES) para eficiência. O certificado digital, emitido por uma Autoridade Certificadora (CA), autentica o servidor (e opcionalmente o cliente).
Exemplo de configuração de um servidor web com TLS (nginx):
server {
listen 443 ssl;
server_name exemplo.com;
ssl_certificate /etc/ssl/certs/exemplo.crt;
ssl_certificate_key /etc/ssl/private/exemplo.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
root /var/www/html;
index index.html;
}
}Boas práticas incluem usar TLS 1.2 ou superior, desabilitar versões antigas (SSLv2, SSLv3, TLSv1.0), configurar cipher suites seguras e renovar certificados regularmente. Ferramentas como Let's Encrypt facilitam a obtenção gratuita de certificados.
SSH
O Secure Shell (SSH) é um protocolo de rede que permite acesso remoto seguro a servidores e dispositivos. Ele criptografa toda a comunicação, incluindo autenticação, comandos e transferência de arquivos. SSH é amplamente usado por administradores de sistemas e desenvolvedores.
O SSH utiliza um modelo cliente-servidor. O servidor possui uma chave pública (identidade) e o cliente se autentica com senha ou, mais comumente, com par de chaves (pública e privada). A criptografia simétrica é negociada durante o handshake, e a integridade é garantida por MACs (Message Authentication Codes).
Exemplo de conexão SSH com chave:
ssh -i ~/.ssh/id_rsa usuario@servidor.comPara gerar um par de chaves:
ssh-keygen -t ed25519 -C "comentario"Recomenda-se usar chaves Ed25519 ou RSA com pelo menos 4096 bits, desabilitar autenticação por senha no servidor e usar agentes SSH para gerenciar chaves. Além disso, configurar o arquivo sshd_config para restringir acesso por IP e usar fail2ban pode aumentar a segurança.
Chaves
Chaves criptográficas são sequências de bits usadas para cifrar e decifrar dados. Elas podem ser simétricas (mesma chave para cifrar e decifrar) ou assimétricas (par de chaves: pública e privada). O gerenciamento adequado das chaves é crítico: se uma chave for comprometida, toda a segurança é perdida.
Práticas importantes incluem: gerar chaves com entropia suficiente (usando geradores seguros), armazenar chaves privadas em locais protegidos (HSM, cofres de chaves), rotacionar chaves periodicamente e nunca compartilhar chaves por canais não seguros. Para dados em repouso, a criptografia de disco (ex: LUKS) ou de arquivos (ex: GnuPG) é comum.
Exemplo de cifragem simétrica com OpenSSL:
# Cifrar arquivo
openssl enc -aes-256-cbc -salt -in dados.txt -out dados.enc -pass pass:minhasenha
# Decifrar
openssl enc -d -aes-256-cbc -in dados.enc -out dados.txt -pass pass:minhasenhaPara criptografia assimétrica com GnuPG:
# Gerar par de chaves
gpg --full-generate-key
# Cifrar para um destinatário
gpg --encrypt --recipient email@exemplo.com arquivo.txt
# Decifrar
gpg --decrypt arquivo.txt.gpgO uso de algoritmos modernos (AES-256, ChaCha20, RSA-4096, ECDH) e a implementação correta dos protocolos são fundamentais.
Gerenciamento de segredos
Segredos são informações sensíveis como senhas, tokens de API, chaves de criptografia e certificados. O gerenciamento de segredos envolve armazenar, acessar, rotacionar e auditar esses itens de forma segura. Ferramentas como HashiCorp Vault, AWS Secrets Manager e Kubernetes Secrets são amplamente utilizadas.
Práticas recomendadas: nunca hardcodar segredos no código-fonte; usar variáveis de ambiente ou serviços de segredo; implementar controle de acesso baseado em papéis (RBAC); habilitar auditoria de acesso; rotacionar segredos automaticamente; e criptografar segredos em repouso e em trânsito. Além disso, o princípio do menor privilégio deve ser aplicado: cada serviço ou usuário só tem acesso aos segredos necessários.
Exemplo de uso do Vault para armazenar e recuperar um segredo:
# Escrever segredo
vault kv put secret/minhaapp senha="supersecreta"
# Ler segredo
vault kv get secret/minhaappNo Kubernetes, segredos podem ser criados via YAML:
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
password: c3VwZXJzZWNyZXQ= # base64É importante lembrar que o base64 não é criptografia, apenas codificação; o Kubernetes Secrets deve ser criptografado em etcd e acessado apenas por pods autorizados.
Boas práticas e observações finais
A criptografia em trânsito e em repouso são complementares. Nunca confie apenas em uma delas: dados devem ser protegidos em ambos os estados. Mantenha-se atualizado sobre vulnerabilidades (ex: Heartbleed, POODLE) e aplique patches. Utilize bibliotecas e ferramentas consolidadas, evite implementar criptografia do zero. Realize auditorias regulares e testes de penetração para verificar a eficácia das proteções.
Referências
- MDN: Transport Layer Security (TLS)
- OpenSSH Manual
- OpenSSL Documentation
- HashiCorp Vault Documentation
- Kubernetes Secrets
- Let's Encrypt
- NIST SP 800-57: Key Management
Exercícios
Explique a diferença entre criptografia simétrica e assimétrica, e dê um exemplo de uso de cada uma em TLS.
✓ Resposta: Criptografia simétrica usa a mesma chave para cifrar e decifrar (ex: AES), enquanto a assimétrica usa um par de chaves (pública e privada, ex: RSA). No TLS, o handshake usa criptografia assimétrica para trocar uma chave simétrica, que então é usada para cifrar a sessão (eficiência).Qual comando SSH você usaria para se conectar a um servidor usando uma chave privada específica? E qual comando para gerar um par de chaves Ed25519?
✓ Resposta: Conexão:ssh -i ~/.ssh/id_ed25519 usuario@servidor. Geração:ssh-keygen -t ed25519 -C "comentario".Cite três práticas recomendadas para o gerenciamento de chaves criptográficas.
✓ Resposta: 1) Armazenar chaves privadas em HSMs ou cofres de chaves. 2) Rotacionar chaves periodicamente. 3) Usar algoritmos fortes (AES-256, RSA-4096).Qual a finalidade de um serviço de gerenciamento de segredos como o Vault? Dê um exemplo de comando para ler um segredo.
✓ Resposta: Um serviço de gerenciamento de segredos armazena, controla acesso e audita segredos de forma centralizada. Exemplo Vault:vault kv get secret/minhaapp.Por que não é seguro armazenar senhas em texto plano no código-fonte? Como você protegeria uma senha de banco de dados em uma aplicação?
✓ Resposta: Senhas em texto plano no código podem ser expostas em repositórios, logs ou engenharia reversa. Para proteger, use um serviço de segredos (ex: Vault) ou variáveis de ambiente criptografadas, e nunca commite segredos.