Construindo Pipeline DevSecOps com GitLab CI
Visão Geral
O GitLab fornece uma plataforma DevSecOps integrada que incorpora testes de segurança diretamente no pipeline CI/CD. Ao aproveitar os scanners de segurança embutidos do GitLab — SAST, DAST, varredura de contêineres, varredura de dependências, detecção de segredos e conformidade de licenças — as equipes podem deslocar a segurança para a esquerda, capturando vulnerabilidades durante o desenvolvimento em vez de após a implantação. O GitLab Duo AI auxilia na detecção de falsos positivos para vulnerabilidades SAST, ajudando as equipes de segurança a focar em problemas genuínos.
Quando Usar
- Ao implantar ou configurar recursos de construção de pipeline DevSecOps com GitLab CI em seu ambiente
- Ao estabelecer controles de segurança alinhados aos requisitos de conformidade
- Ao construir ou melhorar a arquitetura de segurança para este domínio
- Ao realizar avaliações de segurança que exigem esta implementação
Pré-requisitos
- Licença GitLab Ultimate (necessária para a suíte completa de scanners de segurança)
- GitLab Runner configurado (compartilhado ou auto-hospedado)
- Familiaridade com configuração de pipeline
.gitlab-ci.yml - Docker-in-Docker (DinD) ou Kaniko para builds de contêineres
- Aplicação implantada em ambiente de staging para varredura DAST
Etapas Principais de Varredura de Segurança
Teste de Segurança Estático de Aplicações (SAST)
O SAST analisa o código-fonte em busca de vulnerabilidades antes da compilação. O GitLab suporta mais de 14 linguagens usando analisadores como Semgrep, SpotBugs, Gosec, Bandit e NodeJsScan. A inclusão mais simples usa os modelos gerenciados do GitLab.
Teste de Segurança Dinâmico de Aplicações (DAST)
O DAST testa aplicações em execução simulando cargas de ataque contra endpoints HTTP. Ele detecta XSS, SQLi, CSRF e outras vulnerabilidades de tempo de execução que a análise estática não consegue encontrar. O DAST requer uma URL de destino implantada e acessível.
Varredura de Contêineres
Usa o Trivy para escanear imagens Docker em busca de CVEs conhecidas em pacotes do sistema operacional e dependências de aplicações. É executada após a etapa de build do Docker para barrar imagens antes que cheguem a um registro.
Varredura de Dependências
Inspeciona manifestos de dependências (package.json, requirements.txt, pom.xml, Gemfile.lock) em busca de versões vulneráveis conhecidas. Opera no nível do código-fonte, complementando a varredura de contêineres.
Detecção de Segredos
Escaneia commits em busca de credenciais, chaves de API, tokens e chaves privadas acidentalmente commitados, usando correspondência de padrões e análise de entropia. É executada em todo commit para evitar que segredos cheguem ao repositório.
Implementação
Configuração Completa do Pipeline
# .gitlab-ci.yml
stages:
- build
- test
- security
- deploy-staging
- dast
- deploy-production
variables:
DOCKER_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
SECURE_LOG_LEVEL: "info"
# Incluir modelos de segurança gerenciados pelo GitLab
include:
- template: Security/SAST.gitlab-ci.yml
- template: Security/Secret-Detection.gitlab-ci.yml
- template: Security/Dependency-Scanning.gitlab-ci.yml
- template: Security/Container-Scanning.gitlab-ci.yml
- template: DAST.gitlab-ci.yml
- template: Security/License-Scanning.gitlab-ci.yml
build:
stage: build
image: docker:24.0
services:
- docker:24.0-dind
variables:
DOCKER_TLS_CERTDIR: "/certs"
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $DOCKER_IMAGE .
- docker push $DOCKER_IMAGE
rules:
- if: $CI_COMMIT_BRANCH
unit-tests:
stage: test
image: $DOCKER_IMAGE
script:
- npm ci
- npm run test:coverage
coverage: '/Lines\s*:\s*(\d+\.?\d*)%/'
artifacts:
reports:
junit: junit-report.xml
coverage_report:
coverage_format: cobertura
path: coverage/cobertura-coverage.xml
# Sobrescrever SAST para executar na etapa de segurança
sast:
stage: security
variables:
SAST_EXCLUDED_PATHS: "spec,test,tests,tmp,node_modules"
SEARCH_MAX_DEPTH: 10
# Sobrescrever varredura de contêineres
container_scanning:
stage: security
variables:
CS_IMAGE: $DOCKER_IMAGE
CS_SEVERITY_THRESHOLD: "HIGH"
# Sobrescrever varredura de dependências
dependency_scanning:
stage: security
# Sobrescrever detecção de segredos
secret_detection:
stage: security
# Varredura de conformidade de licenças
license_scanning:
stage: security
deploy-staging:
stage: deploy-staging
image: bitnami/kubectl:latest
script:
- kubectl set image deployment/app app=$DOCKER_IMAGE -n staging
- kubectl rollout status deployment/app -n staging --timeout=300s
environment:
name: staging
url: https://staging.example.com
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
# DAST executa contra o staging implantado
dast:
stage: dast
variables:
DAST_WEBSITE: https://staging.example.com
DAST_FULL_SCAN_ENABLED: "true"
DAST_BROWSER_SCAN: "true"
needs:
- deploy-staging
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
deploy-production:
stage: deploy-production
image: bitnami/kubectl:latest
script:
- kubectl set image deployment/app app=$DOCKER_IMAGE -n production
- kubectl rollout status deployment/app -n production --timeout=300s
environment:
name: production
url: https://app.example.com
when: manual
rules:
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
Políticas de Aprovação de Segurança
Configure políticas de execução de varredura para impor verificações de segurança obrigatórias:
- Navegue até Segurança e Conformidade > Políticas
- Crie uma "Política de Execução de Varredura" exigindo SAST e detecção de segredos em todos os branches
- Crie uma "Política de Aprovação de Merge Request" exigindo aprovação da equipe de segurança quando vulnerabilidades críticas forem detectadas
Configuração Personalizada de Regras SAST
Crie .gitlab/sast-ruleset.toml para personalizar o comportamento do analisador:
[semgrep]
[[semgrep.ruleset]]
dirs = ["src"]
[[semgrep.passthrough]]
type = "url"
target = "/sgrep-rules/custom-rules.yml"
value = "https://semgrep.dev/p/owasp-top-ten"
[[semgrep.passthrough]]
type = "url"
target = "/sgrep-rules/java-rules.yml"
value = "https://semgrep.dev/p/java"
Painel de Segurança e Gerenciamento de Vulnerabilidades
Relatório de Vulnerabilidades
O GitLab consolida todas as descobertas dos scanners em um único Relatório de Vulnerabilidades, acessível em Segurança e Conformidade > Relatório de Vulnerabilidades. Cada vulnerabilidade inclui:
- Classificação de severidade (Crítico, Alto, Médio, Baixo, Informativo)
- Fonte do scanner (SAST, DAST, Contêiner, Dependência, Segredo)
- Localização no código-fonte ou camada de imagem
- Orientações de remediação e correções sugeridas
- Acompanhamento de status (Detectado, Confirmado, Descartado, Resolvido)
Widget de Segurança de Merge Request
Todo merge request exibe um widget de varredura de segurança mostrando:
- Novas vulnerabilidades introduzidas pelo MR
- Vulnerabilidades corrigidas resolvidas pelo MR
- Comparação com a linha de base do branch de destino
Otimização do Pipeline
- Execução paralela: Os scanners de segurança são executados simultaneamente na etapa de segurança
- Cache: Use cache de CI para downloads de dependências, acelerando a varredura
- Varredura incremental: O SAST pode escanear apenas arquivos alterados usando
SAST_INCREMENTAL: "true" - Condições de falha: Defina
allow_failure: falseem scanners críticos para impor portões de qualidade
Monitoramento e Métricas
| Métrica | Descrição | Alvo |
|---|---|---|
| Cobertura de segurança do pipeline | Percentual de projetos com todos os scanners habilitados | > 95% |
| Tempo médio de resolução (MTTR) de vulnerabilidade crítica | Tempo entre detecção e resolução de achados críticos | < 48 horas |
| Taxa de falsos positivos | Percentual de achados descartados como falso positivo | < 15% |
| Taxa de bloqueio de detecção de segredos | Percentual de commits com segredos bloqueados por regras de push | > 99% |