Использование сканера уязвимостей в используемых библиотеках Dependency-Check в GitlabCI
Команды, практикующие гибкие методики и DevOps, широко применяют библиотеки и каркасы с открытым исходным кодом, чтобы сократить время и стоимость разработки. Важная часть управления уязвимостями состоит в том, чтобы хорошо понимать и обеспечить безопасность цепочки поставок тех компонентов ПО, из которых строятся современные системы. Но эта медаль имеет и обратную сторону: возможность получить в наследство чужие ошибки и уязвимости.
Очевидно, команда должна обязательно знать, какие компоненты с открытым исходным кодом включены в ее приложения, следить за тем, чтобы заведомо надежные версии скачивались из заведомо надежных источников, и загружать обновленные версии компонентов после исправления вновь обнаруженных уязвимостей.
В этом посте рассмотрим использование OWASP Dependency Check для прерывания сборки в случае обнаружения серьезных проблем с вашим кодом.
OWASP Dependency Check – это бесплатный сканер, который каталогизирует все используемые в приложении компоненты с открытым исходным кодом и показывает имеющиеся в них уязвимости. В книге "Безопасность разработки в Agile-проектах" описан так. NET, Ruby (gemspec), PHP (composer), Node.js и Python, а также для некоторых проектов на C/C++. Имеются версии для Java, . ч. 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 error_page 404 /404.html; location = /40x.html { } error_page 500 502 503 504 /50x.html; location = /50x.html { }
}
В конце сборки вы можете видеть вот таку картину:
Переходим по ссылке и видим отчет Dependency Check.
Первый скриншот — верхняя часть отчета с кратким содержанием.
Здесь мы видим уроверь CVE и ссылки на эксплойты. Второй скриншот подробности CVE-2017-5638.
7.jar. Третий скриншот — подробности log4j-api-2. 5 и 9. Видим что уровни CVE 7. 8.
3. Четвертый скриншот — подробности commons-fileupload-1. Видим что уровни CVE 7. 2.jar. 8. 5 и 9.
Если вы хотите использовать 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