Segurança Nathan Geeksman

Secrets management: nunca mais comite credencial no repositório

Secrets management: nunca mais comite credencial no repositório

Secrets management: nunca mais comite credencial no repositório

Introdução

O gerenciamento de segredos é uma prática crítica na produção de software confiável e seguro. Ao longo dos anos, temos visto crescentes ataques cibernéticos e violações de dados que podem ser rastreadas à falta de controle sobre credenciais sensíveis, como senhas e chaves de API.

Neste contexto atual, onde a automação e o uso de ferramentas de terceiros são cada vez mais comuns, os riscos associados ao compartilhamento e uso dessas credenciais em código aberto ou repositórios não autorizados se tornam uma preocupação central.

Este artigo visa fornecer orientações práticas sobre como gerenciar segredos de forma eficaz, evitando a exposição inesperada de informações confidenciais. Ao ler este conteúdo, você aprenderá técnicas para proteger suas credenciais em projetos de desenvolvimento de software, melhorar a segurança geral do seu ambiente de trabalho e seguir as melhores práticas no gerenciamento de segredos.

O que é e por que importa

O gerenciamento de segredos (Secrets Management) refere-se ao processo sistemático de proteger e controlar informações confidenciais, como senhas, chaves de API e outros dados sensíveis, em ambientes de desenvolvimento e produção. Essas credenciais são fundamentais para autenticação e autorização em sistemas e serviços online.

A motivação por trás do gerenciamento eficaz de segredos é a redução significativa do risco associado à exposição dessas informações. Quando esses dados sensíveis estão expostos, os atacantes podem acessar não apenas o sistema atualmente configurado com as credenciais comprometidas, mas também outros sistemas que possam compartilhar as mesmas credenciais ou que estejam vulneráveis a ataques de rechabeamento (credential stuffing).

O problema mais crítico é que essas violações muitas vezes não são detectadas imediatamente. Ataques como o exposição de dados sensíveis em repositórios podem permanecer desconhecidos por períodos prolongados, permitindo que os atacantes mantenham acesso contínuo ao sistema comprometido até que sejam descobertos ou até mesmo mais tempo.

O gerenciamento de segredos é essencial para garantir que as informações confidenciais não estejam disponíveis em código aberto (por exemplo, .env files) e evitar o armazenamento de credenciais sensíveis em repositórios públicos ou inseguros. Isso inclui a implementação de métodos robustos para gerenciar segredos nos ambientes de desenvolvimento, teste e produção, garantindo que as informações protegidas estejam disponíveis apenas onde necessário.

Como funciona na prática

O gerenciamento de segredos é um processo que envolve várias etapas e ferramentas para proteger informações confidenciais. Aqui estão algumas das principais características:

  • Uso de variáveis de ambiente: As credenciais são armazenadas como variáveis de ambiente, criptografadas ou não, em arquivos separados dos códigos-fonte.
  • Gerenciamento de segredos com ferramentas externas: Utilização de soluções como Hashicorp's Vault, AWS Secrets Manager, Google Cloud Secret Manager, entre outras, para armazenar e gerenciar credenciais de forma centralizada.
  • Integração com pipelines de CI/CD: Configuração das ferramentas de gerenciamento de segredos para serem utilizadas nas etapas de build e deploy dos aplicativos, garantindo que as credenciais estejam disponíveis somente onde necessário.
  • Rotina de gerenciamento de segredos: Definição de procedimentos rotineiros para a geração e renovação de tokens, chaves de API e outras credenciais sensíveis, evitando armazená-las permanentemente em variáveis de ambiente ou em repositórios.
  • Auditorias e monitoramento: Implementação de mecanismos de auditoria e monitoramento para detectar possíveis vazamentos ou alterações não autorizadas nos ambientes de desenvolvimento e produção.

Exemplo real

Aqui está um exemplo de como implementar a gestão de segredos utilizando uma ferramenta externa, como o Hashicorp's Vault, em conjunto com uma pipeline de CI/CD.

// Configuração do arquivo secrets.json para o Hashicorp's Vault
{
  "vault_url": "https://localhost:8200",
  "token": "sv=dEhYmQxKtX5G3gF6lM7n8sS9fVqU4bWcKqP1aT2eR1Z3A3o1zY0NjMwOTkzMTI=",
  "credenciais": {
    "database": {
      "usuario": "appuser",
      "senha": "app123"
    },
    "api_key": {
      "chave": "abc123",
      "assinatura": "app-assinatura"
    }
  }
}

