Jak automatizovat detekci secrets

V tomto tutoriálu si rozšíříme znalosti o odhalování secrets pomocí GitLab hooks a Gitlab CI/CD pipeline.

29. 10. 2024 Matěj Smyčka DevOps

Bez popisku

V předchozím článku jsme se zabývali tím, jak začít s detekcí secrets, a představili jsme několik nástrojů, které lze pro jejich detekci použít. Pokud jste si ještě nepřečetli prvního průvodce, doporučujeme vám, abyste tak učinili.

Tentokrát si rozšíříme znalosti o detekci secrets pomocí pre-commit hooks a CI/CD pipeline. Ukázky kódu se zaměřují spíše na GitLab, ale v poslední části se budeme věnovat také GitHubu.

Detekce před commitnutím změn

Pre-commit hooks jsou skripty, které se spouštějí před každým zápisem (commit) a zajišťují splnění daných podmínek před vlastním zápisem (commit) do vzdáleného repozitáře. Git má pro různé typy "háčků" (hooks) zabudovanou podporu.

V následujícím textu používáme nástroj pre-commit, který je určen pro správu a údržbu pre-commit hooks. Nainstalovat jej lze pomocí příkazu pip install pre-commit.

Každý pre-commit hook je pak definován v souboru .pre-commit-config.yaml, podobně, jako je definována samotná pipeline. Pre-commit hooks jsou spouštěny lokálně. Tak je možné získat výsledek ještě před samotným zápisem do vzdáleného repozitáře. 

Konfigurace

pip install pre-commit
# Ensure that you have pip install path `~/.local/bin` in your `$PATH`.
pre-commit install

Přidání nástrojů

Nejprve přidáme nástroje Gitleaks a Black pro formátování Python kódu.

Vytvořte soubor .pre-commit-config.yaml s následujícím obsahem:

---
repos:
  - repo: https://github.com/ambv/black
    rev: 23.11.0
    hooks:
      - id: black
        language_version: python3.11

  - repo: https://github.com/gitleaks/gitleaks
    rev: v8.18.0
    hooks:
      - id: gitleaks

Příklad

Vytvořili jsme další soubor, který obsahuje secret:

print("a")
secret = '8dyfuiRyq=vVc3RRr_edRk-fK__JItpZ'  
for i in range(10): print("x")

Při commitnutí těchto změn lze vidět, že oba nástroje fungují. Black zformátoval soubor main.py a Gitleaks našel zadaný kód. Případně lze spustit i lokální pipeline bez vytvoření revize, příkazem pre-commit run --all-files.

CI/CD pipeline

CI/CD pipeline je řada kroků, které zefektivňují proces integrace a publikování změn do software. Automatizované pipeline mohou pomoci předcházet chybám vyplývajícím z manuálních procesů, umožňují rychlé iterace produktu a poskytují konzistentní zpětnou vazbu během vývoje. Každý krok pipeline CI/CD je podmnožinou úloh seskupených do etap pipeline.
Zdroj: https://about.gitlab.com/topics/ci-cd/cicd-pipeline/

Použijeme nástroje z našeho prvního průvodce, ale začleníme je do pipeline tak, abychom mohli vidět výsledky skenování před nebo po odeslání revize do našeho úložiště.

Detekce v CI/CD pipeline

The standard pipeline offers an even easier setup. With this pipeline, every commit you push to the remote repository triggers an automatic run. In the event of a pipeline failure, you will receive an alert email.

You can see that the code was not properly formatted and the secret was found.

CI/CD pipeline nabízí ještě jednodušší nastavení, kdy každý commit do vzdáleného úložiště spustí kontrolu. V případě selhání pipeline pak uživatel obdrží upozorňující e-mail. V něm lze vidět, že kód nebyl správně naformátován a že byl nalezen secret.

Nastavení

  • Vytvořte soubor .gitlab-ci.yml.
  • Přidejte do něj následující obsah:
---
stages:
  - test

black:
  stage: test
  image: python
  script:
    - pip install black
    - black --check .

gitleaks:
  stage: test
  image:
    name: zricethezav/gitleaks:latest
    entrypoint: [""]
  script: >
    gitleaks detect
    -v 
    --log-opts=$CI_COMMIT_SHA

