Ambiente de Desenvolvimento Seguro


Introdução

Não é incomum que aplicações sejam desenvolvidas sem considerar a segurança durante as fases de design e planejamento. Frequentemente, uma aplicação completa é entregue às equipes de Operações para implementação em produção, apenas para ser comprometida posteriormente, forçando as Operações a desligar os servidores (Não deveria funcionar assim, porém, em um caso crítico, não há muito o que fazer).

Aplicações desenvolvidas sem a contribuição da equipe de segurança são altamente vulneráveis a ciberataques. Quando consideramos:

  • O custo do tempo de inatividade
  • Os recursos necessários para corrigir vulnerabilidades de segurança
  • O risco de violação ou vazamento de dados
  • Os danos à reputação da organização

Fica claro que implementar segurança no desenvolvimento de aplicações não deve ser uma decisão tardia.

Por que a segurança deve começar no início do desenvolvimento?

Você pode evitar problemas de segurança em sua organização envolvendo a equipe de segurança desde o início do processo de desenvolvimento de software. É fundamental estabelecer uma colaboração sólida com os profissionais de segurança já na fase de concepção e começar a escrever código seguro desde o princípio.

Porém, escrever código seguro não é suficiente. O ambiente de desenvolvimento também deve ser seguro. Os sistemas e plataformas de desenvolvimento são vulneráveis aos mesmos tipos de ataques que afetam os ambientes de produção.

Segurança como esforço de equipe

A segurança é responsabilidade de todos na equipe DevOps. Todos que interagem com a aplicação, seus serviços e a plataforma onde é executada têm responsabilidade pela segurança, desde a concepção até a implementação e produção.

A combinação das habilidades de DevOps e Segurança traz uma compreensão mais profunda sobre:

  • Desenvolvimento de código defensivo
  • Riscos aos sistemas em construção
  • Estratégias de mitigação de ameaças

O que é um ambiente de desenvolvimento seguro?

Um ambiente de desenvolvimento seguro é um processo contínuo de proteção da:

  • Rede
  • Recursos computacionais
  • Dispositivos de armazenamento (tanto locais quanto na nuvem)

Proteger seu ambiente de desenvolvimento reduz o risco de invasores que tentam:

  1. Roubar informações confidenciais como:

    • Chaves de criptografia
    • Credenciais de acesso
    • Propriedade intelectual
  2. Incorporar código malicioso em seu projeto sem seu conhecimento

  3. Utilizar seu sistema como ferramenta para lançar outros ataques ao:

    • Pipeline de construção e implementação
    • Outras máquinas na rede

Práticas para um ambiente de desenvolvimento seguro

Manutenção e proteção de sistemas

  • Mantenha todo o software atualizado e remova ou desative serviços desnecessários
  • Proteja fisicamente as máquinas de desenvolvimento
  • Utilize máquinas separadas para codificação e negócios:
    • Use uma máquina virtual
    • Utilize contêineres Docker
    • Dedique um computador separado para funções relacionadas ao negócio

“Eu faço todo o meu desenvolvimento em contêineres Docker para ter um ambiente conhecido isolado sempre que começo a programar. E os meus repositórios de projetos estão configurados para que todos os membros da minha equipe tenham também o mesmo ambiente em contêineres.”

Autenticação e acesso

  • Use senhas complexas e implemente mudanças frequentes
  • Implemente autenticação multifator
  • Proteja o repositório de código
  • Proteja seu pipeline de construção e desenvolvimento

Monitoramento e testes

  • Invista em controles de monitoramento, registro e auditoria
  • Teste continuamente a segurança
  • Planeje para falhas de segurança
  • Procure pontos fracos e vulnerabilidades que permitam entradas maliciosas

Gerenciamento de dependências

  • Utilize ferramentas de gestão de dependências para:
    • Gerenciar downloads
    • Acompanhar atualizações de versões
    • Inspecionar dependências indiretas

“Use um gerenciador de dependências para listar todas as dependências diretas e indiretas para inspecionar todo o código. Ao atualizar as dependências, esteja ciente de quaisquer novas dependências indiretas que também possam entrar no seu projeto.”

O que caracteriza um ambiente de desenvolvimento inseguro?

Um ambiente de desenvolvimento é considerado inseguro quando:

  • Os sistemas de produção são seguros, mas o ambiente de desenvolvimento não:

    • Há um ambiente de desenvolvimento sem controles adequados
    • Existem ligações diretas à infraestrutura de produção
  • Máquinas de desenvolvimento comprometidas:

    • Se suas máquinas de desenvolvimento estão comprometidas, o mesmo ocorre com seu ambiente de produção
  • Ausência de processos críticos:

    • Falta de monitoramento
    • Ausência de registro de atividades
    • Inexistência de auditoria de proteção
  • Vulnerabilidades de segurança:

    • Ausência de produtos antivírus ou anti-malware atualizados
    • Acesso sem restrições a repositórios de código não aprovados
    • Falta de governança ou políticas para obtenção de código

Práticas recomendadas para proteção do ambiente de desenvolvimento

Proteger a conexão à Internet

As redes inseguras são altamente vulneráveis a ataques. Para obter uma conexão segura:

  • Verifique regularmente se existem portas abertas e feche as desnecessárias
  • Configure firewalls com políticas de tráfego rigorosas

“É aqui que o desenvolvimento em contêineres Docker é realmente útil, porque os contêineres estão numa rede separada e isolada do seu computador de desenvolvimento e todas as portas estão fechadas para o exterior por predefinição.”

Implementar autenticação multifator

  • Proteja-se contra roubo de identidade
  • Senhas sozinhas não são suficientes
  • Evite que atacantes se aproveitem das permissões de um programador
  • Proteja segredos de serem roubados ou perdidos
  • Adicione segurança extra para programadores que precisam acessar sistemas de produção

Monitorar ambientes e atividades

  • Monitore os ambientes dos programadores, mas sem excesso
  • Bloqueie as máquinas o suficiente para segurança, mas permitindo acesso aos recursos necessários

“Confie em mim, caso contrário, os programadores começarão a utilizar ‘soluções alternativas’ para ultrapassar as verificações de segurança, deixando as suas máquinas vulneráveis a ataques.”

Incorporar hábitos de segurança diários

  • Fique atento a atividades suspeitas
  • Utilize utilitários de rede para verificar sites
  • Acompanhe todos os commits e alterações feitas pelos programadores
  • Use ganchos de pré-compilação para evitar o envio de dados sensíveis aos repositórios

Conclusão

  • A segurança não deve ser deixada para o último momento do processo de desenvolvimento
  • A colaboração entre equipes de Segurança e Desenvolvimento promove uma compreensão mais profunda do desenvolvimento de código defensivo
  • A segurança é responsabilidade de todos que interagem com a aplicação e seu ambiente
  • Monitore as atividades em sua rede, máquinas e ambiente para identificar vulnerabilidades
  • Implemente autenticação multifator e criptografia para proteger senhas e segredos
  • Adicione medidas de segurança adicionais para desenvolvedores que exigem acesso a sistemas de produção
  • Acompanhe todas as alterações feitas por desenvolvedores para referência futura