// Pipeline de CI/CD utilizando o Jenkins e o Hashicorp's Vault
pipeline {
  agent any

  stages {
    stage('Build') {
      steps {
        // Baixar as dependências do projeto
        sh 'npm install'
        
        // Gerenciar credenciais utilizando o Hashicorp's Vault
        withCredentials([usernamePassword(credentialsId: 'my-credentials', passwordVariable: 'VAULT_PASSWORD', usernameVariable: 'VAULT_USERNAME')]) {
          sh "vault login -method=github ${VAULT_USERNAME} && vault kv get secrets/database"
        }
      }
    }

    stage('Deploy') {
      steps {
        // Enviar o aplicativo para produção
        sh 'docker build . -t meu-aplicativo'
        
        // Utilizar as credenciais gerenciadas pelo Hashicorp's Vault
        withCredentials([usernamePassword(credentialsId: 'my-credentials', passwordVariable: 'VAULT_PASSWORD', usernameVariable: 'VAULT_USERNAME')]) {
          sh "vault login -method=github ${VAULT_USERNAME} && vault kv get secrets/api_key"
        }
      }
    }
  }
}

Nesse exemplo, o Hashicorp's Vault é utilizado para armazenar e gerenciar as credenciais do aplicativo. A pipeline de CI/CD utiliza essas credenciais para build e deploy do aplicativo. O uso do Hashicorp's Vault garante que as credenciais estejam disponíveis apenas onde necessário, reduzindo o risco de vazamentos ou acesso não autorizado.

Boas práticas

Armazenamento de credenciais em vez de hardcoding

  • Evite armazenar credenciais como strings planas no código ou arquivos de configuração.
  • Em vez disso, utilize mecanismos de armazenamento seguro como Hashicorp's Vault ou Kubernetes Secrets.

Utilização de plugins de segurança

  • Utilize plugins de segurança integrados ao Jenkins para monitorar e proteger a execução da pipeline.
  • Exemplos incluem o plugin de segurança do Jenkins e o plugin de auditoria.

Armadilhas comuns

Dependência excessiva em credenciais hardcoded

  • Evite armazenar credenciais como strings planas no código ou arquivos de configuração, pois isso pode causar vazamentos de informações.
  • Em vez disso, utilize mecanismos de armazenamento seguro.

Utilização inadequada de Hashicorp's Vault

  • Certifique-se de que o Hashicorp's Vault esteja configurado corretamente e está sendo utilizado corretamente pela pipeline de CI/CD.
  • Isso inclui garantir que as credenciais estejam sendo gerenciadas de forma adequada e que o acesso às credenciais seja restrito a quem necessário.

Conclusão

A gestão de segredos é uma prática essencial para garantir a segurança e confiabilidade dos aplicativos em produção. Ao adotar estratégias adequadas, como utilizar Hashicorp's Vault ou Kubernetes Secrets, é possível evitar o uso de credenciais hardcoded em código ou configurações.

Para melhorar ainda mais a gestão de segredos no seu projeto, considere os seguintes passos:

  • Avalie a infraestrutura atual e identifique áreas onde sejam necessárias melhorias na armazenamento e gerenciamento de segredos.
  • Implemente práticas de desenvolvimento devops para garantir que credenciais estejam sendo utilizadas da maneira correta e mais segura possível.
  • Aprofunde sua compreensão sobre a segurança dos ambientes de produção, incluindo as necessidades específicas de segurança relacionadas às suas tecnologias e soluções escolhidas.

Ao adotar essas medidas, você pode garantir que seus aplicativos estejam mais resilientes contra ameaças e menos propensos a erros causados por credenciais inadequadas.

Referências

  • OWASP. Secrets Management. Disponível em: https://owasp.org/www-project-secrets-management/. Acesso: 2024.
  • Hashicorp. Vault by HashiCorp. Disponível em: https://www.hashicorp.com/products/vault. Acesso: 2024.
  • Kubernetes. Secrets Management. Disponível em: https://kubernetes.io/docs/concepts/configuration/secret/. Acesso: 2024.
  • Martin Fowler. API Keys as passwords. Disponível em: https://martinfowler.com/articles/api-key-security.html#keys-as-passwords. Acesso: 2024.
  • OWASP. OWASP Secure Coding Practices - Guidelines for Secure Secret Management. Disponível em: https://owasp.org/www-project-secure-coding-practices-guidelines/secret-management/. Acesso: 2024.