MÓDULO 11 · CONCEITO 10 DE 12

Secrets Management — Vault, KMS e rotação automática

O problema de segredos em código e em variáveis de ambiente, HashiCorp Vault com dynamic secrets, AWS Secrets Manager e KMS, rotação automática, e detecção de segredos em repositório

Tempo de leitura ~22 min Pré-requisito 09 · Segurança de APIs Próximo 11 · Supply Chain Security

Em 2022, a empresa de autenticação Okta sofreu um breach via um contratado terceirizado cujo laptop foi comprometido. Em 2023, a CircleCI notificou seus clientes que segredos armazenados em seus pipelines de CI/CD haviam sido expostos após comprometimento de um token de funcionário. Em 2024, a Microsoft divulgou que tokens de autenticação de desenvolvimento foram expostos inadvertidamente. O padrão em todos esses incidentes é o mesmo: segredos que deveriam estar em storage seguro com acesso auditado estavam em lugares onde o controle era insuficiente — laptops, arquivos de configuração, variáveis de ambiente sem restrição de acesso.

Secrets management é a disciplina de armazenar, distribuir, rodar e auditar credenciais — chaves de API, senhas de banco de dados, certificados, tokens OAuth — de forma que o acesso seja mínimo, auditado, e temporário. É uma área onde a distância entre o que times sabem que deveriam fazer e o que realmente fazem é grande: todo desenvolvedor sabe que "não committar segredos no repositório" é regra básica, mas pesquisas da GitGuardian consistentemente encontram centenas de milhares de segredos hardcoded em repositórios públicos no GitHub.

O espectro de insegurança — de hardcoded a dynamic secrets

Os diferentes níveis de maturidade de secrets management podem ser visualizados como um espectro, do menos ao mais seguro:

  1. Hardcoded no código-fonte: o pior cenário. A senha do banco está na string de conexão no código. Aparece em git history para sempre, mesmo após remoção (git log ainda mostra o commit). Qualquer pessoa com acesso ao repositório tem o segredo.
  2. Em arquivos de configuração não versionados: o arquivo config.prod.json com as senhas está em .gitignore. Melhor que hardcoded, mas o arquivo existe no disco de todo desenvolvedor que precisou rodar o sistema — e provavelmente em backups não controlados.
  3. Em variáveis de ambiente "simples": o segredo está em .env ou passado como variável de ambiente no deploy. Melhor que arquivo — mas o .env frequentemente acaba no repositório, em logs quando o processo imprime o ambiente, em dumps de crash, e em docker inspect que mostra variáveis de ambiente de containers.
  4. Em secrets manager (AWS SM, GCP SM, Azure Key Vault): segredos armazenados centralmente com controle de acesso (IAM), rotação gerenciada, e audit log de cada acesso. A aplicação busca o segredo no startup e o usa. Muito melhor — o segredo não fica em nenhum artefato de deploy.
  5. Dynamic secrets (HashiCorp Vault): a aplicação solicita credenciais ao Vault no momento de uso; o Vault gera credenciais temporárias com lease de horas; quando o lease expira, as credenciais são revogadas automaticamente. Nenhuma credencial de longa duração existe em nenhum lugar.
heurística do sênior

A questão não é "onde o segredo fica armazenado" — é "quem pode acessar, quando, e como você saberia se alguém não autorizado acessou?". Variáveis de ambiente em um processo podem ser seguras se o processo tem acesso limitado e há audit log. Um secrets manager é inseguro se o IAM role que o acessa tem permissões excessivas e não há monitoramento de acesso. A postura e o controle importam mais que a tecnologia específica.

HashiCorp Vault — o secrets manager de referência

HashiCorp Vault é o sistema de secrets management open source mais adotado, com suporte a dezenas de tipos de segredo, múltiplos backends de autenticação (AppRole, AWS IAM, Kubernetes, LDAP, GitHub), e a funcionalidade de dynamic secrets que o diferencia de outros sistemas.

