Explore a análise de composição de software
A Análise de Composição de Software (SCA) é um processo automatizado para identificar componentes de código aberto e de terceiros em aplicativos, analisando suas vulnerabilidades de segurança, conformidade de licenças e qualidade de código. À medida que as aplicações modernas dependem cada vez mais de dependências externas, a SCA tornou-se essencial para gerir os riscos associados às cadeias de fornecimento de software.
O que é a Análise de Composição de Software?
A Análise de Composição de Software é a prática de descobrir, catalogar e analisar automaticamente todos os componentes de código aberto e de terceiros usados em um aplicativo. As ferramentas SCA examinam manifestos de pacotes, arquivos de bloqueio de dependência, código-fonte e binários compilados para criar uma lista de materiais de software abrangente (SBOM).
Principais capacidades de SCA
Descoberta de dependência:
- Análise de manifesto: As ferramentas SCA leem arquivos de manifesto do pacote (package.json, requirements.txt, pom.xml, *.csproj) para identificar dependências declaradas.
- Análise de arquivo de bloqueio: Analise arquivos de bloqueio (package-lock.json, Pipfile.lock, Gemfile.lock) mostrando versões exatas instaladas, incluindo dependências transitivas.
- Varredura binária: Ferramentas avançadas verificam artefatos compilados, imagens de contêiner e aplicativos implantados para descobrir dependências incorporadas não declaradas em manifestos.
- Suporte multi-idioma: Ferramentas abrangentes suportam dezenas de linguagens de programação e ecossistemas de pacotes (módulos npm, PyPI, Maven, NuGet, RubyGems, Go).
Análise de vulnerabilidade:
- Correspondência com CVE: Compare as dependências descobertas com bancos de dados de Vulnerabilidades e Exposições Comuns (CVE).
- Pontuação de gravidade: Calcule as pontuações do Common Vulnerability Scoring System (CVSS) indicando a gravidade da vulnerabilidade de 0 (nenhuma) a 10 (crítica).
- Inteligência de exploração: Identifique quais vulnerabilidades têm exploits conhecidos usados ativamente por invasores.
- Recomendações de patches: Sugira atualizações de versão específicas que resolvam vulnerabilidades mantendo a compatibilidade.
Conformidade com a licença:
- Deteção de licença: Identifique licenças para todas as dependências analisando arquivos de licença, metadados de pacotes e cabeçalhos de código-fonte.
- Aplicação da política: Sinalize automaticamente dependências que violem as políticas de licença organizacional.
- Análise de compatibilidade: Detete licenças conflitantes que não podem ser legalmente combinadas no mesmo aplicativo.
- Acompanhamento das obrigações: Documentar requisitos de licença, como avisos de atribuição, divulgação de código-fonte ou restrições de trabalho derivadas.
Avaliação da qualidade:
- Estado de manutenção: Avalie se as dependências são ativamente mantidas ou abandonadas.
- Saúde comunitária: Avalie a atividade do colaborador, o tamanho da comunidade e a sustentabilidade do projeto.
- Práticas de segurança: Verificar se os projetos têm processos de divulgação responsáveis e avisos de segurança.
- Recomendações de atualização: Identifique dependências desatualizadas e sugira alternativas mais seguras e atuais.
Por que a SCA é crítica para o DevOps
As modernas práticas de desenvolvimento de software tornam a SCA indispensável:
A explosão da dependência
Os aplicativos contêm centenas de dependências:
- Dependências diretas: A aplicação típica faz referência direta a 20-50 pacotes externos.
- Dependências transitivas: Cada dependência direta traz suas próprias dependências, criando árvores de dependência com 200-500 pacotes totais.
- Múltiplos ecossistemas: Os aplicativos geralmente combinam dependências de vários ecossistemas de linguagem (frontend JavaScript, backend Python, microsserviços Java).
- Dependências de contêiner: Os aplicativos em contêineres incluem dependências de imagem base mais dependências de aplicativos.
O rastreamento manual é impossível:
- Escala: Rastrear manualmente centenas de dependências em dezenas de aplicativos é impraticável.
- Velocidade: Novas vulnerabilidades são divulgadas diariamente, tornando qualquer inventário manual imediatamente desatualizado.
- Complexidade: Compreender as cadeias de dependência transitivas e suas interações requer análise automatizada.
- Propriedade distribuída: Dependências mantidas por milhares de projetos independentes de código aberto em todo o mundo.
O imperativo de segurança
As vulnerabilidades nas dependências são ativamente exploradas:
- Violações de alto perfil: Os principais incidentes de segurança envolvem regularmente a exploração de vulnerabilidades conhecidas em pacotes populares de código aberto.
- Ataques à cadeia de abastecimento: Os atacantes comprometem pacotes legítimos para distribuir malware aos consumidores a jusante.
- Vulnerabilidades de dia zero: Vulnerabilidades anteriormente desconhecidas em pacotes amplamente utilizados podem afetar milhares de organizações simultaneamente.
- Urgência do patch: As vulnerabilidades críticas exigem rápida identificação e correção em todos os aplicativos afetados.
As ferramentas de segurança tradicionais ignoram as vulnerabilidades de dependência:
- Análise estática: As ferramentas de verificação de código-fonte analisam seu código, mas não o código de dependência.
- Testes dinâmicos: O teste de penetração pode perder vulnerabilidades em dependências não acionadas durante os testes.
- Revisão manual: As equipes de segurança não podem analisar de forma viável o código-fonte de centenas de pacotes de terceiros.
- Deteção especializada: São necessárias ferramentas SCA especificamente concebidas para identificar vulnerabilidades de dependência.
O requisito de conformidade
As violações de licenças acarretam riscos significativos:
- Responsabilidade legal: Usar dependências sem cumprir os termos da licença pode resultar em processos judiciais e danos.
- Obrigatoriedade de código aberto: Licenças copyleft fortes (GPL, AGPL) podem requerer que aplicações inteiras sejam de código aberto.
- Restrições de distribuição: Algumas licenças proíbem a distribuição comercial ou impõem limitações de uso.
- Requisitos de auditoria: As estruturas regulatórias exigem cada vez mais que as organizações mantenham uma lista de materiais de software precisa.
Complexidade da licença:
- Centenas de tipos de licença: O ecossistema de código aberto inclui centenas de licenças distintas com obrigações variadas.
- Problemas de compatibilidade: Diferentes licenças têm termos conflitantes que proíbem seu uso em conjunto.
- Licenciamento transitivo: As obrigações de licença de dependências transitivas devem ser rastreadas e satisfeitas.
- Alterações de licença: Os projetos às vezes mudam de licença entre versões, exigindo monitoramento contínuo.
Como funcionam as ferramentas SCA
As ferramentas SCA empregam várias técnicas para descobrir e analisar dependências:
Mecanismos de descoberta
Análise de arquivo de manifesto:
- Formatos específicos da língua: As ferramentas entendem os formatos de manifesto do pacote para cada linguagem (package.json para npm, requirements.txt para Python pom.xml para Maven).
- Resolução de dependências: Analise as especificações da versão de dependência, incluindo intervalos, restrições e regras de resolução.
- Varredura do espaço de trabalho: Analise recursivamente os diretórios de projeto para localizar todos os arquivos de manifesto em espaços de trabalho monorepos e multiprojeto.
- Reconhecimento de configuração: Considere as dependências específicas do ambiente (desenvolvimento, teste, produção) separadamente.
Análise do arquivo de bloqueio de dependência:
- Versões exatas: Os arquivos de bloqueio registram versões precisas de todas as dependências, incluindo dependências transitivas.
- Estado de instalação: Representar dependências instaladas reais em vez de requisitos abstratos.
- Resolução determinística: Os arquivos de bloqueio garantem versões de dependência consistentes entre ambientes.
- Gráficos de dependência completos: Inclua uma árvore de dependência transitiva completa com resoluções de versão.
Escaneamento binário e de artefatos:
- Artefatos compilados: Analise arquivos JAR, arquivos de roda, DLLs e executáveis para identificar dependências incorporadas.
- Camadas de imagem de contêiner: Analise camadas de imagem de contêiner para descobrir componentes de imagem base e dependências de aplicativos.
- Verificação do sistema de arquivos: Examine os sistemas de arquivos de aplicativos implantados para localizar dependências não declaradas em manifestos.
- Recolha de impressões digitais: Use hash criptográfico para identificar versões específicas do pacote, mesmo sem metadados.
Integração de compilação:
- Plugins de ferramentas de construção: Integre com sistemas de compilação (Maven, Gradle, webpack, pip) para capturar informações de dependência durante as compilações.
- Ganchos de resolução: Integre-se em processos de resolução de dependências para registrar as versões exatas instaladas.
- Geração de artefatos: Gere artefatos de lista de materiais de software (SBOM) durante as compilações para utilização posterior.
- Integração de pipeline: Execute como etapas automatizadas em pipelines de CI/CD para analisar cada compilação.
Capacidades de análise
Mapeamento de vulnerabilidade:
- Consulta à base de dados: Consulte o National Vulnerability Database (NVD), o GitHub Advisory Database e os bancos de dados de vulnerabilidade proprietários.
- Correspondência entre intervalos de versões: Determine se versões específicas de pacotes se enquadram em intervalos de versões vulneráveis.
- Validação do patch: Verifique se os patches aplicados realmente resolvem as vulnerabilidades relatadas.
- Priorização: Classifique as vulnerabilidades por gravidade, capacidade de exploração e impacto nos negócios.
Identificação da licença:
- Várias fontes: Extraia informações de licença de metadados de pacotes, arquivos de licença, cabeçalhos de origem e documentos Leiame.
- Normalização da licença: Mapeie vários nomes e identificadores de licença (SPDX, OSI) para tipos de licença padronizados.
- Licenciamento duplo: Manipule pacotes lançados sob várias licenças alternativas.
- Licenças personalizadas: Identifique licenças não padronizadas que exijam revisão legal.
Análise de acessibilidade:
- Construção do gráfico de chamadas: Crie gráficos de chamada mostrando qual código de dependência é realmente executado pelo seu aplicativo.
- Deteção de código morto: Identifique dependências agrupadas, mas nunca realmente usadas.
- Análise de caminho de exploração: Determine se os caminhos de código que apresentam vulnerabilidades são acessíveis a partir dos pontos de entrada da aplicação.
- Aperfeiçoamento dos riscos: Reduza o ruído concentrando-se em vulnerabilidades exploráveis no código realmente usado.
Monitorização contínua:
- Alertas em tempo real: Receba notificações imediatas quando novas vulnerabilidades que afetam suas dependências forem divulgadas.
- Verificação programada: Analise regularmente os aplicativos para detetar vulnerabilidades recém-descobertas em dependências inalteradas.
- Comparação da linha de base: Acompanhe as alterações na vulnerabilidade e no status de conformidade ao longo do tempo.
- Prevenção de regressão: Alerte quando novas dependências introduzirem vulnerabilidades ou violações de licença.
Padrões de integração SCA
A implementação eficaz do SCA envolve a integração em vários pontos do ciclo de vida do desenvolvimento:
Estação de trabalho do desenvolvedor
Integração IDE:
- Feedback em tempo real: Analise dependências à medida que os desenvolvedores as adicionam aos projetos.
- Advertências em linha: Exiba avisos de vulnerabilidade e licença diretamente no IDE.
- Sugestões de remediação: Sugira versões alternativas de pacotes ou pacotes de substituição.
- Aplicação da política: Impeça a adição de dependências que violem as políticas organizacionais.
Validação pré-confirmação:
- Ganchos Git: Execute verificações SCA antes de commits para evitar introduzir dependências vulneráveis.
- Varredura local: Analise as alterações localmente antes de enviar para repositórios remotos.
- Comentários rápidos: Forneça feedback imediato aos desenvolvedores durante o desenvolvimento ativo.
- Deteção precoce: Detete problemas antes que eles cheguem a ramificações compartilhadas e pipelines de CI/CD.
Controlo de origem
Validação de pull request:
- Verificações automatizadas: Execute a análise SCA em todas as solicitações pull para detetar alterações de dependência.
- Comentários da revisão: Publique as descobertas como comentários de solicitação pull para visibilidade do revisor.
- Bloqueio de mesclagem: Impeça a fusão de solicitações pull que introduzam vulnerabilidades críticas ou violações de licença.
- Controlo de alterações de dependência: Documente claramente quais alterações de dependência cada solicitação pull introduz.
Integração com o GitHub Dependabot:
- Atualizações automatizadas: Crie automaticamente solicitações pull quando as atualizações de segurança de dependência estiverem disponíveis.
- Alertas de vulnerabilidade: Receba alertas de segurança do GitHub para dependências vulneráveis.
- Gráfico de dependência: Visualize relações de dependência no recurso de gráfico de dependência do GitHub.
- Revise os fluxos de trabalho: Aproveite os processos de revisão e aprovação do GitHub para atualizações de dependência.
Pipelines de CI/CD
Verificação em tempo de construção:
- Etapas do pipeline: Adicione a verificação SCA como etapas de compilação automatizadas em pipelines de CI/CD.
- Barreiras de qualidade: Falhar compilações que não atendem aos requisitos de segurança e conformidade.
- Geração de SBOM: Crie artefatos de lista de materiais de software juntamente com os resultados de compilação.
- Trilhas de auditoria: Registe os resultados da varredura para fins de conformidade e investigações forenses.
Portões de implantação:
- Validação pré-implantação: Analise artefatos antes de implantar em ambientes de produção.
- Políticas específicas em matéria de ambiente: Aplique políticas mais rígidas para implantações de produção do que implantações de desenvolvimento.
- Gatilhos de reversão: Reverter automaticamente desdobramentos descobertos por conter vulnerabilidades críticas.
- Aprovações de implantação: Exigir aprovação manual para implantações com riscos conhecidos, mas aceitos.
Monitoramento de tempo de execução
Digitalização de produção:
- Análise de aplicativos implantados: Analise aplicativos realmente implantados para detetar dependências de tempo de execução.
- Varredura do registro de contêiner: Analise continuamente imagens de contêiner armazenadas em registros.
- Análise de função sem servidor: Analise funções sem servidor implantadas e suas dependências.
- Deteção de deriva: Identifique diferenças entre as dependências implantadas pretendidas e reais.
Monitoramento contínuo de vulnerabilidades:
- Vigilância contínua: Monitore aplicativos implantados em busca de vulnerabilidades recém-divulgadas que afetem as dependências atuais.
- Resposta a incidentes: Acione fluxos de trabalho de resposta a incidentes quando vulnerabilidades críticas forem descobertas na produção.
- Planejamento de patches: Gere planos de implantação de patches para resolver vulnerabilidades em aplicativos implantados.
- Conformidade com SLA: Acompanhe os prazos de correção para garantir a conformidade com os SLAs de segurança.
Práticas recomendadas de fluxo de trabalho SCA
A implementação bem-sucedida do SCA segue fluxos de trabalho comprovados:
Estabelecer linha de base
Inventário inicial:
- Descoberta abrangente: Execute as ferramentas SCA em todos os aplicativos para criar um inventário de dependência completo.
- Avaliação dos riscos: Compreenda a exposição atual a vulnerabilidades e problemas de conformidade de licenças.
- Priorização: Identifique quais aplicativos e vulnerabilidades exigem atenção imediata.
- Documentação de base: Documente o estado atual como linha de base para medir a melhoria.
Definir políticas
Políticas de segurança:
- Limites de gravidade da vulnerabilidade: Defina quais níveis de gravidade são aceitáveis (por exemplo, nenhum crítico e limitado a alto).
- Prazos de correção: Estabeleça SLAs para corrigir diferentes gravidades de vulnerabilidade (crítica dentro de 7 dias, alta dentro de 30 dias).
- Processos de exceção: Crie fluxos de trabalho para aceitar riscos quando a correção imediata não for viável.
- Acompanhamento da isenção: Manter trilha de auditoria de riscos aceites com justificações empresariais.
Políticas de conformidade:
- Listas de permissões de licença: Especifique quais licenças são sempre aceitáveis (MIT, Apache 2.0, BSD).
- Listas de licenças negadas: Impedir licenças específicas incompatíveis com o modelo de negócio (como o GPL em software proprietário).
- Fluxos de trabalho de aprovação: Exigir revisão legal para dependências com determinadas licenças (LGPL, MPL, licenças personalizadas).
- Requisitos de atribuição: Defina como as atribuições de licença devem ser fornecidas no software distribuído.
Automatizar a execução
Integração de pipeline:
- Varredura automatizada: Execute verificações SCA automaticamente em cada solicitação build e pull.
- Portões de qualidade: Configure portões de pipeline que bloqueiam builds ou implementações que violam políticas.
- Remediação automatizada: Use ferramentas como o GitHub Dependabot para criar automaticamente solicitações pull para atualizações de segurança.
- Apresentação de relatórios: Gere relatórios de conformidade para visibilidade de auditoria e gerenciamento.
Melhoria contínua
Acompanhamento de métricas:
- Tempo médio de correção (MTTR): Meça a rapidez com que as vulnerabilidades são corrigidas após a descoberta.
- Redução da vulnerabilidade: Acompanhe a diminuição das contagens de vulnerabilidades ao longo do tempo.
- Taxa de conformidade: Monitore a porcentagem de dependências que atendem às políticas de licença.
- Cobertura: Certifique-se de que as ferramentas SCA examinem todos os aplicativos e dependências.
Refinamento do processo:
- Gestão de falsos positivos: Ajuste ferramentas para reduzir falsos positivos por meio de configurações e exceções.
- Formação para programadores: Eduque os desenvolvedores sobre seleção e gerenciamento seguro de dependências.
- Evolução das políticas: Atualize as políticas com base em ameaças emergentes e requisitos de negócios.
- Avaliação da ferramenta: Avalie periodicamente novas ferramentas e recursos SCA.
A Análise de Composição de Software fornece os recursos automatizados essenciais para gerenciar riscos de segurança e conformidade em aplicativos modernos que dependem fortemente de componentes de código aberto. A próxima unidade explora como implementar o GitHub Dependabot, uma ferramenta SCA específica integrada ao GitHub.