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.

14. 8. 2024 Matěj Smyčka DevOps

Bez popisku

Ú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


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.

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

Další info