Dynamic secrets é o conceito central do Vault: em vez de armazenar senhas estáticas de banco de dados, o Vault se conecta ao banco e gera um usuário e senha exclusivos para cada solicitação, com lease de tempo limitado. Quando a aplicação solicita credenciais para o PostgreSQL, o Vault cria um usuário como v-appname-k8s-1234567890 com a senha gerada, concede as permissões necessárias, e retorna as credenciais com um lease de 1 hora. Quando o lease expira (ou é revogado explicitamente), o Vault revoga as credenciais no PostgreSQL — o usuário temporário é deletado. Nunca há uma senha de banco estática que possa ser roubada.

# Configurando Vault secrets engine para PostgreSQL
vault secrets enable database

vault write database/config/postgres \
  plugin_name=postgresql-database-plugin \
  allowed_roles="app-role" \
  connection_url="postgresql://{{username}}:{{password}}@db.internal:5432/mydb" \
  username="vault-admin" \
  password="vault-admin-password"

vault write database/roles/app-role \
  db_name=postgres \
  creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' \
    VALID UNTIL '{{expiration}}'; GRANT SELECT, INSERT, UPDATE ON ALL TABLES \
    IN SCHEMA public TO \"{{name}}\";" \
  default_ttl="1h" \
  max_ttl="24h"

# Aplicação solicita credenciais
vault read database/creds/app-role
# Key                Value
# ---                -----
# lease_id           database/creds/app-role/ABC123
# lease_duration     1h
# username           v-appname-k8s-1234567890
# password           A1b2C3d4E5f6G7h8

Para autenticação da aplicação ao Vault em Kubernetes, o Kubernetes auth method é o padrão: o pod apresenta seu service account token ao Vault; o Vault verifica com a Kubernetes API que o service account tem permissão para solicitar aquele role. Nenhum segredo estático (como um AppRole secret_id) precisa ser injetado no pod — a identidade do pod (service account) é suficiente.

# Vault Agent Sidecar — injeta segredos como arquivos no pod
# Anotações no pod spec
annotations:
  vault.hashicorp.com/agent-inject: "true"
  vault.hashicorp.com/role: "app-role"
  vault.hashicorp.com/agent-inject-secret-db-creds: "database/creds/app-role"
  vault.hashicorp.com/agent-inject-template-db-creds: |
    {{- with secret "database/creds/app-role" -}}
    export DB_USERNAME="{{ .Data.username }}"
    export DB_PASSWORD="{{ .Data.password }}"
    {{- end }}

AWS Secrets Manager e KMS

AWS Secrets Manager é a solução managed da AWS para armazenamento e rotação de segredos. Integra nativamente com RDS (PostgreSQL, MySQL, Aurora) para rotação automática — sem código customizado, a AWS gera uma nova senha para o banco a cada N dias, atualiza o segredo no SM, e o RDS começa a aceitar a nova senha antes de invalidar a antiga (dual-password period).

# Terraform — Secrets Manager com rotação automática de RDS
resource "aws_secretsmanager_secret" "db_password" {
  name = "prod/myapp/db-credentials"
  recovery_window_in_days = 7  # grace period antes de deletar
}

resource "aws_secretsmanager_secret_rotation" "db_rotation" {
  secret_id           = aws_secretsmanager_secret.db_password.id
  rotation_lambda_arn = aws_lambda_function.rotation.arn
  rotation_rules {
    automatically_after_days = 30  # rotação a cada 30 dias
  }
}

# IAM policy — acesso mínimo necessário por aplicação
resource "aws_iam_policy" "app_secrets" {
  policy = jsonencode({
    Statement = [{
      Effect   = "Allow"
      Action   = ["secretsmanager:GetSecretValue"]
      Resource = aws_secretsmanager_secret.db_password.arn
    }]
  })
}

