blog.lesis.lat

Um simples e prático Security Gate para o GitHub Security Alerts

September 02, 2024 | 14 Minute Read

Garantir a segurança do código antes de chegar à produção é crucial. No entanto, isso exige a implementação de soluções que realmente se integrem ao fluxo contínuo de integração e desenvolvimento. Com a crescente complexidade das aplicações e a necessidade de respostas rápidas, a abordagem de Shift Left se torna indispensável, movendo a segurança para as fases iniciais do ciclo de desenvolvimento. Neste artigo, apresentamos e exploramos o conceito de Security Gates, inspirado em Quality Gates e alinhado com a abordagem Shift Left, e apresentamos também o Security Gate, uma solução prática que utiliza GitHub Actions para monitorar o repositório e bloquear a pipeline com base em alertas de segurança. Exploramos como essa ferramenta pode ser configurada para funcionar como um gate de segurança eficaz, visando a segurança contínua do repositório/projeto.

Essa publicação está disponível também em: Inglês


Contextualização

No cenário contemporâneo de desenvolvimento de software, a segurança se consolidou como um componente fundamental, permeando todas as fases do ciclo de vida de desenvolvimento. Com a crescente adoção de metodologias ágeis e práticas de DevOps, o conceito de Shift Left têm ganhado destaque, promovendo a antecipação das atividades de teste e validação de segurança para as etapas iniciais do processo de desenvolvimento. Essa abordagem busca mitigar vulnerabilidades desde os primeiros momentos, o que não apenas reduz os custos de correção, mas também minimiza os riscos associados a problemas de segurança que, se descobertos tardiamente, poderiam comprometer gravemente a integridade do sistema.

O Shift Left, ao mover as verificações de segurança para o início do ciclo de desenvolvimento, transforma a segurança em uma parte intrínseca do fluxo de trabalho, em vez de tratá-la como uma fase posterior ou separada. Isso permite que as equipes de desenvolvimento identifiquem e resolvam potenciais falhas antes que elas possam se propagar, resultando em um software mais seguro e confiável. Adicionalmente, essa prática alinha-se com a necessidade de manter a agilidade no desenvolvimento, sem comprometer a proteção contra ameaças.

Dentro desse contexto, os Quality Gates emergem como barreiras essenciais na pipeline de desenvolvimento, assegurando que apenas códigos que atendam aos critérios de qualidade avancem para as próximas etapas. Inspirado por esse conceito, o Security Gate surge como uma evolução natural, focando especificamente na segurança. Atuando como pontos de verificação dentro da pipeline de CI/CD, os Security Gates avaliam o código quanto à conformidade com políticas de segurança estabelecidas, interrompendo seu progresso caso os critérios não sejam atendidos e prevenindo que vulnerabilidades sejam introduzidas no ambiente de produção, garantindo que o software final atenda aos padrões de segurança.

Assim, o Security Gate materializa esse conceito em uma solução prática e acessível para o GitHub. Com o objetivo de integrar verificações automáticas de segurança diretamente na pipeline de CI/CD, o Security Gate monitora o repositório e bloqueia o avanço da pipeline com base em alertas de segurança, como os gerados pelo DependaBot, Code Scanning e Secret Scanning. Dessa forma, o projeto visa assegurar que apenas códigos que cumpram os critérios de segurança possam avançar na pipeline, alinhando-se com a filosofia do Shift Left e reforçando a proteção contínua e proativa do repositório.


Objetivo

O Security Gate visa aprimorar a segurança no ciclo de desenvolvimento de software ao integrar um mecanismo de controle diretamente na pipeline de CI/CD do GitHub. Este projeto é fundamentado na ideia de Shift Left e no conceito de Quality Gates, adaptando-os para um contexto de segurança. A proposta é garantir que apenas código que atenda aos critérios de segurança avance nas fases de desenvolvimento e produção.

