Важная часть управления уязвимостями состоит в том, чтобы хорошо понимать и обеспечить безопасность цепочки поставок тех компонентов ПО, из которых строятся современные системы. Команды, практикующие гибкие методики и DevOps, широко применяют библиотеки и каркасы с открытым исходным кодом, чтобы сократить время и стоимость разработки. Но эта медаль имеет и обратную сторону: возможность получить в наследство чужие ошибки и уязвимости.
Очевидно, команда должна обязательно знать, какие компоненты с открытым исходным кодом включены в ее приложения, следить за тем, чтобы заведомо надежные версии скачивались из заведомо надежных источников, и загружать обновленные версии компонентов после исправления вновь обнаруженных уязвимостей.
В этом посте рассмотрим использование OWASP Dependency Check для прерывания сборки в случае обнаружения серьезных проблем с вашим кодом.
В книге "Безопасность разработки в Agile-проектах" описан так. OWASP Dependency Check – это бесплатный сканер, который каталогизирует все используемые в приложении компоненты с открытым исходным кодом и показывает имеющиеся в них уязвимости. Имеются версии для Java, .NET, Ruby (gemspec), PHP (composer), Node.js и Python, а также для некоторых проектов на C/C++. Dependency Check интегрируется с распространенными средствами сборки, в т. ч. Ant, Maven и Gradle и серверами непрерывной интеграции типа Jenkins.
Dependency Check сообщает обо всех компонентах с известными уязвимостями из Национальной базы данных уязвимостей (NVD) NIST и обновляется на основании данных из новостных каналов NVD.
По счастью, все это можно делать автоматически с помощью таких инструментов, как проект OWASP Dependency Check, или коммерческих программ типа Black Duck (https://www.blackducksoftware.com/solutions/application-security), JFrog Xray (https://jfrog.com/xray/), Snyk (https://snyk.io/), Nexus Lifecycle (https://www.sonatype.com/nexus-lifecycle) компании Sonatype или SourceClear (https://srcclr.com/).
Эти инструменты можно включить в сборочные конвейеры, чтобы автоматически составлять опись зависимостей с открытым исходным кодом, выявлять устаревшие версии библиотек и библиотеки, содержащие известные уязвимости, и прерывать сборку в случае обнаружения серьезных проблем.
OWASP Dependency Check
Для тестирования и демонстрации работы Dependency Check используем этот репозиторий dependency-check-example.
Для просмотра HTML отчета нужно настроить web-севрер nginx на вашем gitlab-runner.
Пример минимального конфига 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 {
}
}
В конце сборки вы можете видеть вот таку картину:
Переходим по ссылке и видим отчет Dependency Check.
Первый скриншот — верхняя часть отчета с кратким содержанием.
Второй скриншот подробности CVE-2017-5638. Здесь мы видим уроверь CVE и ссылки на эксплойты.
Третий скриншот — подробности log4j-api-2.7.jar. Видим что уровни CVE 7.5 и 9.8.
Четвертый скриншот — подробности commons-fileupload-1.3.2.jar. Видим что уровни CVE 7.5 и 9.8.
Если вы хотите использовать gitlab pages, то не получится — упавшая таска не создаст артефакт.
Пример здесь https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages.
Вывод сборки: артефактов нет, html отчета не вижу.
https://gitlab.com/anton_patsev/dependency-check-example-gitlab-pages/-/jobs/400004246
Регулирование уровня CVE уязвимостей
Самая главная строка в файле gitlab-ci.yaml:
mvn $MAVEN_CLI_OPTS test org.owasp:dependency-check-maven:check -DfailBuildOnCVSS=7
Параметром failBuildOnCVSS вы можете регулировать уровень CVE уязвимостей, на которые нужно реагировать.
Скачивание с интернета базы данных уязвимостей (NVD) NIST
Вы заметили что постоянно скачивает базы данных уязвимостей (NVD) NIST с интернета:
Для скачивания можно использовать утилиту nist_data_mirror_golang
Установим и запустим ее.
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 закачивает CVE JSON NIST в /var/www/repos/nist-data-mirror/ при запуске и обновляет данные каждые 24 часа.
Для скачивания CVE JSON NIST нужно настроить web-севрер nginx (например на вашем gitlab-runner).
Пример минимального конфига 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 {
}
}
Чтобы не делать длинную строку где запускается mvn вынесем параметры в отдельную переменную DEPENDENCY_OPTS.
Итоговый минимальный конфиг .gitlab-ci.yml получится вот так:
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 test 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
Telegram канал про DevOps and Security: https://t.me/devsecops_ru
Автор: Пацев Антон