Grava parto de vundebleco-administrado estas ĝisfunde kompreni kaj sekurigi la provizoĉenon de la softvarkomponentoj kiuj konsistigas modernajn sistemojn. Agile kaj DevOps-teamoj multe uzas malfermfontajn bibliotekojn kaj kadrojn por redukti disvolvan tempon kaj koston. Sed ĉi tiu medalo ankaŭ havas malavantaĝon: la ŝancon heredi la erarojn kaj vundeblecojn de aliaj homoj.
Evidente, la teamo devas esti certa scii kiuj malfermfontaj komponantoj estas inkluzivitaj en ĝiaj aplikoj, certigi ke konataj fidindaj versioj estas elŝutitaj de konataj fidindaj fontoj, kaj elŝuti ĝisdatigitajn versiojn de komponentoj post lastatempe malkovritaj vundeblecoj estas flikitaj.
En ĉi tiu afiŝo, ni rigardos uzi OWASP Dependecan Kontrolon por ĉesigi konstruon se ĝi detektas gravajn problemojn kun via kodo.
En la libro "Disvolva Sekureco en Agile Projects" ĝi estas priskribita jene. OWASP Dependency Check estas senpaga skanilo, kiu katalogas ĉiujn malfermfontajn komponantojn uzatajn en aplikaĵo kaj montras la vundeblecojn, kiujn ili enhavas. Estas versioj por Java, .NET, Ruby (gemspec), PHP (komponisto), Node.js kaj Python, kaj ankaŭ por iuj projektoj C/C++. Dependeca Kontrolo integriĝas kun komunaj konstruaj iloj, inkluzive de Ant, Maven kaj Gradle, kaj daŭraj integrigaj serviloj kiel Jenkins.
Dependeca Kontrolo raportas ĉiujn komponentojn kun konataj vundeblecoj de la Nacia Vulnerability Database (NVD) de NIST kaj estas ĝisdatigita kun datumoj de NVD-novaĵfluoj.
Feliĉe, ĉio ĉi povas esti farita aŭtomate uzante ilojn kiel la projekto OWASP Dependency Check aŭ komercajn programojn kiel
Ĉi tiuj iloj povas esti inkluditaj en konstruoduktoj por aŭtomate inventari malfermfontajn dependecojn, identigi malmodernajn versiojn de bibliotekoj kaj bibliotekoj enhavantaj konatajn vundeblecojn, kaj ĉesigi konstruaĵojn se gravaj problemoj estas detektitaj.
Kontrolo pri Dependeco de OWASP
Por testi kaj pruvi kiel funkcias Dependeca Kontrolo, ni uzas ĉi tiun deponejon
Por vidi la HTML-raporton, vi devas agordi la retservilon nginx sur via gitlab-runner.
Ekzemplo de minimuma nginx-agordo:
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 {
}
}
Ĉe la fino de la asembleo vi povas vidi ĉi tiun bildon:
Sekvu la ligilon kaj vidu la raporton pri Dependeco-Kontrolo.
La unua ekrankopio estas la supra parto de la raporto kun resumo.
Dua ekrankopio detaloj CVE-2017-5638. Ĉi tie ni vidas la CVE-nivelon kaj ligilojn al ekspluatoj.
La tria ekrankopio estas detaloj de log4j-api-2.7.jar. Ni vidas, ke CVE-niveloj estas 7.5 kaj 9.8.
La kvara ekrankopio estas la detaloj de commons-fileupload-1.3.2.jar. Ni vidas, ke CVE-niveloj estas 7.5 kaj 9.8.
Se vi volas uzi gitlab-paĝojn, tiam ĝi ne funkcios - falinta tasko ne kreos artefakton.
Ekzemplo ĉi tie
Konstrua eligo: neniuj artefaktoj, mi ne vidas la html-raporton. Vi devus provi Artefakto: ĉiam
Reguligante la nivelon de CVE-vundeblecoj
La plej grava linio en la gitlab-ci.yaml dosiero:
mvn $MAVEN_CLI_OPTS test org.owasp:dependency-check-maven:check -DfailBuildOnCVSS=7
Per la parametro failBuildOnCVSS vi povas ĝustigi la nivelon de CVE-vundeblecoj, al kiuj vi devas respondi.
Elŝutante la NIST-Vulnerability Database (NVD) de la Interreto
Ĉu vi rimarkis, ke NIST konstante elŝutas la datumbazojn pri vundeblecoj de NIST (NVD) de la Interreto:
Por elŝuti, vi povas uzi la ilon
Ni instalu kaj lanĉu ĝin.
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 alŝutas la NIST JSON CVE al /var/www/repos/nist-data-mirror/ dum ekfunkciigo kaj ĝisdatigas la datumojn ĉiujn 24 horojn.
Por elŝuti CVE JSON NIST, vi devas agordi la retservilon nginx (ekzemple, ĉe via gitlab-runner).
Ekzemplo de minimuma nginx-agordo:
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 {
}
}
Por ne fari longan linion kie mvn estas lanĉita, ni movos la parametrojn en apartan variablon DEPENDENCY_OPTS.
La fina minimuma agordo .gitlab-ci.yml aspektos jene:
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
fonto: www.habr.com