A ferramenta permite a integração com o GitHub Actions e utiliza os alertas de segurança gerados pelo DependaBot, Code Scanning e Secret Scanning como base para a tomada de decisões. O Security Gate oferece a capacidade de definir políticas de vulnerabilidade baseadas em impacto — como o número de vulnerabilidades por severidade de ameaça — e atua de forma proativa, bloqueando a pipeline de CI/CD se essas políticas não forem cumpridas.

Para alcançar esse objetivo, o Security Gate atende aos seguintes requisitos:

  • Integração com GitHub Actions: para monitoramento contínuo do repositório, utilizando alertas de segurança para assegurar conformidade com as políticas de segurança definidas;
  • Suporte a alertas de segurança: provenientes do DependaBot, Code Scanning e Secret Scanning, permitindo uma análise abrangente das vulnerabilidades e ameaças no código;
  • Política de vulnerabilidade baseada em Impacto: como o número de vulnerabilidades por severidade, especificadas através das flags de limite de severidade, para bloquear a pipeline de CI/CD quando essas políticas não são atendidas;
  • Flexibilidade e controle: ao permitir a configuração de quais tipos de alertas devem ser verificados, com as flags --dependency-alerts, --secret-alerts e --code-alerts, permitindo que os usuários escolham quais alertas devem ser monitorados conforme suas necessidades.

Introdução ao Security Gate

O Security Gate foi desenvolvido para integrar-se com as pipelines de desenvolvimento de software, oferecendo uma solução prática para a gestão de alertas de segurança do GitHub. Criado em Perl, o sistema utiliza os recursos de alerta de segurança do GitHub e se integra com GitHub Actions, proporcionando um método para aplicar políticas de segurança e assegurar que o código atenda a critérios específicos antes de ser promovido para produção.

Visão Geral

O Security Gate busca atender à necessidade de uma abordagem organizada para a segurança dentro das pipelines de CI/CD. O objetivo é oferecer uma maneira de monitorar e aplicar políticas de segurança com base nos alertas fornecidos pelo GitHub. A ferramenta permite configuração detalhada e é projetada para alinhar-se aos requisitos de segurança de diferentes projetos.

Principais Recursos

O Security Gate inclui os seguintes recursos principais:

  • Scanning de Dependências

    Este módulo utiliza os alertas do DependaBot fornecidos pelo GitHub para monitorar vulnerabilidades nas dependências do projeto. O sistema consulta a API do GitHub para alertas de dependência abertos, contabiliza as vulnerabilidades classificadas em diferentes níveis de severidade (crítico, alto, médio e baixo) e compara essas contagens com os limites configurados. Caso os limites sejam excedidos, a pipeline de CI/CD pode ser bloqueada, garantindo que vulnerabilidades em bibliotecas de terceiros não comprometam o projeto.

  • Scanning de Secrets

    O recurso de scanning de secrets integra-se com os alertas de Secret Scanning do GitHub para identificar informações sensíveis que possam ter sido expostas no repositório. A ferramenta recupera e processa alertas de secrets abertos, fornecendo detalhes sobre o número total de alertas e seus locais específicos no código. A configuração de limites para esses alertas ajuda a evitar a implementação de código com secrets expostos, contribuindo para a segurança geral do projeto. Todos os alertas baseado em detecções de secrets são considerados de severidade alta.

  • Scanning de Código

    O módulo de scanning de código utiliza os alertas de Code Scanning do GitHub para identificar e gerenciar vulnerabilidades na base de código. O sistema agrega os alertas de scanning de código abertos, classifica-os por severidade e verifica se o número de alertas excede os limites estabelecidos. Essa abordagem permite que as vulnerabilidades no código sejam tratadas antes da implementação do código em uma branch produtiva (por exemplo, na main), reduzindo potenciais riscos de segurança.

Através da integração com o GitHub Actions e da gestão de diversos tipos de alertas de segurança, o Security Gate fornece um mecanismo para manter a segurança dos projetos de software durante seu ciclo de vida de desenvolvimento.

Integração com o GitHub

O Security Gate foi projetado para se integrar ao GitHub, permitindo que verificações de segurança sejam realizadas diretamente nas pipelines de CI/CD. Essa integração possibilita que alertas de segurança sejam monitorados e gerenciados automaticamente durante o desenvolvimento do software.

