جزء مهم من إدارة الثغرات الأمنية هو فهم وضمان أمن سلسلة التوريد لمكونات البرامج التي تشكل أنظمة حديثة. تستخدم فرق Agile و DevOps على نطاق واسع المكتبات والأطر مفتوحة المصدر لتقليل وقت التطوير وتكلفته. لكن هذه الميدالية لها جانب سلبي: القدرة على وراثة أخطاء الآخرين ونقاط ضعفهم.
من الواضح أن الفريق يجب أن يعرف المكونات المفتوحة المصدر المضمنة في تطبيقاته ، والتأكد من تنزيل الإصدارات الموثوقة المعروفة من مصادر موثوقة بوضوح ، وتنزيل الإصدارات المحدثة من المكونات بعد إصلاح الثغرات الأمنية المكتشفة حديثًا.
في هذا المنشور ، سننظر في استخدام التحقق من تبعية OWASP لمقاطعة إنشاء إذا واجهت مشكلات خطيرة في شفرتك.
يوصف كتاب "تطوير الأمن في المشروعات الخفيفة" على النحو التالي. OWASP Dependency Check عبارة عن ماسح ضوئي مجاني يقوم بفهرسة جميع مكونات المصادر المفتوحة المستخدمة في التطبيق ويظهر نقاط الضعف الموجودة فيها. هناك إصدارات خاصة بـ Java و .NET و Ruby (gemspec) و PHP (الملحن) و Node.js و Python ، بالإضافة إلى بعض مشاريع C / C ++. تتكامل ميزة Dependency Check مع أدوات الإنشاء الشائعة ، بما في ذلك Ant و Maven و Gradle وخوادم التكامل المستمر مثل Jenkins.
تحقق تبعية التحقق من جميع المكونات ذات الثغرات المعروفة من NIST National Vulnerability Database (NVD) ويتم تحديثها استنادًا إلى بيانات من قنوات أخبار NVD.
لحسن الحظ ، يمكن القيام بكل ذلك تلقائيًا باستخدام أدوات مثل مشروع OWASP Dependency Check أو البرامج التجارية مثل Black Duck أو JFrog Xray أو Snyk أو Nexus Lifecycle من Sonatype أو SourceClear .
يمكن تضمين هذه الأدوات في خطوط أنابيب التجميع لتجميع قائمة تبعية مفتوحة المصدر تلقائيًا ، وتحديد الإصدارات القديمة من المكتبات والمكتبات التي تحتوي على ثغرات أمنية معروفة ، ومقاطعة الإنشاء في حالة العثور على مشاكل خطيرة.
تحقق تبعية OWASP
لاختبار وشرح كيفية عمل التحقق من التبعية ، نستخدم مستودع مثال التحقق من التبعية .
لعرض تقرير HTML ، تحتاج إلى تكوين خادم الويب nginx على عداء gitlab.
مثال على الحد الأدنى من التكوين 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 { } }
في نهاية التجميع ، يمكنك رؤية هذه الصورة:

نتبع الرابط ونرى تقرير التحقق من التبعية.
لقطة الشاشة الأولى هي الجزء العلوي من التقرير مع ملخص.

تفاصيل لقطة الشاشة الثانية 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 ، فلن تنجح - فلن تنشئ المهمة المسقطة قطعة أثرية.
مثال على ذلك 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 التي تحتاج إلى الاستجابة لها.
قم بتنزيل قاعدة بيانات عدم حصانة NIST (NVD)
لاحظت أنك تقوم باستمرار بتنزيل قاعدة بيانات عدم حصانة NIST (NVD) من الإنترنت:

يمكنك استخدام الأداة المساعدة 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 ، تحتاج إلى تكوين خادم الويب nginx (على سبيل المثال ، على برنامج gitlab الخاص بك).
مثال على الحد الأدنى من التكوين 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 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
برقية الدردشة حول DevOps والأمن
قناة برقية تطوير DevSecOps / SSDLC- آمنة