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

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:
- Výchozí GitLab šablony
- Gitleaks
- TruffleHog
- Kontroly pomocí Ansible-lint
- Kontroly formátování pomocí Terraform
--- 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.