Explore a segurança do pipeline de DevOps

Concluído

O objetivo de um pipeline de DevOps Seguro é permitir que as equipes de desenvolvimento trabalhem rapidamente sem introduzir vulnerabilidades de segurança indesejadas em seus projetos. Esse equilíbrio entre velocidade e segurança requer a incorporação de práticas de segurança em todo o pipeline, em vez de tratar a segurança como uma fase separada.

Fluxo de trabalho de pipeline de DevOps seguro

Um pipeline abrangente de Secure DevOps integra verificações de segurança em vários estágios do processo de entrega de software:

Diagrama mostrando o fluxo de trabalho do Secure Azure Pipelines com 10 estágios interconectados organizados em um círculo contínuo representando o processo de entrega integrado à segurança.

O fluxo de trabalho garante que a validação de segurança ocorra continuamente desde a confirmação do código até a implantação da produção. Cada etapa inclui controles de segurança apropriados que são executados automaticamente sem a necessidade de intervenção manual para verificações de rotina.

Recursos de segurança essenciais além dos dutos padrão

Os pipelines de DevOps seguros incorporam recursos de segurança adicionais que normalmente não são encontrados em pipelines de CI/CD padrão. Esses recursos abordam vulnerabilidades de segurança comuns que os pipelines tradicionais ignoram:

Gerenciamento de pacotes com aprovação de segurança

O desafio: Os aplicativos modernos dependem de vários pacotes, bibliotecas e componentes de terceiros. Estas dependências introduzem riscos de segurança:

  • Vulnerabilidades conhecidas: Os pacotes de terceiros podem conter vulnerabilidades de segurança conhecidas que os atacantes podem explorar.
  • Pacotes maliciosos: Os atacantes às vezes publicam pacotes maliciosos com nomes semelhantes aos pacotes populares, esperando que os desenvolvedores os instalem por engano (typosquatting).
  • Ataques à cadeia de abastecimento: Repositórios de pacotes comprometidos ou contas de mantenedores podem resultar na distribuição de códigos maliciosos através de canais de atualização legítimos.
  • Conformidade com a licença: Algumas licenças de pacotes podem não ser compatíveis com o uso pretendido, criando riscos legais.
  • Pacotes sem manutenção: Os pacotes que não são mais mantidos não receberão atualizações de segurança, criando vulnerabilidades de longo prazo.

A solução: O gerenciamento de pacotes com processos de aprovação adiciona portas de segurança para dependências:

Etapas do fluxo de trabalho de aprovação:

  1. Pedido de pacote: Os desenvolvedores solicitam aprovação para adicionar novos pacotes ou atualizar os existentes.
  2. Verificação de segurança: Ferramentas automatizadas verificam pacotes em busca de vulnerabilidades conhecidas usando bancos de dados de vulnerabilidades como CVE (Common Vulnerabilities and Exposures) e NVD (National Vulnerability Database).
  3. Revisão da licença: As ferramentas automatizadas verificam as licenças de pacotes em relação às políticas organizacionais.
  4. Análise de dependência: As ferramentas analisam dependências transitivas (dependências de dependências) para problemas de segurança.
  5. Revisão manual: A equipe de segurança analisa pacotes de alto risco ou pacotes que solicitam permissões elevadas.
  6. Aprovação ou rejeição: Os pacotes são aprovados para uso, rejeitados ou sinalizados para correção antes da aprovação.
  7. Monitorização contínua: Os pacotes aprovados são continuamente monitorados em busca de vulnerabilidades recém-descobertas.

Benefícios da identificação precoce: Essas etapas devem ser implementadas no início do pipeline para identificar problemas mais cedo no ciclo de desenvolvimento:

  • Os problemas encontrados no início são menos dispendiosos de corrigir do que os encontrados na produção.
  • Os desenvolvedores podem escolher pacotes alternativos antes de criar funcionalidades significativas em torno de dependências vulneráveis.
  • As revisões de segurança não se tornam gargalos quando ocorrem de forma incremental, em vez de todas de uma só vez antes do lançamento.

Exemplos de ferramentas:

  • Artefatos do Azure: Fornece gerenciamento de pacotes com fontes upstream e verificação de vulnerabilidades.
  • GitHub Dependabot: Deteta automaticamente dependências vulneráveis e cria solicitações pull para atualizá-las.
  • Snyk: Analisa dependências em busca de vulnerabilidades e problemas de licença.
  • Fonte branca: Fornece análise de composição de software para componentes de código aberto.

Análise de segurança do código-fonte