Nyní, po commitu souboru main.py, lze vidět, že pipeline selhává ze stejných důvodů jako pre-commit úloha. Výsledky skenování naleznete ve složce build > pipelines.

Předchystané CI/CD šablony v Gitlabu

Pipeline může také vypadat následovně:

---
include:
  - template: Security/Secret-Detection.gitlab-ci.yml

To je příklad předchystaných šablon v GitLabu. Výsledky skenování jsou pak dostupné v aplikaci agedně "Security Dashboard". Konfigurace této pipeline se nachází na https://gitlab.com/gitlab-org/security-products/analyzers/secrets/-/blob/master/gitleaks.toml. Možnosti přizpůsobení jsou však omezené.

Tato pipeline používá Gitleaks, nicméně výchozí pravidla jsou menší než pro výchozí konfiguraci nástroje.

Celkově však tato šablona poskytuje hodně muziky za málo peněz.

Proč nepoužívat výchozí šablony GitLabu?

Výchozí šablony GitLabu jsou skvělé, ale jejich konfigurace je omezená. Nad nástroji spuštěnými v pipeline máte jen malou kontrolu a jejich integrace s jinými nástroji může být složitá. Očekává se, že budete používat kombinaci výchozích šablon a vlastních pipeline.

Příklad vlastní šablony

Níže je uveden příklad, jak lze integrovat více nástrojů do jedné pipeline. To se skládá z:

---
include:
  - template: Security/SAST.gitlab-ci.yml
  - template: Security/SAST-IaC.gitlab-ci.yml
  - template: Security/Dependency-Scanning.gitlab-ci.yml
  - template: Security/Secret-Detection.gitlab-ci.yml

stages:
  - test

gitleaks:
  stage: test
  allow_failure: true

  image:
    name: zricethezav/gitleaks:latest
    entrypoint: [""]
  script: >
    gitleaks detect
    -v 
    --log-opts=$CI_CI_COMMIT_SHA

trufflehog:
  stage: test
  allow_failure: true

  image:
    name: trufflesecurity/trufflehog:latest
    entrypoint: [""]
  script: trufflehog filesystem

ansible-lint:
  stage: test

  image: python:slim
  script:
    - pip install ansible ansible-lint
    - echo "$VAULT_KEY" > vault_key.txt
    - chmod 700 .
    - ansible-lint --version
    - ansible-lint playbooks/*.yml

terraform-validate:
  stage: test

  image:
    name: hashicorp/terraform:light
    entrypoint: [""]
  script:
    - cd terraform
    - terraform fmt -check

Jak funguje GitHub pipeline

The pre-commit tool works exactly the same on GitHub as it does on GitLab, because it's local. The two services differ only in the CI/CD remote pipelines; both use structured YAML, but GitHub has slightly different keywords, and it calls its pipelines "Actions".

Pre-commit nástroj funguje na GitHubu úplně stejně jako na GitLabu. Obě služby se liší pouze ve vzdálených  CI/CD pipelinách; obě používají strukturovaný YAML, ale GitHub se liší v některých klíčových slovech a místo pipeline používá termín „Actions“.

Zde je officiální GitHub Action pro Gitleaks:

name: gitleaks
on: [pull_request, push, workflow_dispatch]
jobs:
  scan:
    name: gitleaks
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - uses: gitleaks/gitleaks-action@v2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
name: TruffleHog Secrets Scan
on: [pull_request]
jobs:
  TruffleHog:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: TruffleHog OSS
        uses: trufflesecurity/trufflehog@main
        with:
          path: ./
          base: ${{ github.event.repository.default_branch }}
          head: HEAD
          extra_args: --debug --only-verified

Další Actions jsou dostupné na GitHub Marketplace, což je kolekce komunitou vytvořených šablon akcí určených pro okamžité použití.

Kontakt

Chcete-li vědět více nebo potřebujete pomoci s nasazením, neváhejte nás kontaktovat na csirt@muni.cz.

Používáte starou verzi internetového prohlížeče. Doporučujeme aktualizovat Váš prohlížeč na nejnovější verzi.

Další info