Publicado em: 29 de janeiro de 2025
7 min de leitura
Descubra como o GUARD automatiza a detecção de ameaças cibernéticas usando o GitLab CI/CD e como isso garante mais segurança.

Este post é o segundo de uma série sobre o GitLab Universal Automated Response and Detection (GUARD).
Escrever e implantar detecções de ameaças de segurança na plataforma de gestão de eventos e informações de segurança (SIEM) de uma organização é um passo essencial de todo programa de cibersegurança bem-sucedido. Isto é, sair de uma engenharia de detecção manual e migrar para um processo totalmente automatizado, implementando Detecções como Código (DaC), garante consistência, qualidade, governança e a realização de testes automatizados nas detecções. No GitLab, incorporamos capacidades de DaC ao GUARD, o nosso framework totalmente automatizado de detecção e resposta.
Os times de Signals Engineering e SIRT do GitLab dividem a responsabilidade de criar, atualizar e desativar detecções de ameaças no nosso SIEM. Manter uma única fonte confiável para as detecções é fundamental para garantir consistência e atender aos padrões de qualidade. Por isso, nossos times optaram de forma consciente por abstrair o processo de criação de detecções do nosso SIEM, o que melhorou o rastreamento de issues, a consistência, o processo de rollback e as métricas. Além disso, realizar testes de detecção pré-commit fora do SIEM garantiu que as novas detecções não introduzissem alertas com excesso de falsos positivos, que exigiriam ajustes ou desativação enquanto o alerta fosse corrigido.
Para enfrentar esses desafios, desenvolvemos um fluxo de trabalho eficiente usando o CI/CD do GitLab, resultando em um processo de implantação de detecções no SIEM mais simples e seguro.
1. Detecções armazenadas em formato JSON em um projeto GitLab
O GitLab usa o formato JSON para as nossas detecções de ameaças. O template inclui informações essenciais, como a lógica de consulta ao SIEM, o título e a descrição da detecção, além do link para a página do runbook, a tática e a técnica MITRE relacionadas à detecção e outros detalhes necessários.
2. Iniciando merge requests
Quando um membro do time do GitLab pretende criar uma nova detecção de ameaça, atualizar uma detecção já existente ou excluir uma detecção atual, o processo começa com o envio de uma merge request - MR no projeto de DaC, contendo o template JSON da detecção. A criação da MR dispara automaticamente um pipeline de CI/CD.
3. Validação automatizada com jobs de CI/CD
Cada MR passa por uma série de verificações automatizadas por meio do GitLab CI/CD:
4. Revisão por pares e aprovação
Quando o job de uma MR de detecção é concluído com sucesso, uma revisão por pares é exigida para confirmar que a MR atende aos padrões de qualidade e conteúdo exigidos antes que ela possa ser mesclada. As regras de aprovação de merge request são usadas para disparar o processo de revisão por pares.
5. Merge e implantação final
Depois que a MR é aprovada, ela é mesclada na branch principal. Como parte do pipeline de CI/CD, um job automatizado executa um comando na API do SIEM para realizar duas tarefas:
Observação: as credenciais necessárias para essas ações ficam armazenadas com segurança em variáveis de CI/CD, o que garante que o processo permaneça confidencial e seguro.
Veja abaixo um arquivo de configuração gitlab-ci.yml de exemplo para um pipeline de DaC no GitLab CI/CD:
#
---------------------------------------------------------------------------
#
# GitLab CI/CD Pipeline for SIEM Detection Management
#
---------------------------------------------------------------------------
#
image: python:3.12
#
---------------------------------------------------------------------------
#
# Global Configuration
#
---------------------------------------------------------------------------
#
before_script:
- apt-get update && apt-get install -y jq
- pip install --upgrade pip
- pip install -r requirements.txt
#
---------------------------------------------------------------------------
#
stages:
- fetch
- test
- process
- upload
#
---------------------------------------------------------------------------
#
# Fetch Stage
#
---------------------------------------------------------------------------
#
fetch_changed_files:
stage: fetch
Script:
- echo "Fetching changed files..."
- git branch
- git fetch origin $CI_DEFAULT_BRANCH:$CI_DEFAULT_BRANCH --depth 2000
- |
if [[ "$CI_COMMIT_BRANCH" == "$CI_DEFAULT_BRANCH" ]]; then
git diff --name-status HEAD^1...HEAD > changed-files-temp.txt
else
git fetch origin $CI_COMMIT_BRANCH:$CI_COMMIT_BRANCH --depth 2000
git diff --name-status ${CI_DEFAULT_BRANCH}...${CI_COMMIT_SHA} > changed-files-temp.txt
fi
- grep -E '\.json$' changed-files-temp.txt > changed-files.txt || true
- flake8 .
- pytest
artifacts:
paths:
- changed-files.txt
expose_as: 'changed_files'
#
---------------------------------------------------------------------------
#
# Test Stage
#
---------------------------------------------------------------------------
#
flake8:
stage: test
script:
- echo "Running Flake8 for linting..."
- flake8 .
pytest:
stage: test
script:
- echo "Running Pytest for unit tests..."
- pytest
artifacts:
when: always
reports:
junit: report.xml
#
---------------------------------------------------------------------------
#
# Process Stage
#
---------------------------------------------------------------------------
#
process_files:
stage: process
script:
- echo "Processing changed files..."
- git clone --depth 2000 --branch $CI_DEFAULT_BRANCH $CI_REPOSITORY_URL
- mkdir -p modified_rules delete_file new_file
- python3 move-files.py -x changed-files.txt
- python3 check-alerts-format.py
artifacts:
paths:
- modified_rules
- delete_file
- new_file
#
---------------------------------------------------------------------------
#
# Upload Stage
#
---------------------------------------------------------------------------
#
update_rules:
stage: upload
script:
- echo "Uploading updated rules and lookup tables..."
- git fetch origin $CI_DEFAULT_BRANCH:$CI_DEFAULT_BRANCH --depth 2000
- git clone --depth 2000 --branch $CI_DEFAULT_BRANCH $CI_REPOSITORY_URL
- python3 update-rules.py
- python3 update-exceptions.py
- python3 create_ttps_layers.py
rules:
- if: $CI_COMMIT_BRANCH == "main" && $CI_PIPELINE_SOURCE != "schedule"
changes:
- detections/**/*
- exceptions/**/*
O diagrama abaixo ilustra o fluxo de trabalho do processo de CI/CD que foi descrito acima.
graph TD;
fetch[Etapa de busca: identificar arquivos alterados] --> test[Etapa de teste: executar linting e testes];
test --> process[Etapa de processamento: categorizar arquivos];
process --> upload[Etapa de upload: atualizar regras e tabelas de referência];
fetch --> fetch_details[Detalhes: filtrar arquivos JSON, gerar o arquivo 'changed-files.txt'];
test --> test_details[Detalhes: executar Flake8 para linting, Pytest para testes];
process --> process_details[Detalhes: categorizar em 'modified', 'new', 'deleted', preparar para upload];
upload --> upload_details[Detalhes: atualizar o repositório, atualizar detecções no SIEM e na tabela de referência do SIEM];
A automatização do ciclo de vida de detecções de ameaças, por meio de um fluxo de trabalho de DaC baseado em CI/CD, traz uma série de benefícios ao nosso processo de implantação:
Usar o GitLab CI/CD ao mesmo tempo em que existe uma política de "privilégio mínimo" tornou o gerenciamento de detecções e alertas do nosso SIEM mais simples e seguro. A automação melhorou a eficiência e reduziu riscos, servindo como um exemplo útil para quem também quer aprimorar sua segurança e conformidade. Faça este tutorial usando um teste gratuito do GitLab Ultimate.
Comece sua avaliação gratuita de
30 dias do GitLab
Não é necessário cartão de crédito.
Gostou deste artigo, ficou com alguma dúvida ou quer deixar um feedback? Compartilhe suas ideias criando um novo tópico no fórum da comunidade GitLab.
Compartilhe seu feedbackComece a desenvolver mais rápido hoje
Veja o que sua equipe pode fazer com a plataforma de orquestração inteligente para DevSecOps.