O desafio: O código-fonte do aplicativo pode conter vulnerabilidades de segurança que não são imediatamente óbvias durante o desenvolvimento:

  • Vulnerabilidades de injeção: Injeção de SQL, injeção de comando e outras vulnerabilidades de injeção.
  • Problemas de autenticação: Mecanismos de autenticação fracos, credenciais codificadas ou gerenciamento de sessão inadequado.
  • Exposição de dados sensíveis: Inclusão acidental de segredos, chaves de API ou informações pessoais no código.
  • Configuração incorreta de segurança: Configurações padrão inseguras, recursos desnecessários habilitados ou patches de segurança ausentes.
  • Usando componentes com vulnerabilidades conhecidas: Bibliotecas ou estruturas desatualizadas com problemas de segurança.
  • Registo e monitorização insuficientes: Falta de registro de eventos de segurança adequado para deteção e resposta a incidentes.

A solução: A verificação do código-fonte adiciona análise de segurança automatizada ao processo de compilação:

Teste estático de segurança de aplicativos (SAST):

  • Analisa o código-fonte sem executá-lo.
  • Identifica possíveis vulnerabilidades de segurança no código.
  • Deteta padrões de vulnerabilidade comuns, como injeção de SQL, scripts entre sites (XSS) e estouros de buffer.
  • Fornece locais de código específicos e orientações para remediação.
  • É executado com rapidez suficiente para fornecer feedback durante o processo de compilação.

Digitalização secreta:

  • Deteta segredos confirmados acidentalmente, como chaves de API, senhas e certificados.
  • Impede que as credenciais sejam implantadas na produção.
  • Alerta os desenvolvedores imediatamente quando segredos são detetados.
  • Pode revogar automaticamente as credenciais detetadas quando integrado com sistemas de gerenciamento secretos.

Análise da qualidade do código:

  • Identifica problemas de qualidade de código que podem levar a vulnerabilidades de segurança.
  • Deteta caminhos de código complexos que são difíceis de proteger corretamente.
  • Destaca áreas que precisam de revisão de segurança adicional.

Tempo de digitalização: A verificação do código-fonte ocorre depois que o aplicativo é criado, mas antes do lançamento e do teste de pré-lançamento:

  • Após a construção: O código completo do aplicativo está disponível para análise, incluindo o código gerado.
  • Antes do ensaio: As vulnerabilidades são identificadas antes que os recursos de teste de segurança sejam investidos.
  • Antes da implantação: Os problemas são detetados antes de chegar aos ambientes de preparação ou produção.

Benefícios da deteção precoce:

  • A verificação de origem identifica vulnerabilidades de segurança no início do ciclo de desenvolvimento.
  • Os desenvolvedores recebem feedback imediato sobre problemas de segurança em seu código.
  • Os problemas de segurança são resolvidos enquanto o código está fresco na mente dos desenvolvedores.
  • O custo de corrigir vulnerabilidades é significativamente menor do que corrigi-las na produção.

Exemplos de ferramentas:

  • CodeQL do GitHub: Mecanismo de análise semântica de código que descobre vulnerabilidades em uma base de código.
  • SonarQube: Ferramenta de inspeção contínua que deteta bugs, cheiros de código e vulnerabilidades de segurança.
  • Checkmarx: Plataforma estática de testes de segurança de aplicações.
  • Veracode: Plataforma de análise de segurança com capacidades SAST.
  • Análise de código de segurança da Microsoft: Extensão para o Azure DevOps que executa ferramentas de análise de segurança.

Integração com entrega contínua

Tanto a aprovação do gerenciamento de pacotes quanto a verificação do código-fonte integram-se perfeitamente aos pipelines de entrega contínua:

Portões automatizados: As verificações de segurança tornam-se portões de oleoduto automatizados que devem passar antes que o gasoduto prossiga. Verificações de segurança com falha impedem que o código inseguro avance.

Feedback rápido: Os desenvolvedores recebem feedback de segurança em minutos, em vez de dias ou semanas. Esse feedback rápido permite correções rápidas antes que o contexto seja perdido.

Visibilidade de segurança: As equipes de segurança ganham visibilidade de todos os códigos e dependências que estão sendo implantados sem a necessidade de revisar manualmente todas as alterações.

Documentação de conformidade: As verificações de segurança automatizadas criam trilhas de auditoria que documentam a validação de segurança em cada estágio do pipeline.

Abordar o ciclo de vida completo

Nas seções a seguir deste módulo, exploraremos esses recursos de segurança essenciais em detalhes:

  • Principais pontos de validação onde devem ocorrer verificações de segurança.
  • Estratégias contínuas de validação de segurança.
  • Abordagens de implementação para diferentes tipos de pipeline.
  • Ferramentas e técnicas para uma automação de segurança eficaz.
  • Como equilibrar o rigor da segurança com a velocidade de entrega.