Para utilizar o Security Gate nos workflows do GitHub, é necessário configurar uma GitHub Action que execute a ferramenta durante o processo de CI/CD. Isso inclui a adição de um arquivo de workflow em YAML ao repositório e a criação de um token GitHub com as permissões adequadas.

O funcionamento do Security Gate requer a configuração de um token do GitHub com permissões específicas (https://github.com/settings/tokens?type=beta). Essas permissões são necessárias para acessar e gerenciar os diferentes tipos de alertas de segurança disponibilizados pelo GitHub.

Permissões Granulares do Token

O Security Gate exige as seguintes permissões para operar:

  1. Alertas do DependaBot:

    • Permissão Requerida: security_events:read
    • Justificativa: A permissão security_events:read é necessária para que o módulo SecurityGate::Engine::Dependencies possa acessar os alertas do DependaBot, monitorando vulnerabilidades nas dependências do projeto.
  2. Alertas de Verificação de secrets:

    • Permissão Requerida: secrets:read
    • Justificativa: O módulo SecurityGate::Engine::Secrets necessita da permissão secrets:read para recuperar alertas de verificação de secrets, permitindo a identificação de informações sensíveis que possam estar expostas no repositório.
  3. Alertas de Análise de Código:

    • Permissão Requerida: security_events:read
    • Justificativa: A permissão security_events:read é necessária para que o módulo SecurityGate::Engine::Code possa acessar os alertas de análise de código e identificar potenciais vulnerabilidades na base de código.

Resumo das Permissões Necessárias:

  • security_events:read: Necessária para a leitura de alertas do Dependabot e de análise de código.
  • secrets:read: Necessária para a leitura de alertas de verificação de secrets.

Considerações Adicionais:

  • O token deve ter, no mínimo, acesso de leitura ao repositório.
  • Para repositórios privados, o token deve ter acesso ao repositório para que os alertas possam ser recuperados.

Ao configurar o token no GitHub, é importante garantir que essas permissões estejam habilitadas para permitir o funcionamento correto do Security Gate, seguindo o princípio de menor privilégio.

Adição do arquivo YAML ao Repositório

Após a configuração do token, o próximo passo é a inclusão de um arquivo YAML no repositório. Esse arquivo define as etapas necessárias para a execução do Security Gate durante o processo de CI/CD. O arquivo security-gate.yaml deve ser criado no diretório .github/workflows/ com o seguinte conteúdo:

name: Security Gate - LESIS

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    env:
      MAX_CRITICAL: 1
      MAX_HIGH: 2
      MAX_MEDIUM: 3
      MAX_LOW: 4
      GITHUB_TOKEN: $
    steps:
    - name: Checkout repository
      uses: actions/checkout@v4

    - name: Pull Docker image from GitHub Container Registry
      run: docker pull ghcr.io/instriq/security-gate/security-gate:latest

    - name: Verify security alerts from dependabot
      run: |
        docker run ghcr.io/instriq/security-gate/security-gate:latest \
        -t $GITHUB_TOKEN \
        -r $ \
        --critical $MAX_CRITICAL \
        --high $MAX_HIGH \
        --medium $MAX_MEDIUM \
        --low $MAX_LOW \
        --dependency-alerts \
        --code-alerts \
        --secret-alerts 

Nesse exemplo, o workflow executa o Security Gate a cada push ou pull request. O workflow realiza o checkout do código, configura as variáveis de ambiente com os limites definidos para cada tipo de alerta e, em seguida, executa a ferramenta Security Gate.

A integração do Security Gate ao workflow no GitHub Actions permite a aplicação de políticas de segurança, assegurando que apenas o código que atenda aos critérios estabelecidos possa avançar na pipeline de CI/CD.


Demo

Esta demonstração ilustra a funcionalidade do Security Gate dentro de uma pipeline CI/CD, utilizando um fork de um projeto Python vulnerável, Vulpy. A pipeline integra o Security Gate para identificar alertas de segurança relacionados a vulnerabilidades no código, dependências desatualizadas e vulneráveis, além de secrets expostas.

Nesta demonstração, utiliza-se a mesma configuração de workflow descrita anteriormente.

Para simular um cenário de secrets expostas, foram intencionalmente adicionadas as seguintes secrets falsas no arquivo vulpy.py:

GOOGLE_API_KEY = "AIzaSyDCvp5MTJLUdtBYEKYWXJrlLju3ysphChw"

STRIPE_API_KEY = "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"

SLACK_WEBHOOK = "https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX"

Além disso, versões antigas e vulneráveis de dependências foram definidas no arquivo requirements.txt, para ilustrar como o Security Gate Gate lida com um cenário de dependências desatualizadas e vulneráveis:

cryptography==3.3.1
Flask==0.12.3
PyJWT==1.5.0

Quando a pipeline é acionada, seja por um push ou um pull request, o Security Gate realiza uma varredura no projeto em busca de possíveis problemas de segurança relacionados a vulnerabilidades no código, dependências e secrets expostas. A saída da execução deste workflow sumariza o seguinte:

Como o número de alertas de alta severidade excede aos limites predefinidos, a pipeline foi automaticamente bloqueada, impedindo a implementação de código potencialmente inseguro.

Este exemplo ilustra como o Security Gate integra alertas de segurança diretamente no processo de desenvolvimento por meio do GitHub Actions. Ao analisar vulnerabilidades no código, dependências e secrets expostas, a ferramenta contribui para o monitoramento de riscos de segurança na pipeline CI/CD, assegurando que apenas código que atenda aos critérios de segurança predefinidos avance para a etapa de implementação.


O Futuro do Security Gate

Atualmente, o Security Gate suporta a verificação de alertas de segurança relacionados a dependências, secrets e código, assegurando que projetos atendam aos critérios de segurança estabelecidos antes da implementação. Contudo, existem algumas áreas potenciais para aprimoramento que podem ser exploradas em versões futuras para expandir suas funcionalidades e melhorar a experiência do usuário.

Uma das áreas a ser considerada é a ampliação do suporte a diferentes plataformas de gestão de repositórios como por exemplo Bitbucket e Gitlab.

Além disso, há a possibilidade de expandir a integração do Security Gate para incluir alertas provenientes de outras ferramentas de segurança. Isso permitiria uma análise mais abrangente, incorporando dados de segurança de diversas fontes e oferecendo uma visão mais completa do perfil de segurança do projeto.

Com essas futuras melhorias, o Security Gate poderá ampliar sua cobertura de segurança e melhorar a integração com os processos de desenvolvimento de software, contribuindo para a manutenção das práticas de segurança ao longo do ciclo de vida do software.


Conclusão

A implementação do Security Gate tem o objetivo de melhorar a segurança das pipelines de CI/CD, integrando alertas de segurança diretamente no processo de desenvolvimento através do GitHub Actions. A ferramenta foi projetada para monitorar e gerenciar o risco de alertas de segurança relacionados a dependências, secrets e código, bloqueando a pipeline quando os critérios de segurança definidos não são atendidos.

Até o momento, o Security Gate demonstrou a capacidade de integrar verificações de segurança de maneira eficaz, alinhando-se com a filosofia do Shift Left ao antecipar a detecção de vulnerabilidades. A ferramenta oferece uma solução prática e acessível para garantir que apenas código que cumpre com os critérios de segurança avance na pipeline de CI/CD.

Para futuras versões, há planos para expandir as funcionalidades do Security Gate, incluindo a adição de suporte a novas plataformas de gerenciamento de repositórios como Gitlab e Bitbucket.


Autor

Giovanni Sagioro: estudante de Ciência da Computação, buscador da sabedoria Perl e pesquisador de segurança. Focado em segurança de aplicativos, descoberta de vulnerabilidades e desenvolvimento de exploits. Como Larry Wall diz — ‘Coisas fáceis devem ser fáceis, e coisas difíceis devem ser possíveis’ — então estou tentando tornar as coisas difíceis possíveis.


Referências