AWS KMS (Key Management Service) complementa o Secrets Manager: as chaves de criptografia dos segredos são gerenciadas pelo KMS, com suporte a Customer Managed Keys (CMK) para organizações que precisam de controle explícito sobre as chaves. KMS também é usado diretamente para envelope encryption: a aplicação chama o KMS para cifrar uma DEK, e usa a DEK para cifrar dados. O KMS nunca recebe os dados em plaintext — apenas a DEK.

Kubernetes Secrets — o que funciona e o que não funciona

Kubernetes Secrets armazena dados sensíveis em etcd, codificados em Base64 (não criptografados por padrão). Qualquer pessoa com acesso de leitura ao etcd (ou ao namespace do Kubernetes) pode decodificar os segredos. A configuração correta requer: encryption at rest do etcd (configurado no API server com uma EncryptionConfiguration), RBAC que limita get/list de secrets aos pods/service accounts que precisam, e audit log de acesso a secrets.

Para organizações que usam Kubernetes e precisam de gestão de segredos mais robusta, as opções preferidas são:

Rotação automática — por que é necessária e como implementar

Rotação de segredos — trocar periodicamente as credenciais — limita a janela de dano de uma credencial comprometida. Se uma chave de API é comprometida mas rotacionada a cada 90 dias, o atacante perde acesso na próxima rotação sem que a organização precise saber que houve comprometimento. Para credenciais de alto valor (chaves de serviço, tokens de admin), rotação frequente é camada de defesa adicional.

O desafio da rotação é a coordenação: o novo segredo precisa estar ativo antes do antigo ser desativado, e todos os serviços que usam o segredo precisam adotar o novo antes da janela de transição fechar. AWS Secrets Manager resolve isso com o "dual-password period" para bancos de dados RDS — aceita antiga e nova senha por um período. Para secrets arbitrários, a lógica de rotação precisa ser implementada considerando que múltiplos serviços podem estar usando o segredo simultaneamente.

# Padrão de rotação para segredos arbitrários com Vault
# O Vault Agent monitora o TTL e obtém novas credenciais antes da expiração
# O arquivo de segredo é atualizado atomicamente no disco do pod

# Aplicação — ler segredo do arquivo, não de variável de ambiente (para pegar renovações)
def get_db_password():
    with open('/vault/secrets/db-creds') as f:
        creds = json.load(f)
    return creds['password']

# Para conexões de longa duração — checar se o segredo mudou no arquivo
def reconnect_if_needed(conn, current_password: str) -> tuple:
    file_password = get_db_password()
    if file_password != current_password:
        conn.close()
        return new_connection(file_password), file_password
    return conn, current_password

Detecção de segredos em repositório

Apesar das melhores práticas, segredos acabam em repositórios — por acidente, por pressa, por desconhecimento. As ferramentas de detecção existem em dois momentos: pre-commit (antes de o desenvolvedor commitar) e scanning (depois, em repositórios existentes).

Para pre-commit, o hook mais eficaz é o git-secrets (AWS) ou o Gitleaks — um binário que scanneia o diff antes de cada commit e bloqueia se encontrar padrões de segredos conhecidos (AWS access keys, tokens GitHub, senhas em strings de conexão, chaves privadas PEM). Configurado como pre-commit hook via Husky (Node.js) ou pre-commit (Python), roda automaticamente sem intervenção do desenvolvedor.

# Gitleaks — pre-commit hook
# .pre-commit-config.yaml
repos:
  - repo: https://github.com/gitleaks/gitleaks
    rev: v8.18.0
    hooks:
      - id: gitleaks

# Instalação
pip install pre-commit
pre-commit install

# Gitleaks também pode escanear o histórico completo do repositório
gitleaks detect --source . --log-opts "--all" --report-format json --report-path leaks.json

Para repositórios existentes e pipelines CI/CD, as ferramentas de scanning contínuo são GitGuardian (SaaS, integração nativa com GitHub, GitLab, Bitbucket) e TruffleHog (open source). GitGuardian processa commits em tempo real e notifica quando segredos são detectados — incluindo segredos que foram commitados e depois deletados (que ainda aparecem no git history). TruffleHog pode ser executado localmente ou em CI/CD e suporta mais de 700 detectors de diferentes tipos de segredo.

