Použití skeneru zranitelnosti pro použité knihovny Dependency-Check v GitlabCI

Důležitou součástí správy zranitelnosti je důkladné pochopení a zabezpečení dodavatelského řetězce softwarových komponent, které tvoří moderní systémy. Agilní týmy a týmy DevOps široce využívají knihovny a rámce s otevřeným zdrojovým kódem, aby zkrátily dobu a náklady na vývoj. Ale tato medaile má také nevýhodu: příležitost zdědit chyby a zranitelnost jiných lidí.

Tým by si samozřejmě měl být jistý, že ví, které open source komponenty jsou zahrnuty v jeho aplikacích, zajistit stahování známých spolehlivých verzí ze známých spolehlivých zdrojů a stahovat aktualizované verze komponent po opravě nově objevených zranitelností.

V tomto příspěvku se podíváme na použití OWASP Dependency Check k přerušení sestavení, pokud zjistí vážné problémy s vaším kódem.

V knize „Development Security in Agile Projects“ je to popsáno následovně. OWASP Dependency Check je bezplatný skener, který katalogizuje všechny open source komponenty používané v aplikaci a ukazuje zranitelnosti, které obsahují. Existují verze pro Java, .NET, Ruby (gemspec), PHP (skladatel), Node.js a Python a také pro některé projekty C/C++. Dependency Check se integruje s běžnými nástroji pro vytváření, včetně Ant, Maven a Gradle, a servery pro nepřetržitou integraci, jako je Jenkins.

Kontrola závislostí hlásí všechny komponenty se známými zranitelnostmi z Národní databáze zranitelností NIST (NVD) a je aktualizována daty ze zpravodajských kanálů NVD.

Naštěstí to vše lze provést automaticky pomocí nástrojů, jako je projekt OWASP Dependency Check nebo komerční programy jako Černá kachna, Rentgen JFrog, Snyk, Životní cyklus zařízení Nexus Sonatyp resp SourceClear.

Tyto nástroje mohou být zahrnuty do sestavovacích kanálů pro automatickou inventarizaci závislostí s otevřeným zdrojovým kódem, identifikaci zastaralých verzí knihoven a knihoven obsahujících známá zranitelnost a přerušení sestavení, pokud jsou zjištěny závažné problémy.

Kontrola závislosti OWASP

K otestování a předvedení toho, jak funguje Kontrola závislostí, používáme toto úložiště závislost-kontrola-příklad.

Chcete-li zobrazit zprávu HTML, musíte nakonfigurovat webový server nginx na vašem gitlab-runneru.

Příklad minimální konfigurace nginx:

server {
    listen       9999;
    listen       [::]:9999;
    server_name  _;
    root         /home/gitlab-runner/builds;

    location / {
        autoindex on;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }
}

Na konci sestavy můžete vidět tento obrázek:

Použití skeneru zranitelnosti pro použité knihovny Dependency-Check v GitlabCI

Klikněte na odkaz a podívejte se na zprávu Kontrola závislosti.

První snímek obrazovky je horní část zprávy se shrnutím.

Použití skeneru zranitelnosti pro použité knihovny Dependency-Check v GitlabCI

Podrobnosti o druhém snímku obrazovky CVE-2017-5638. Zde vidíme úroveň CVE a odkazy na exploity.

Použití skeneru zranitelnosti pro použité knihovny Dependency-Check v GitlabCI

Třetí snímek obrazovky jsou podrobnosti o log4j-api-2.7.jar. Vidíme, že úrovně CVE jsou 7.5 a 9.8.

Použití skeneru zranitelnosti pro použité knihovny Dependency-Check v GitlabCI

Čtvrtý snímek obrazovky jsou podrobnosti o commons-fileupload-1.3.2.jar. Vidíme, že úrovně CVE jsou 7.5 a 9.8.

Použití skeneru zranitelnosti pro použité knihovny Dependency-Check v GitlabCI

Pokud chcete používat gitlabové stránky, tak to nepůjde – padlý úkol nevytvoří artefakt.

Příklad zde https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages.

Výstup sestavení: žádné artefakty, nevidím zprávu html. Měli byste zkusit Artifact: vždy

https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages/-/jobs/400004246

Použití skeneru zranitelnosti pro použité knihovny Dependency-Check v GitlabCI

Regulace úrovně zranitelností CVE

Nejdůležitější řádek v souboru gitlab-ci.yaml:

mvn $MAVEN_CLI_OPTS test org.owasp:dependency-check-maven:check -DfailBuildOnCVSS=7

Pomocí parametru failBuildOnCVSS můžete upravit úroveň zranitelností CVE, na které musíte reagovat.

Stažení NIST Vulnerability Database (NVD) z internetu

Všimli jste si, že NIST neustále stahuje databáze zranitelností NIST (NVD) z internetu:

Použití skeneru zranitelnosti pro použité knihovny Dependency-Check v GitlabCI

Ke stažení můžete použít utilitu nist_data_mirror_golang

Pojďme jej nainstalovat a spustit.

yum -y install yum-plugin-copr
yum copr enable antonpatsev/nist_data_mirror_golang
yum -y install nist-data-mirror
systemctl start nist-data-mirror

Nist-data-mirror nahraje NIST JSON CVE do /var/www/repos/nist-data-mirror/ při spuštění a aktualizuje data každých 24 hodin.

Chcete-li stáhnout CVE JSON NIST, musíte nakonfigurovat webový server nginx (například na vašem gitlab-runner).

Příklad minimální konfigurace nginx:

server {
    listen       12345;
    listen       [::]:12345;
    server_name  _;
    root         /var/www/repos/nist-data-mirror/;

    location / {
        autoindex on;
    }

    error_page 404 /404.html;
        location = /40x.html {
    }

    error_page 500 502 503 504 /50x.html;
        location = /50x.html {
    }

}

Abychom nedělali dlouhou řadu při spuštění mvn, přesuneme parametry do samostatné proměnné DEPENDENCY_OPTS.

Finální minimální konfigurace .gitlab-ci.yml bude vypadat takto:

variables:
  MAVEN_OPTS: "-Dhttps.protocols=TLSv1.2 -Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
  MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
  DEPENDENCY_OPTS: "-DfailBuildOnCVSS=7 -DcveUrlModified=http://localhost:12345/nvdcve-1.1-modified.json.gz -DcveUrlBase=http://localhost:12345/nvdcve-1.1-%d.json.gz"

cache:
  paths:
    - .m2/repository

verify:
  stage: test
  script:
    - set +e
    - mvn $MAVEN_CLI_OPTS install org.owasp:dependency-check-maven:check $DEPENDENCY_OPTS || EXIT_CODE=$?
    - export PATH_WITHOUT_HOME=$(pwd | sed -e "s//home/gitlab-runner/builds//g")
    - echo "************************* URL Dependency-check-report.html *************************"
    - echo "http://$HOSTNAME:9999$PATH_WITHOUT_HOME/target/dependency-check-report.html"
    - set -e
    - exit ${EXIT_CODE}
  tags:
    - shell

Telegramový chat o DevOps a zabezpečení
Telegramový kanál DevSecOps / SSDLC - Bezpečný vývoj

Zdroj: www.habr.com

Přidat komentář