Jak začít se SAST pipelines
V tomto návodu určeném především pro vývojáře popisujeme, jak snadno lze spustit statické testování bezpečnosti aplikací (SAST) jako součást GitLab CI/CD.
Úvod
Tento návod popisuje, jak co nejefektivněji spustit statické testování bezpečnosti aplikací (SAST) v prostředí GitLab. SAST je proces, při kterém pomocí statické analýzy kódu hledáme potenciální zranitelnosti.
Existuje mnoho nástrojů pro SAST. My jsme si vybrali šablonu GitLab SAST, protože má nulové nároky na nastavení a tyto skenery můžete nasadit pomocí několika řádků kódu.
Zmíněné nástroje lze také spouštět ručně nebo je spouštět prostřednictvím háčků před odesláním.
Motivace
Proč by někdo chtěl nasadit něco, co přidává práci? Ano, SAST přidává práci s analýzou výsledků a hledáním pravdivých a falešně pozitivních výsledků. Ale cena za jeho nepoužití je mnohem vyšší, bez jakéhokoli testování se spoléháte na to, že se útočníkům zatím nevyplatilo vaši aplikaci zkoumat.
Navíc pokud se vám podaří zachytit zranitelnosti během vývoje, je jejich oprava mnohem snazší než jejich zmírnění po vydání.
Použité nástroje
- Semgrep (sémantický grep) je nástroj příkazového řádku pro prohledávání textu a statickou analýzu kódu. Semgrep si je vědom sémantiky zdrojového kódu a podporuje mnoho jazyků včetně Pythonu, C#, Javy, JavaScriptu a dalších. Má několik úrovní plánů, ale ten základní, který nás zajímá nejvíce, je zdarma, a to až pro 10 přispěvatelů.
- Bandit je nástroj určený k vyhledávání běžných bezpečnostních problémů v kódu jazyka Python. Pro každý zpracovávaný soubor z něj sestaví abstraktní syntaktický strom (AST) a proti uzlům AST spustí příslušné pluginy.
- Terrascan je statický analyzátor kódu pro infrastrukturu jako kód (IaC). Dokáže odhalit porušení zabezpečení v HCL (jazyk Terraform), souborech Docker, Kubernetes, grafech Helm a dalších.
Návod
Umístění
SAST je součástí CI/CD pipeline. Konfigurace CI/CD je umístěna v souboru .gitlab-ci.yml, který se nachází v kořenovém adresáři projektu.
Vestavěná šablona
Abychom byli přesní, šablona GitLab SAST nespoléhá pouze na jeden nástroj; může spouštět různé nástroje založené na různých jazycích; jejich seznam si můžete prohlédnout zde. Pokud například používáte jazyk Python, bude kontrola provedena pomocí Semgrepu a Banditu, dalšího nástroje SAST.
POZNÁMKA: Pokud GitLab spustí vestavěný Semgrep s vlastní sadou pravidel, která se liší od výchozí sady pravidel Semgrep, z našich zkušeností vyplývá, že výsledky jsou mnohem horší než použití Semgrep jako samostatného nástroje. Viz níže uvedený příklad.
Chcete-li povolit vestavěný GitLab SAST, přidejte do úložiště soubor .gitlab-ci.yml s tímto obsahem:
include:
- template: Jobs/SAST.gitlab-ci.yml
Výsledky budou k dispozici po dokončení úlohy v části Security and compliance > Vulnerability report a mohou vypadat takto:
Integrace šablony SAST do stávající CI/CD pipeline
Nastavení může být složitější, pokud máte existující CI/CD pipeline. Úlohy musí mít definované fáze a šablony se spouštějí ve výchozí testovací fázi. Ujistěte se, že jste k existujícím fázím přidali testovací fázi.
Zde je uveden příklad:
include:
- template: Code-Quality.gitlab-ci.yml
- template: Security/SAST.gitlab-ci.yml
- template: Security/Secret-Detection.gitlab-ci.yml
stages:
- test
- test_code_quality
test_code_quality:
stage: test_code_quality
image: python:latest
before_script:
- pip install poetry
- python -m poetry config virtualenvs.in-project true
- python -m poetry install
script:
- python -m poetry run ruff check *.p
Je nutné si uvědomit, že šablony mají povolen příznak allow_failure, takže další fáze budou provedeny i v případě, že kontrola šablony selže.
Vlastní pipelines
Vlastní pipelines nemají tak pěkné formátování jako ty vestavěné, výsledky jsou k dispozici v sekci úloh.
Příklad Terrascan
Struktura je stejná jako v příkladu výše. Chcete-li spustit Terrascan s botem pro skenování závislostí na kódu terraformu, zkopírujte následující text do souboru .gitlab-ci.yml.
include:
- template: Security/Dependency-Scanning.gitlab-ci.yml
stages:
- test
terrascan:
stage: test
image:
name: tenable/terrascan:latest
entrypoint: ["/bin/sh", "-c"]
script:
- /go/bin/terrascan scan --iac-type terraform --iac-dir .
Příklad Semgrep
Here is how Semgrep custom pipeline. Semgrep is free up to 10 contributors. Be careful not to choose any options that would result in your results getting uploaded to the cloud platform - use semgrep scan, not semgrep ci. The command semgrep ci would also require a API token.
Zde je návod, jak vytvořit vlastní pipeline Semgrep. Dávejte pozor, abyste nezvolili žádné možnosti, které by vedly k odeslání výsledků do cloudové platformy - používejte semgrep scan, nikoli semgrep ci (ten by navíc vyžadoval APItoken).
semgrep:
image: semgrep/semgrep
variables:
SEMGREP_GITLAB_JSON: "1"
script:
- semgrep scan . --config="r/all" --metrics="off" --error --gitlab-sast -o gl-sast-report.json || true
artifacts:
reports:
sast: gl-sast-report.json
Příklad Bandit
Příklad ukazuje, jak jej spustit s vlastní konfigurací.
bandit:
stage: test_security
image: python:latest
script:
- "printf 'exclude_dirs: [\"test\"] \nskips: [\"B703\", \"B101\", \"B113\", \"B308\"]' > .bandit.cfg"
- pip install bandit
- bandit -r . -c .bandit.cfg
Kontakt
Pokud chcete vědět více nebo potřebujete pomoci s nasazením, neváhejte nás kontaktovat na adrese csirt@muni.cz.