armadilha em produção

Deletar um segredo do repositório não o remove do git history. Um git rm arquivo-com-senhas.env seguido de commit deixa o segredo acessível em qualquer clone com git log --all -p. A remediação correta é: revogar o segredo imediatamente (assume comprometimento), reescrever o histórico com git filter-repo (substituto do depreciado git filter-branch), e force push — mas com consciência de que clones existentes ainda têm o histórico.

Least privilege para segredos — o princípio que governa tudo

Independente da tecnologia de secrets management, o princípio que governa a política é least privilege: cada serviço tem acesso apenas aos segredos que precisa, com as permissões mínimas necessárias para a função. Um serviço de leitura de relatórios não precisa de credenciais de escrita no banco. Um serviço de notificações não precisa da chave de API do sistema de pagamentos. Segmentar o acesso a segredos limita o blast radius de um comprometimento — um serviço comprometido expõe apenas os segredos que aquele serviço acessava.

A implementação técnica de least privilege varia por plataforma: IAM roles na AWS (cada serviço tem uma role com permissões específicas para os secrets que precisa), policies no Vault (cada AppRole ou K8s service account tem acesso a paths específicos no Vault), e políticas de RBAC no Kubernetes (service accounts diferentes por deployment, cada um com acesso apenas aos secrets necessários).

Decisões de engenharia

Env vars vs Secrets Manager vs Vault dynamic

Use variáveis de ambiente apenas para configuração não-sensível ou em ambientes de desenvolvimento local. Adote Secrets Manager (AWS SM, GCP SM) quando precisar de audit log, rotação gerenciada, e segredos que não mudam com frequência. Prefira Vault com dynamic secrets para credenciais de banco em produção — elimina senhas estáticas de longa duração. O critério é o impacto do comprometimento: quanto mais crítico o segredo, mais efêmero ele deve ser.

AWS Secrets Manager vs HashiCorp Vault

AWS SM quando você está all-in em AWS, precisa de rotação nativa para RDS, e quer operação zero-config — é managed service sem infra para operar. Vault quando você tem multicloud ou on-premises, precisa de dynamic secrets, ou quer portabilidade entre provedores. Vault tem curva de operação maior (HA, storage backend, unsealing) mas oferece controle completo. Muitas organizações usam ambos: Vault para dynamic secrets de banco e AWS SM para chaves de API de terceiros.

K8s: ESO vs Vault Agent vs Sealed Secrets

ESO quando você quer source-of-truth externo (AWS SM, GCP SM) sincronizado como K8s Secrets nativos — menor invasividade, funciona com qualquer deployment sem sidecar. Vault Agent Sidecar quando você usa Vault e quer credenciais dinâmicas injetadas sem tocar o etcd — mais seguro, mais complexo. Sealed Secrets quando você usa GitOps e precisa commitar secrets cifrados no repositório — adequado para infra declarativa onde o cluster tem a chave privada. Sealed Secrets não é dinâmico; rotação exige re-cifrar e re-commitar.

Frequência de rotação de segredos

