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:
-
Roubar informações confidenciais como:
- Chaves de criptografia
- Credenciais de acesso
- Propriedade intelectual
-
Incorporar código malicioso em seu projeto sem seu conhecimento
-
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