Credenciais de banco com Vault dynamic: TTL de 1–4h — expiram automaticamente, sem decisão manual. Senhas de serviço no AWS SM: 30–90 dias dependendo da criticidade. Chaves de API de terceiros: 90–180 dias, ou imediatamente após qualquer suspeita de comprometimento. Certificados TLS: antes da expiração (90 dias para Let's Encrypt, renovação automática). Regra geral: quanto maior o impacto de um comprometimento, menor o TTL. Rotação não é substituto de detecção — combine com alertas de uso anômalo.

Perguntas de entrevista

Por que variáveis de ambiente não são suficientes para segredos em produção?

Variáveis de ambiente têm múltiplos vetores de vazamento: o arquivo .env frequentemente acaba commitado no repositório (o .gitignore falha silenciosamente se o arquivo já foi rastreado antes); processos filhos herdam o ambiente integralmente; docker inspect expõe variáveis de ambiente de containers; logs que imprimem o ambiente em crash/debug expõem todos os valores; e em Kubernetes, variáveis de ambiente de pods ficam visíveis para qualquer pessoa com kubectl describe pod no namespace.

Além disso, variáveis de ambiente não têm audit log nativo (quem acessou o valor?), não têm rotação centralizada (como você troca a senha em 50 instâncias simultaneamente?), e não têm controle de acesso granular (se o processo pode ler uma variável, pode ler todas). Secrets managers resolvem esses problemas: acesso é auditado por chamada, rotação é centralizada e propagada, e IAM controla qual serviço acessa qual segredo.

Como Vault dynamic secrets elimina o problema de credenciais estáticas?

Com dynamic secrets, não existe uma senha de banco "a ser roubada" — o Vault gera credenciais únicas por solicitação com TTL curto. Quando a aplicação pede credenciais, o Vault se conecta ao PostgreSQL, executa CREATE ROLE v-app-k8s-1234567890 WITH LOGIN PASSWORD '...' VALID UNTIL '...', e retorna essa credencial efêmera. Quando o TTL expira, o Vault executa DROP ROLE — a credencial deixa de existir.

Isso resolve vários problemas: um attacker que captura a credencial tem uma janela de uso de horas, não anos; não há necessidade de rotação manual; cada instância da aplicação tem credenciais diferentes (blast radius limitado); e o Vault tem audit log de cada solicitação, mostrando qual pod/service account obteve quais credenciais em qual momento — forense completo se houver incidente.

Deletar um segredo commitado do repositório resolve o problema?

Não. Git é uma estrutura de dados imutável — cada commit é um snapshot permanente. Deletar o arquivo em um novo commit apenas remove a referência atual; o conteúdo ainda existe em todos os commits anteriores, acessível via git log --all -p, git show <commit-hash>:arquivo, ou qualquer clone existente do repositório.

A resposta correta a um segredo commitado é: (1) assumir comprometimento e revogar/rotacionar o segredo imediatamente — não espere confirmação de uso malicioso; (2) reescrever o histórico com git filter-repo --path arquivo --invert-paths para remover o arquivo de todos os commits; (3) force push de todas as branches afetadas; (4) notificar todos os colaboradores que precisam fazer clone fresco, pois clones locais ainda têm o histórico. Para repositórios públicos, assume-se que bots de scanning como GitGuardian já coletaram o segredo — revogação imediata é a única defesa.

Como External Secrets Operator (ESO) funciona e quando preferir ao Vault Agent?

O ESO é um Kubernetes controller que lê recursos ExternalSecret (CRDs) e sincroniza o valor de secrets externos para K8s Secrets nativos. Você define "busque o segredo prod/myapp/db do AWS Secrets Manager e crie um K8s Secret db-credentials no namespace app com TTL de 1 hora". O ESO renova periodicamente e atualiza o K8s Secret. A aplicação lê o K8s Secret normalmente — sem saber que a fonte é AWS SM.

Prefira ESO quando: você usa AWS SM, GCP SM ou Azure Key Vault como fonte de verdade (ESO tem providers para todos); os segredos não mudam frequentemente (rotação de 30+ dias); e você quer mínima invasividade nos deployments (sem sidecar). Prefira Vault Agent quando: você usa Vault com dynamic secrets (ESO não suporta dynamic secrets — ele apenas sincroniza valores estáticos); os segredos têm TTL curto (horas); ou você quer que os segredos nunca apareçam no etcd. A distinção principal é dynamic (Vault Agent) vs sincronização de valores estáticos (ESO).

O que é least privilege aplicado a segredos e por que importa mais que a tecnologia?

Least privilege em secrets management significa que cada serviço ou identidade tem acesso apenas aos segredos que precisa, com as permissões mínimas necessárias. O serviço de relatórios tem GetSecretValue apenas para o segredo de banco de leitura. O serviço de pagamentos tem acesso apenas à chave de API do gateway de pagamentos. A aplicação web não tem acesso às credenciais de admin do banco.

Isso importa mais que a tecnologia porque um Vault perfeitamente configurado com dynamic secrets ainda é perigoso se todas as aplicações compartilham o mesmo Vault role com acesso a todos os paths. E variáveis de ambiente podem ser razoavelmente seguras se o processo tem escopo de acesso bem definido e há monitoramento. O blast radius de um comprometimento é delimitado pelo escopo de acesso: um serviço comprometido com least privilege expõe apenas os segredos daquele serviço, não as credenciais de todos os sistemas. Em prática: IAM roles distintos por serviço na AWS, Vault policies por AppRole/K8s service account, e K8s RBAC limitando get/list de secrets por namespace e service account.

Como praticar

  1. Configurar Vault local com dynamic secrets para PostgreSQL. Suba um Vault em modo dev (docker run -p 8200:8200 hashicorp/vault server -dev) e um PostgreSQL (docker run -p 5432:5432 -e POSTGRES_PASSWORD=admin postgres). Configure o secrets engine de database conforme os exemplos acima e solicite credenciais dinâmicas. Observe no PostgreSQL que o usuário temporário foi criado; aguarde o TTL e observe que o usuário foi revogado automaticamente.
    Critério: Após solicitar credenciais com vault read database/creds/app-role, verificar com psql -c "\du" que o usuário temporário existe. Aguardar o TTL e confirmar que o usuário foi revogado — a conexão com as credenciais antigas deve falhar com "role does not exist".
  2. Instalar Gitleaks como pre-commit hook em um projeto existente. Instale pre-commit e configure o Gitleaks hook. Tente commitar um arquivo com uma string que parece uma chave AWS (AKIA + 16 chars aleatórios) — o hook deve bloquear. Execute gitleaks detect --source . --log-opts "--all" no repositório e analise os resultados — provavelmente encontrará algo que não deveria estar lá.
    Critério: O hook deve bloquear um commit com string AKIAIOSFODNN7EXAMPLE em qualquer arquivo, exibindo a detecção com tipo de segredo e linha. O scan de histórico deve completar sem erros de configuração e produzir um relatório JSON analisável.
  3. Auditar os segredos da sua aplicação. Liste todos os segredos que sua aplicação usa: senhas de banco, chaves de API, tokens de serviços terceiros, certificados. Para cada um: onde está armazenado? Quem tem acesso? Quando foi rotacionado pela última vez? Existe audit log de acesso? O resultado revela o gap entre a prática atual e o ideal — e prioriza o que corrigir primeiro.
    Critério: Produzir uma tabela com colunas: segredo, localização atual, quem pode acessar, última rotação, existe audit log (S/N). Identificar pelo menos um segredo de alto risco (acesso excessivo ou nunca rotacionado) e propor plano de remediação com tecnologia e timeline específicos.
  4. Configurar ESO para sincronizar segredo do AWS Secrets Manager com Kubernetes. Em um cluster Kind local com ESO instalado, crie um SecretStore apontando para AWS SM (use credenciais locais ou fake para Kind) e um ExternalSecret que sincronize um segredo. Verifique que o K8s Secret é criado com o valor correto e que o ESO atualiza o Secret quando o valor muda no AWS SM.
    Critério: kubectl get externalsecret -n app deve mostrar status SecretSynced. Alterar o valor no AWS SM e aguardar o TTL de refresh — kubectl get secret db-credentials -o yaml | base64 -d deve mostrar o novo valor sem intervenção manual.
  5. Implementar rotação zero-downtime com Vault e reconexão automática. Usando o setup do exercício 1, configure uma aplicação Python que mantém uma conexão de banco de longa duração. Implemente o padrão de reconexão que lê credenciais do arquivo /vault/secrets/db-creds e detecta mudança de senha. Simule a renovação de credenciais pelo Vault Agent e verifique que a aplicação reconecta sem erro.
    Critério: A aplicação deve operar continuamente durante a renovação de credenciais — sem exceção "password authentication failed" no log e sem restart manual. Registrar no log o timestamp da detecção de mudança de credencial e da reconexão bem-sucedida.

Referências para aprofundar

  1. docs HashiCorp Vault — Documentação Oficial. developer.hashicorp.com/vault/docs. Documentação completa do Vault — getting started, secrets engines, auth methods, e políticas. O tutorial de dynamic secrets para PostgreSQL é o ponto de partida mais prático.
  2. docs AWS Secrets Manager — Developer Guide. docs.aws.amazon.com/secretsmanager. Inclui guia de rotação automática para RDS, integração com Lambda, e padrões de acesso com IAM. Capítulo de best practices é leitura obrigatória antes de colocar em produção.
  3. article How to Handle Secrets on the Command Line — SmallStep (smallstep.com). Guia prático de como evitar vazamento de segredos em sessões de terminal — history bash, process list, environment variables em logs. Inclui configuração de shell que não persiste commandos com senhas no history.
  4. docs External Secrets Operator — Documentação. external-secrets.io. Documentação do ESO — sincronização de secrets externos para Kubernetes. Inclui exemplos para AWS SM, GCP SM, Vault, e Azure Key Vault. O padrão mais adotado para secrets em Kubernetes sem Vault agent.
  5. article Gitleaks — Secret Scanner for Git Repositories. github.com/gitleaks/gitleaks. O repositório oficial com documentação de configuração, regras customizadas, e integração com CI/CD. Inclui exemplo de custom rules para padrões de segredo específicos da organização.
  6. article GitGuardian State of Secrets Sprawl — GitGuardian (relatório anual). gitguardian.com/state-of-secrets-sprawl. Relatório anual com dados quantitativos de segredos encontrados em repositórios públicos do GitHub — número de segredos, tipos mais comuns, tempo de permanência. Contextualiza a escala do problema.
  7. article Vault Dynamic Secrets in Kubernetes — HashiCorp Learn. developer.hashicorp.com/vault/tutorials/kubernetes. Tutorial completo de integração Vault + Kubernetes com Vault Agent Sidecar Injector — do setup ao pod recebendo credenciais dinâmicas de banco automaticamente.
  8. book Secrets of a Cyber Security Architect — Brook S.E. Schoenfield (Auerbach, 2019). Perspectiva de arquiteto de segurança sênior sobre gestão de identidade, segredos, e confiança em sistemas distribuídos. Menos técnico que os outros recursos, mais focado em padrões de design e decisões arquiteturais.
  9. video Secrets Management at Scale — Armon Dadgar, HashiCorp (HashiConf). Palestra do CTO da HashiCorp sobre o design do Vault e os princípios de secrets management em sistemas distribuídos. Disponível no YouTube canal HashiCorp. Bom para entender o racional por trás das decisões de design do Vault.
  10. docs OWASP Secrets Management Cheat Sheet. cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet. Checklist de secrets management — onde não armazenar, como rotacionar, como auditar, e como detectar vazamentos. Referência prática para revisão de postura de segurança.
  11. article AWS KMS Best Practices — AWS Security Blog. aws.amazon.com/blogs/security. Guias de uso correto de KMS — Customer Managed Keys vs AWS Managed Keys, rotação de CMK, auditoria de uso via CloudTrail, e integração com outros serviços AWS para envelope encryption.
  12. article Scanning for Leaked Secrets in Git History — Julia Evans (jvns.ca). Artigo prático sobre como encontrar segredos em git history com ferramentas como TruffleHog e git log. Inclui a explicação de como git armazena conteúdo e por que "deletar" não remove do histórico.