{"id":478904,"date":"2026-05-07T10:26:10","date_gmt":"2026-05-07T10:26:10","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=478904"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=478904","title":{"rendered":"\u041a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c Maven build security-aware: AppSec-\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0431\u0435\u0437 \u0434\u0440\u0435\u0439\u0444\u0430 CI\/CD"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 Maven core extension, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 Java security checks \u0432 Maven lifecycle, \u0430 \u043d\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c scanner-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u043e pipeline-\u0444\u0430\u0439\u043b\u0430\u043c.<\/p>\n<h3>\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435<\/h3>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e Maven-\u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0435 \u0443\u043c\u0435\u044e\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c security-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b.<\/p>\n<p>\u0423\u043c\u0435\u044e\u0442.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0432 pipeline \u0432\u044b\u0437\u0432\u0430\u0442\u044c tests, Dependency-Check, CycloneDX \u0438 SonarQube. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c plugin blocks \u0432 <code>pom.xml<\/code>. \u041c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c.<\/p>\n<p>\u041a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e \u0434\u0430\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<p>\u041f\u043e\u0442\u043e\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f.<\/p>\n<p>\u0412 \u043e\u0434\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0435\u0441\u0442\u044c JaCoCo, \u043d\u043e XML coverage \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 SonarQube. \u0412 \u0434\u0440\u0443\u0433\u043e\u043c Dependency-Check \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e HTML. \u0412 multi-module \u043f\u0440\u043e\u0435\u043a\u0442\u0435 SBOM \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0442 root aggregator, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0430\u043c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f runtime-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c. \u0412 \u0442\u0440\u0435\u0442\u044c\u0435\u043c pipeline \u0437\u0430\u0431\u044b\u043b\u0438 merge request metadata, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 SonarQube analysis \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0448\u0435\u043b, \u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043d\u0435\u043f\u043e\u043b\u043d\u044b\u043c.<\/p>\n<p>\u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c security build drift.<\/p>\n<p>\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0435\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c.<\/p>\n<p>\u042f \u0441\u0434\u0435\u043b\u0430\u043b <code>secure-maven-extension<\/code>, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0434\u043b\u044f Maven-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p>\u041d\u0435 \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043a\u0430\u043d\u0435\u0440\u044b.<\/p>\n<p>\u0410 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c Maven lifecycle \u043d\u0435\u0441\u0442\u0438 security workflow.<\/p>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442: <a href=\"https:\/\/github.com\/Niki-1337\/secure-build-maven-extension\" rel=\"noopener noreferrer nofollow\">Secure Build Maven Extension<\/a><\/p>\n<h3>\u041a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f Maven DevSecOps<\/h3>\n<p>\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 pipeline \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"yaml\">script:  - .\/mvnw test  - .\/mvnw org.owasp:dependency-check-maven:check  - .\/mvnw org.cyclonedx:cyclonedx-maven-plugin:makeBom  - .\/mvnw sonar:sonar<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e.<\/p>\n<p>\u041d\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435 \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 maintenance pattern, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0438\u043a\u0442\u043e \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043d\u0435 \u0432\u043b\u0430\u0434\u0435\u0435\u0442.<\/p>\n<p>\u0427\u0430\u0441\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0436\u0438\u0432\u0435\u0442 \u0432 CI\/CD. \u0427\u0430\u0441\u0442\u044c \u0432 <code>pom.xml<\/code>. \u0427\u0430\u0441\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u0427\u0430\u0441\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0443\u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0430\u0434\u0435\u043d\u0438\u044f pipeline.<\/p>\n<p>\u041d\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0437\u0430\u043d\u043e\u0432\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b:<\/p>\n<ul>\n<li>\n<p>\u043a\u0430\u043a \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c coverage;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0443\u0434\u0430 \u043a\u043b\u0430\u0441\u0442\u044c Dependency-Check reports;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u043d\u0443\u0436\u043d\u044b security-\u043a\u043e\u043c\u0430\u043d\u0434\u0435;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c SonarQube token;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c branch analysis \u043e\u0442 MR analysis;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c SBOM \u0434\u043b\u044f multi-module \u043f\u0440\u043e\u0435\u043a\u0442\u0430;<\/p>\n<\/li>\n<li>\n<p>\u043a\u0430\u043a \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u044d\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e: build \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 security-aware. Pipeline \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043a\u0430\u043d\u0435\u0440\u044b \u0440\u044f\u0434\u043e\u043c \u0441 build.<\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435\u0443\u0434\u043e\u0431\u0435\u043d<\/h3>\n<p>CI\/CD \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u043e\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0447\u0438\u0441\u0442\u044b\u0439 build, \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c artifacts, \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c gates, \u0445\u0440\u0430\u043d\u0438\u0442\u044c logs \u0438 \u0434\u0430\u0432\u0430\u0442\u044c auditability.<\/p>\n<p>\u041d\u043e \u043a\u043e\u0433\u0434\u0430 CI\/CD \u0435\u0449\u0435 \u0438 \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u0432\u0441\u0435\u0439 scanner-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 custom-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"bash\">mvn verify<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442, \u043d\u043e pipeline \u0434\u0435\u043b\u0430\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435:<\/p>\n<ul>\n<li>\n<p>\u0434\u0440\u0443\u0433\u0438\u0435 goals;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0440\u0443\u0433\u0438\u0435 properties;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0440\u0443\u0433\u0438\u0435 report paths;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0440\u0443\u0433\u0430\u044f SonarQube metadata.<\/p>\n<\/li>\n<\/ul>\n<p>\u0418 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0443\u0436\u0435 \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443.<\/p>\n<p>\u042d\u0442\u0443 \u0434\u044b\u0440\u0443 \u044f \u0438 \u0445\u043e\u0442\u0435\u043b \u0437\u0430\u043a\u0440\u044b\u0442\u044c.<\/p>\n<p>Maven \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c\u0438, \u043d\u043e lifecycle \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 AppSec behavior \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u0432 CI\/CD.<\/p>\n<h3>\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h3>\n<p>\u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0438\u0434\u0435\u044f:<\/p>\n<pre><code>\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c Maven experience \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c,\u043d\u043e \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u044b\u0435 security conventions \u0432 lifecycle<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 security script \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430.<\/p>\n<p>CI\/CD \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043d\u043e\u0432\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c scanner conventions.<\/p>\n<p>Security-\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c, \u0433\u0434\u0435 \u043b\u0435\u0436\u0430\u0442 \u043e\u0442\u0447\u0435\u0442\u044b \u0438 \u043a\u0430\u043a\u0438\u0435 properties \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c.<\/p>\n<p>Build \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u0441\u043a\u0443\u0447\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0441\u0430\u043c.<\/p>\n<p>\u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e Maven core extension, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432 pipeline.<\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 Maven core extension<\/h3>\n<p>\u041e\u0431\u044b\u0447\u043d\u044b\u0439 Maven plugin \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435.<\/p>\n<p>\u042d\u0442\u043e \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u043e copy-paste \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442.<\/p>\n<p>Core extension \u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u044e\u044e \u0442\u043e\u0447\u043a\u0443 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>\u041e\u043d \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437:<\/p>\n<pre><code>.mvn\/extensions.xml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"xml\">&lt;extensions&gt;  &lt;extension&gt;    &lt;groupId&gt;io.github.niki1337.securebuild&lt;\/groupId&gt;    &lt;artifactId&gt;secure-maven-extension&lt;\/artifactId&gt;    &lt;version&gt;0.1.0&lt;\/version&gt;  &lt;\/extension&gt;&lt;\/extensions&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043d\u0443\u0442\u0440\u0438 extension \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 Maven <code>afterProjectsRead<\/code>.<\/p>\n<p>\u042d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442.<\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438 Maven \u0443\u0436\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b root <code>pom.xml<\/code> \u0438 module POMs. \u0423\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b packaging, modules, existing plugins \u0438 properties. \u041d\u043e lifecycle \u0435\u0449\u0435 \u043d\u0435 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b.<\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c extension \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 security plugins \u0434\u043e \u0444\u0430\u0437 <code>initialize<\/code>, <code>package<\/code>, <code>verify<\/code> \u0438 <code>sonar:sonar<\/code>.<\/p>\n<p>\u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f conventions.<\/p>\n<h3>\u0427\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c<\/h3>\n<p>Extension \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 Java-\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0442\u0430\u043a \u0437\u043d\u0430\u044e\u0442:<\/p>\n<ul>\n<li>\n<p><code>jacoco-maven-plugin<\/code> \u0434\u043b\u044f coverage;<\/p>\n<\/li>\n<li>\n<p><code>sonar-maven-plugin<\/code> \u0434\u043b\u044f SonarQube analysis;<\/p>\n<\/li>\n<li>\n<p><code>dependency-check-maven<\/code> \u0434\u043b\u044f dependency risk reports;<\/p>\n<\/li>\n<li>\n<p><code>cyclonedx-maven-plugin<\/code> \u0434\u043b\u044f SBOM.<\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Maven:<\/p>\n<pre><code class=\"bash\">mvn packagemvn verifymvn sonar:sonar<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f security-aware.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"bash\">mvn package<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c CycloneDX SBOM.<\/p>\n<pre><code class=\"bash\">mvn verify<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c tests, JaCoCo coverage \u0438 Dependency-Check.<\/p>\n<pre><code class=\"bash\">mvn verify sonar:sonar<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c SonarQube analysis \u0441 branch\/MR metadata, binaries \u0438 coverage paths.<\/p>\n<p>\u0418 \u044d\u0442\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435: workflow \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a Maven, \u0430 \u043d\u0435 \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u0432, \u043f\u0440\u0438\u043a\u043b\u0435\u0435\u043d\u043d\u044b\u0445 \u0432\u043e\u043a\u0440\u0443\u0433 Maven.<\/p>\n<h3>\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432<\/h3>\n<p>\u0420\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u0434\u043a\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439.<\/p>\n<p>\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c <code>-D...<\/code>. \u0412 CI\/CD \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0447\u0435\u0440\u0435\u0437 environment variables. \u041a\u0430\u043a\u0438\u0435-\u0442\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 <code>pom.xml<\/code>.<\/p>\n<p>Extension \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>environment variables;<\/p>\n<\/li>\n<li>\n<p>Maven user properties;<\/p>\n<\/li>\n<li>\n<p>project properties \u0438\u0437 <code>pom.xml<\/code>;<\/p>\n<\/li>\n<li>\n<p>system properties.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 project defaults:<\/p>\n<pre><code class=\"xml\">&lt;properties&gt;  &lt;secure.serviceName&gt;payment-api&lt;\/secure.serviceName&gt;  &lt;sonar.projectKey&gt;payment-api&lt;\/sonar.projectKey&gt;  &lt;sonar.projectName&gt;Payment API&lt;\/sonar.projectName&gt;&lt;\/properties&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 CI variables:<\/p>\n<pre><code class=\"bash\">export SERVICE_NAME=\"payment-api\"export SONAR_HOST_URL=\"https:\/\/sonarqube.example.com\"export SONAR_PROJECT_KEY=\"payment-api\"export SONAR_TOKEN=\"token-value\"export DT_API_URL=\"https:\/\/dependency-track.example.com\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e override:<\/p>\n<pre><code class=\"bash\">mvn verify \\  -Dsecure.serviceName=payment-api \\  -Dsonar.projectKey=payment-api<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043c\u044b\u0441\u043b \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0441\u0442\u0438\u043b\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>\u0421\u043c\u044b\u0441\u043b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c.<\/p>\n<h3>Coverage \u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u0439 \u043f\u0440\u043e\u0432\u043e\u0434\u043a\u0438<\/h3>\n<p>Coverage \u0447\u0430\u0441\u0442\u043e \u043b\u043e\u043c\u0430\u0435\u0442 AppSec workflow \u0442\u0438\u0445\u043e.<\/p>\n<p>SonarQube \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0431\u0435\u0437 coverage. JaCoCo \u043c\u043e\u0436\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442, \u043d\u043e \u0435\u0441\u043b\u0438 XML output \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0438\u043b\u0438 path \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u0432 SonarQube, \u0430\u043d\u0430\u043b\u0438\u0437 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0430\u0431\u0435\u0435.<\/p>\n<p>Extension inject-\u0438\u0442 JaCoCo \u0434\u043b\u044f Java <code>jar<\/code> \u0438 <code>war<\/code> \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0435\u0441\u043b\u0438 JaCoCo \u0435\u0449\u0435 \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d.<\/p>\n<p>Lifecycle wiring:<\/p>\n<pre><code>initialize -&gt; jacoco:prepare-agentverify     -&gt; jacoco:report<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>XML \u043e\u0442\u0447\u0435\u0442:<\/p>\n<pre><code>target\/site\/jacoco\/jacoco.xml<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e\u0442 path \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432:<\/p>\n<pre><code>sonar.coverage.jacoco.xmlReportPaths<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\u041d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 drift, \u043a\u043e\u0433\u0434\u0430 \u0438\u0445 \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442 \u0440\u0443\u043a\u0430\u043c\u0438.<\/p>\n<h3>SonarQube: \u0442\u043e\u043a\u0435\u043d\u0430 \u043c\u0430\u043b\u043e<\/h3>\n<p>\u0427\u0430\u0441\u0442\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430: \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e SonarQube setup \u044d\u0442\u043e URL, project key \u0438 token.<\/p>\n<p>\u0414\u043b\u044f Java-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 analysis \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0435\u0449\u0435 \u043e\u0442 source paths, test paths, compiled binaries, coverage XML, branch metadata \u0438 merge request metadata.<\/p>\n<p>Extension \u0433\u043e\u0442\u043e\u0432\u0438\u0442 properties:<\/p>\n<pre><code>sonar.sourcessonar.testssonar.java.binariessonar.java.test.binariessonar.coverage.jacoco.xmlReportPathssonar.exclusionssonar.test.exclusionssonar.cpd.exclusionssonar.coverage.exclusions<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 GitLab merge request pipeline \u043e\u043d \u0431\u0435\u0440\u0435\u0442:<\/p>\n<pre><code>CI_PIPELINE_SOURCE=merge_request_eventCI_MERGE_REQUEST_IIDCI_MERGE_REQUEST_SOURCE_BRANCH_NAMECI_MERGE_REQUEST_TARGET_BRANCH_NAME<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418 \u043c\u0430\u043f\u043f\u0438\u0442 \u0432:<\/p>\n<pre><code>sonar.pullrequest.keysonar.pullrequest.branchsonar.pullrequest.base<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f branch pipeline \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f:<\/p>\n<pre><code>sonar.branch.name<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0442\u0438\u043f \u043b\u043e\u0433\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0445\u0440\u0443\u043f\u043a\u0438\u043c, \u0435\u0441\u043b\u0438 \u043e\u043d \u0440\u0430\u0437\u043c\u0430\u0437\u0430\u043d \u043f\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u043c <code>.gitlab-ci.yml<\/code>.<\/p>\n<p>\u0412 core extension \u044d\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.<\/p>\n<h3>Dependency-Check \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435<\/h3>\n<p>OWASP Dependency-Check inject-\u0438\u0442\u0441\u044f \u0432 Maven lifecycle.<\/p>\n<p>\u0414\u043b\u044f single-module \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<pre><code>verify -&gt; dependency-check:check<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f multi-module:<\/p>\n<pre><code>verify -&gt; dependency-check:aggregate<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0424\u043e\u0440\u043c\u0430\u0442\u044b \u043e\u0442\u0447\u0435\u0442\u043e\u0432:<\/p>\n<pre><code>HTMLJSONSARIFXML<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0443\u0442\u044c:<\/p>\n<pre><code>target\/reports\/dependency-check<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f network-dependent analyzers:<\/p>\n<ul>\n<li>\n<p>RetireJS;<\/p>\n<\/li>\n<li>\n<p>Node audit;<\/p>\n<\/li>\n<li>\n<p>Node package analyzer;<\/p>\n<\/li>\n<li>\n<p>OSS Index;<\/p>\n<\/li>\n<li>\n<p>hosted suppressions.<\/p>\n<\/li>\n<\/ul>\n<p>\u0412 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u0441\u0440\u0435\u0434\u0430\u0445 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 pipeline \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e endpoint, \u0442\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, proxy \u0438 rate limits. \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 mirror \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043b\u0443\u0447\u0448\u0435.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"bash\">DT_API_URL=https:\/\/dependency-track.example.com mvn verify<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e build \u043d\u0435 \u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u043e CVSS:<\/p>\n<pre><code>failBuildOnCVSS = 11<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043d\u0435 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e vulnerabilities \u043d\u0435 \u0432\u0430\u0436\u043d\u044b.<\/p>\n<p>\u042d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0434\u0430\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0438 \u0434\u0430\u043d\u043d\u044b\u0435. Blocking gates \u043b\u0443\u0447\u0448\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435 triage \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 noise reduction.<\/p>\n<h3>SBOM \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 artifact<\/h3>\n<p>SBOM \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0430\u0439\u043b\u043e\u043c \u0440\u0430\u0434\u0438 \u0444\u0430\u0439\u043b\u0430.<\/p>\n<p>\u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u0441\u044f.<\/p>\n<p>\u0414\u043b\u044f single-module \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 extension \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442:<\/p>\n<pre><code>package -&gt; cyclonedx:makeBom<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041e\u0442\u0447\u0435\u0442\u044b:<\/p>\n<pre><code>target\/reports\/cyclonedx<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f:<\/p>\n<pre><code>compile dependenciesruntime dependencies<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0418\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f:<\/p>\n<pre><code>test scopeprovided scopesystem scope<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u043b\u044f multi-module \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 root \u0447\u0430\u0441\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e aggregator. \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c SBOM \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 root \u0431\u044b\u0432\u0430\u0435\u0442 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e.<\/p>\n<p>Extension \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 Spring Boot module \u043f\u043e:<\/p>\n<pre><code>org.springframework.boot:spring-boot-maven-plugin<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442, inject-\u0438\u0442 CycloneDX \u0442\u0443\u0434\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435\u0442, fallback \u043d\u0430 aggregate SBOM \u043d\u0430 root:<\/p>\n<pre><code>package -&gt; cyclonedx:makeAggregateBom<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u042d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u0435\u0435 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 Maven-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432, \u0433\u0434\u0435 deployable artifact \u0436\u0438\u0432\u0435\u0442 \u043d\u0435 \u0432 root.<\/p>\n<h3>Multi-module Maven<\/h3>\n<p>Multi-module Maven \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438.<\/p>\n<p>Extension \u0441\u0447\u0438\u0442\u0430\u0435\u0442 build multi-module, \u043a\u043e\u0433\u0434\u0430 Maven \u0432\u0438\u0434\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0433\u043e project \u0438 <code>secure.forceSimpleMode<\/code> \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d.<\/p>\n<p>Java modules:<\/p>\n<pre><code>jarwar<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c:<\/p>\n<pre><code class=\"xml\">&lt;properties&gt;  &lt;secure.includedModules&gt;api,service&lt;\/secure.includedModules&gt;  &lt;secure.excludedModules&gt;test-fixtures&lt;\/secure.excludedModules&gt;&lt;\/properties&gt;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 multi-module \u0440\u0435\u0436\u0438\u043c\u0435 extension:<\/p>\n<ul>\n<li>\n<p>\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 SonarQube \u043d\u0430 root project;<\/p>\n<\/li>\n<li>\n<p>inject-\u0438\u0442 JaCoCo \u0432 Java-\u043c\u043e\u0434\u0443\u043b\u0438;<\/p>\n<\/li>\n<li>\n<p>\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 module-level SonarQube paths;<\/p>\n<\/li>\n<li>\n<p>inject-\u0438\u0442 aggregate Dependency-Check \u043d\u0430 root;<\/p>\n<\/li>\n<li>\n<p>\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 CycloneDX \u0438\u0437 Spring Boot module, \u0435\u0441\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e;<\/p>\n<\/li>\n<li>\n<p>fallback-\u0438\u0442\u0441\u044f \u043d\u0430 aggregate SBOM, \u0435\u0441\u043b\u0438 deployable module \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u201c\u043c\u044b \u0432\u044b\u0437\u0432\u0430\u043b\u0438 scanner command\u201d \u0438 \u201cbuild \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Maven-\u043f\u0440\u043e\u0435\u043a\u0442\u0430\u201d.<\/p>\n<h3>CI\/CD \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e pipeline \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0449\u0435.<\/p>\n<p>GitLab CI \u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"yaml\">security:maven:  image: eclipse-temurin:17  stage: test  script:    - .\/mvnw -B verify  artifacts:    when: always    expire_in: 7 days    paths:      - target\/reports\/dependency-check\/      - target\/reports\/cyclonedx\/      - \"**\/target\/reports\/dependency-check\/\"      - \"**\/target\/reports\/cyclonedx\/\"      - \"**\/target\/site\/jacoco\/\"<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>SonarQube \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e:<\/p>\n<pre><code class=\"yaml\">sonarqube:maven:  image: eclipse-temurin:17  stage: test  script:    - .\/mvnw -B verify sonar:sonar  rules:    - if: '$SONAR_TOKEN'<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Pipeline \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0447\u0438\u0442\u0430\u0435\u043c\u044b\u043c.<\/p>\n<p>Security wiring \u0436\u0438\u0432\u0435\u0442 \u0432 Maven extension.<\/p>\n<h3>\u0427\u0435\u043c Maven extension \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0442 Gradle plugin<\/h3>\n<p>\u041e\u0431\u0435 \u0438\u0434\u0435\u0438 \u0440\u0435\u0448\u0430\u044e\u0442 \u043e\u0434\u043d\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443: security build drift.<\/p>\n<p>\u041d\u043e build systems \u0440\u0430\u0437\u043d\u044b\u0435.<\/p>\n<p>Gradle task-oriented, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 Gradle plugin \u0434\u0430\u0435\u0442 tasks:<\/p>\n<pre><code>securityAnalyzedependencyCheckAnalyzedependencyCheckAggregatecyclonedxDirectBomsonarsonarHelp<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Maven lifecycle-oriented, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 Maven extension inject-\u0438\u0442 security tooling \u0432 phases:<\/p>\n<pre><code>initializepackageverifysonar:sonar<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u043e\u0440\u043e\u0442\u043a\u043e:<\/p>\n<pre><code>Gradle plugin:  security checks \u043a\u0430\u043a Gradle tasks \u0438 conventionsMaven extension:  \u043e\u0431\u044b\u0447\u043d\u044b\u0435 Maven lifecycle commands \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f security-aware<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0437\u043d\u0430\u044f.<\/p>\n<p>\u0426\u0435\u043b\u044c \u043e\u0434\u043d\u0430: \u043c\u0435\u043d\u044c\u0448\u0435 drift, \u0431\u043e\u043b\u044c\u0448\u0435 repeatability.<\/p>\n<h3>\u0427\u0442\u043e extension \u043d\u0435 \u0440\u0435\u0448\u0430\u0435\u0442<\/h3>\n<p>\u042d\u0442\u043e \u043e\u0434\u0438\u043d build-time \u0441\u043b\u043e\u0439.<\/p>\n<p>\u041e\u043d \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442:<\/p>\n<ul>\n<li>\n<p>\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 vulnerability management;<\/p>\n<\/li>\n<li>\n<p>\u0440\u0443\u0447\u043d\u043e\u0439 triage;<\/p>\n<\/li>\n<li>\n<p>DefectDojo \u0438\u043b\u0438 Dependency-Track;<\/p>\n<\/li>\n<li>\n<p>secret scanning;<\/p>\n<\/li>\n<li>\n<p>DAST;<\/p>\n<\/li>\n<li>\n<p>container scanning;<\/p>\n<\/li>\n<li>\n<p>IaC scanning;<\/p>\n<\/li>\n<li>\n<p>release approval policy.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u043d \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 Maven Java build-time checks:<\/p>\n<pre><code>coverageSonarQube metadataSCA reportsSBOM generationrepeatable lifecycle behavior<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Secret scanning, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043b\u0443\u0447\u0448\u0435 \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u043d\u044c\u0448\u0435: \u0434\u043e commit \u0438 push. \u042d\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043b\u043e\u0439 Secure SDLC.<\/p>\n<h3>\u0418\u0442\u043e\u0433<\/h3>\n<p><code>secure-maven-extension<\/code> \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0437\u0440\u043e\u0437\u043d\u0435\u043d\u043d\u0443\u044e scanner-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0432 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0443\u044e Maven lifecycle convention.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u043b JaCoCo, SonarQube, Dependency-Check \u0438 CycloneDX, extension inject-\u0438\u0442 \u0438\u0445 \u0434\u043e \u0441\u0442\u0430\u0440\u0442\u0430 lifecycle.<\/p>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u044e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<pre><code class=\"bash\">mvn packagemvn verifymvn sonar:sonar<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u043e build \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f security-aware.<\/p>\n<p>\u0418 \u044d\u0442\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435.<\/p>\n<p>\u041d\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d scanner.<\/p>\n<p>\u0410 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 AppSec tools \u043f\u0440\u043e\u0449\u0435 \u0434\u043b\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0433\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0432 Maven-\u043f\u0440\u043e\u0435\u043a\u0442\u044b.<\/p>\n<h3>\u0421\u0441\u044b\u043b\u043a\u0438<\/h3>\n<ul>\n<li>\n<p>Secure Build Maven Extension: <a href=\"https:\/\/github.com\/Niki-1337\/secure-build-maven-extension\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/Niki-1337\/secure-build-maven-extension<\/a><\/p>\n<\/li>\n<li>\n<p>Secure Build Gradle Plugin: <a href=\"https:\/\/github.com\/Niki-1337\/secure-build-gradle-plugin\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/Niki-1337\/secure-build-gradle-plugin<\/a><\/p>\n<\/li>\n<\/ul>\n<h3>\u0427\u0435\u0440\u043d\u043e\u0432\u044b\u0435 \u0445\u0430\u0431\u044b \u0434\u043b\u044f Habr<\/h3>\n<p><code>Java<\/code>, <code>Maven<\/code>, <code>DevOps<\/code>, <code>\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c<\/code>, <code>CI\/CD<\/code><\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1032514\/\">https:\/\/habr.com\/ru\/articles\/1032514\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 Maven core extension, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 Java security checks \u0432 Maven lifecycle, \u0430 \u043d\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c scanner-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u043f\u043e pipeline-\u0444\u0430\u0439\u043b\u0430\u043c.\u0412\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u0435\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0431\u044b\u043b\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e Maven-\u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0435 \u0443\u043c\u0435\u044e\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c security-\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b.\u0423\u043c\u0435\u044e\u0442.\u041c\u043e\u0436\u043d\u043e \u0432 pipeline \u0432\u044b\u0437\u0432\u0430\u0442\u044c tests, Dependency-Check, CycloneDX \u0438 SonarQube. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c plugin blocks \u0432 pom.xml. \u041c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438 \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043e\u043c.\u041a\u0430\u043a\u043e\u0435-\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e \u0434\u0430\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.\u041f\u043e\u0442\u043e\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u044f.\u0412 \u043e\u0434\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u0435 \u0435\u0441\u0442\u044c JaCoCo, \u043d\u043e XML coverage \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432 SonarQube. \u0412 \u0434\u0440\u0443\u0433\u043e\u043c Dependency-Check \u0434\u0435\u043b\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e HTML. \u0412 multi-module \u043f\u0440\u043e\u0435\u043a\u0442\u0435 SBOM \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u0442 root aggregator, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0430\u043c \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f runtime-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c. \u0412 \u0442\u0440\u0435\u0442\u044c\u0435\u043c pipeline \u0437\u0430\u0431\u044b\u043b\u0438 merge request metadata, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 SonarQube analysis \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0448\u0435\u043b, \u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043d\u0435\u043f\u043e\u043b\u043d\u044b\u043c.\u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c security build drift.\u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f. \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043d\u0435\u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c.\u042f \u0441\u0434\u0435\u043b\u0430\u043b secure-maven-extension, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u0434\u043b\u044f Maven-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.\u041d\u0435 \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043a\u0430\u043d\u0435\u0440\u044b.\u0410 \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c Maven lifecycle \u043d\u0435\u0441\u0442\u0438 security workflow.\u041f\u0440\u043e\u0435\u043a\u0442: Secure Build Maven Extension\u041a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f Maven DevSecOps\u0422\u0438\u043f\u0438\u0447\u043d\u044b\u0439 pipeline \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:script:  &#8212; .\/mvnw test  &#8212; .\/mvnw org.owasp:dependency-check-maven:check  &#8212; .\/mvnw org.cyclonedx:cyclonedx-maven-plugin:makeBom  &#8212; .\/mvnw sonar:sonar\u0414\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e.\u041d\u0430 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0435 \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 maintenance pattern, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0438\u043a\u0442\u043e \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u043d\u0435 \u0432\u043b\u0430\u0434\u0435\u0435\u0442.\u0427\u0430\u0441\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0436\u0438\u0432\u0435\u0442 \u0432 CI\/CD. \u0427\u0430\u0441\u0442\u044c \u0432 pom.xml. \u0427\u0430\u0441\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438. \u0427\u0430\u0441\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0443\u0437\u043d\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0430\u0434\u0435\u043d\u0438\u044f pipeline.\u041d\u043e\u0432\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u0437\u0430\u043d\u043e\u0432\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u043d\u0430 \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0432\u043e\u043f\u0440\u043e\u0441\u044b:\u043a\u0430\u043a \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c coverage;\u043a\u0443\u0434\u0430 \u043a\u043b\u0430\u0441\u0442\u044c Dependency-Check reports;\u043a\u0430\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u044b \u043d\u0443\u0436\u043d\u044b security-\u043a\u043e\u043c\u0430\u043d\u0434\u0435;\u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c SonarQube token;\u043a\u0430\u043a \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c branch analysis \u043e\u0442 MR analysis;\u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c SBOM \u0434\u043b\u044f multi-module \u043f\u0440\u043e\u0435\u043a\u0442\u0430;\u043a\u0430\u043a \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u044d\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e.\u0418 \u0432 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u043e: build \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 security-aware. Pipeline \u043f\u0440\u043e\u0441\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u043a\u0430\u043d\u0435\u0440\u044b \u0440\u044f\u0434\u043e\u043c \u0441 build.\u041f\u043e\u0447\u0435\u043c\u0443 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043d\u0435\u0443\u0434\u043e\u0431\u0435\u043dCI\/CD \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u043e\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.\u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0447\u0438\u0441\u0442\u044b\u0439 build, \u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c artifacts, \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c gates, \u0445\u0440\u0430\u043d\u0438\u0442\u044c logs \u0438 \u0434\u0430\u0432\u0430\u0442\u044c auditability.\u041d\u043e \u043a\u043e\u0433\u0434\u0430 CI\/CD \u0435\u0449\u0435 \u0438 \u0432\u043b\u0430\u0434\u0435\u0435\u0442 \u0432\u0441\u0435\u0439 scanner-\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439, \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 custom-\u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0435\u0439.\u0414\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:mvn verify\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442, \u043d\u043e pipeline \u0434\u0435\u043b\u0430\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435:\u0434\u0440\u0443\u0433\u0438\u0435 goals;\u0434\u0440\u0443\u0433\u0438\u0435 properties;\u0434\u0440\u0443\u0433\u0438\u0435 report paths;\u0434\u0440\u0443\u0433\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432;\u0434\u0440\u0443\u0433\u0430\u044f SonarQube metadata.\u0418 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0443\u0436\u0435 \u043d\u0435 \u0434\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443.\u042d\u0442\u0443 \u0434\u044b\u0440\u0443 \u044f \u0438 \u0445\u043e\u0442\u0435\u043b \u0437\u0430\u043a\u0440\u044b\u0442\u044c.Maven \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c\u0438, \u043d\u043e lifecycle \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 AppSec behavior \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u0432 CI\/CD.\u041f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u041a\u043b\u044e\u0447\u0435\u0432\u0430\u044f \u0438\u0434\u0435\u044f:\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c Maven experience \u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c,\u043d\u043e \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u044b\u0435 security conventions \u0432 lifecycle\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0443 \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 security script \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430.CI\/CD \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u043d\u043e\u0432\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c scanner conventions.Security-\u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c, \u0433\u0434\u0435 \u043b\u0435\u0436\u0430\u0442 \u043e\u0442\u0447\u0435\u0442\u044b \u0438 \u043a\u0430\u043a\u0438\u0435 properties \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c.Build \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u043d\u0430\u0442\u044c \u0441\u043a\u0443\u0447\u043d\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0441\u0430\u043c.\u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044d\u0442\u043e Maven core extension, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0435\u0449\u0435 \u043e\u0434\u043d\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0432 pipeline.\u041f\u043e\u0447\u0435\u043c\u0443 Maven core extension\u041e\u0431\u044b\u0447\u043d\u044b\u0439 Maven plugin \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0443\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435.\u042d\u0442\u043e \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u043e copy-paste \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442.Core extension \u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u043d\u043d\u044e\u044e \u0442\u043e\u0447\u043a\u0443 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438.\u041e\u043d \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437:.mvn\/extensions.xml\u041f\u0440\u0438\u043c\u0435\u0440:&lt;extensions&gt;  &lt;extension&gt;    &lt;groupId&gt;io.github.niki1337.securebuild&lt;\/groupId&gt;    &lt;artifactId&gt;secure-maven-extension&lt;\/artifactId&gt;    &lt;version&gt;0.1.0&lt;\/version&gt;  &lt;\/extension&gt;&lt;\/extensions&gt;\u0412\u043d\u0443\u0442\u0440\u0438 extension \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 Maven afterProjectsRead.\u042d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442.\u041d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0434\u0438\u0438 Maven \u0443\u0436\u0435 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b root pom.xml \u0438 module POMs. \u0423\u0436\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b packaging, modules, existing plugins \u0438 properties. \u041d\u043e lifecycle \u0435\u0449\u0435 \u043d\u0435 \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u0430\u043b.\u0422\u043e \u0435\u0441\u0442\u044c extension \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 \u0438 \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 security plugins \u0434\u043e \u0444\u0430\u0437 initialize, package, verify \u0438 sonar:sonar.\u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0434\u043b\u044f conventions.\u0427\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043cExtension \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 Java-\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u0442\u0430\u043a \u0437\u043d\u0430\u044e\u0442:jacoco-maven-plugin \u0434\u043b\u044f coverage;sonar-maven-plugin \u0434\u043b\u044f SonarQube analysis;dependency-check-maven \u0434\u043b\u044f dependency risk reports;cyclonedx-maven-plugin \u0434\u043b\u044f SBOM.\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Maven:mvn packagemvn verifymvn sonar:sonar\u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0442\u0441\u044f security-aware.\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:mvn package\u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c CycloneDX SBOM.mvn verify\u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c tests, JaCoCo coverage \u0438 Dependency-Check.mvn verify sonar:sonar\u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c SonarQube analysis \u0441 branch\/MR metadata, binaries \u0438 coverage paths.\u0418 \u044d\u0442\u043e \u0433\u043b\u0430\u0432\u043d\u043e\u0435: workflow \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a Maven, \u0430 \u043d\u0435 \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u0432, \u043f\u0440\u0438\u043a\u043b\u0435\u0435\u043d\u043d\u044b\u0445 \u0432\u043e\u043a\u0440\u0443\u0433 Maven.\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432\u0420\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0435\u0434\u043a\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e\u0439.\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c -D&#8230;. \u0412 CI\/CD \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0447\u0435\u0440\u0435\u0437 environment variables. \u041a\u0430\u043a\u0438\u0435-\u0442\u043e \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0443\u0434\u043e\u0431\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 pom.xml.Extension \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438:environment variables;Maven user properties;project properties \u0438\u0437 pom.xml;system properties.\u041f\u0440\u0438\u043c\u0435\u0440 project defaults:&lt;properties&gt;  &lt;secure.serviceName&gt;payment-api&lt;\/secure.serviceName&gt;  &lt;sonar.projectKey&gt;payment-api&lt;\/sonar.projectKey&gt;  &lt;sonar.projectName&gt;Payment API&lt;\/sonar.projectName&gt;&lt;\/properties&gt;\u041f\u0440\u0438\u043c\u0435\u0440 CI variables:export SERVICE_NAME=&#187;payment-api&#187;export SONAR_HOST_URL=&#187;https:\/\/sonarqube.example.com&#187;export SONAR_PROJECT_KEY=&#187;payment-api&#187;export SONAR_TOKEN=&#187;token-value&#187;export DT_API_URL=&#187;https:\/\/dependency-track.example.com&#187;\u041f\u0440\u0438\u043c\u0435\u0440 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e override:mvn verify \\  -Dsecure.serviceName=payment-api \\  -Dsonar.projectKey=payment-api\u0421\u043c\u044b\u0441\u043b \u043d\u0435 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0441\u0435\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0441\u0442\u0438\u043b\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.\u0421\u043c\u044b\u0441\u043b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c.Coverage \u0431\u0435\u0437 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u0439 \u043f\u0440\u043e\u0432\u043e\u0434\u043a\u0438Coverage \u0447\u0430\u0441\u0442\u043e \u043b\u043e\u043c\u0430\u0435\u0442 AppSec workflow \u0442\u0438\u0445\u043e.SonarQube \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0431\u0435\u0437 coverage. JaCoCo \u043c\u043e\u0436\u0435\u0442 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442, \u043d\u043e \u0435\u0441\u043b\u0438 XML output \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0438\u043b\u0438 path \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u0432 SonarQube, \u0430\u043d\u0430\u043b\u0438\u0437 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0430\u0431\u0435\u0435.Extension inject-\u0438\u0442 JaCoCo \u0434\u043b\u044f Java jar \u0438 war \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0435\u0441\u043b\u0438 JaCoCo \u0435\u0449\u0435 \u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d.Lifecycle wiring:initialize -&gt; jacoco:prepare-agentverify     -&gt; jacoco:reportXML \u043e\u0442\u0447\u0435\u0442:target\/site\/jacoco\/jacoco.xml\u042d\u0442\u043e\u0442 path \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u0442\u0441\u044f \u0432:sonar.coverage.jacoco.xmlReportPaths\u042d\u0442\u043e \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430.\u041d\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u044b\u0435 \u0434\u0435\u0442\u0430\u043b\u0438 \u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 drift, \u043a\u043e\u0433\u0434\u0430 \u0438\u0445 \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442 \u0440\u0443\u043a\u0430\u043c\u0438.SonarQube: \u0442\u043e\u043a\u0435\u043d\u0430 \u043c\u0430\u043b\u043e\u0427\u0430\u0441\u0442\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430: \u0441\u0447\u0438\u0442\u0430\u0442\u044c, \u0447\u0442\u043e SonarQube setup \u044d\u0442\u043e URL, project key \u0438 token.\u0414\u043b\u044f Java-\u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 analysis \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u0435\u0449\u0435 \u043e\u0442 source paths, test paths, compiled binaries, coverage XML, branch metadata \u0438 merge request metadata.Extension \u0433\u043e\u0442\u043e\u0432\u0438\u0442 properties:sonar.sourcessonar.testssonar.java.binariessonar.java.test.binariessonar.coverage.jacoco.xmlReportPathssonar.exclusionssonar.test.exclusionssonar.cpd.exclusionssonar.coverage.exclusions\u0412 GitLab merge request pipeline \u043e\u043d \u0431\u0435\u0440\u0435\u0442:CI_PIPELINE_SOURCE=merge_request_eventCI_MERGE_REQUEST_IIDCI_MERGE_REQUEST_SOURCE_BRANCH_NAMECI_MERGE_REQUEST_TARGET_BRANCH_NAME\u0418 \u043c\u0430\u043f\u043f\u0438\u0442 \u0432:sonar.pullrequest.keysonar.pullrequest.branchsonar.pullrequest.base\u0414\u043b\u044f branch pipeline \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f:sonar.branch.name\u042d\u0442\u043e \u0440\u043e\u0432\u043d\u043e \u0442\u043e\u0442 \u0442\u0438\u043f \u043b\u043e\u0433\u0438\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0445\u0440\u0443\u043f\u043a\u0438\u043c, \u0435\u0441\u043b\u0438 \u043e\u043d \u0440\u0430\u0437\u043c\u0430\u0437\u0430\u043d \u043f\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u0430\u043c .gitlab-ci.yml.\u0412 core extension \u044d\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438 \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f.Dependency-Check \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435OWASP Dependency-Check inject-\u0438\u0442\u0441\u044f \u0432 Maven lifecycle.\u0414\u043b\u044f single-module \u043f\u0440\u043e\u0435\u043a\u0442\u0430:verify -&gt; dependency-check:check\u0414\u043b\u044f multi-module:verify -&gt; dependency-check:aggregate\u0424\u043e\u0440\u043c\u0430\u0442\u044b \u043e\u0442\u0447\u0435\u0442\u043e\u0432:HTMLJSONSARIFXML\u041f\u0443\u0442\u044c:target\/reports\/dependency-check\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f network-dependent analyzers:RetireJS;Node audit;Node package analyzer;OSS Index;hosted suppressions.\u0412 \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0445 \u0441\u0440\u0435\u0434\u0430\u0445 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u043e.\u0415\u0441\u043b\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 pipeline \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e endpoint, \u0442\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430, proxy \u0438 rate limits. \u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 mirror \u0440\u0435\u0448\u0430\u0435\u0442 \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043b\u0443\u0447\u0448\u0435.\u041f\u0440\u0438\u043c\u0435\u0440:DT_API_URL=https:\/\/dependency-track.example.com mvn verify\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e build \u043d\u0435 \u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u043e CVSS:failBuildOnCVSS = 11\u042d\u0442\u043e \u043d\u0435 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e vulnerabilities \u043d\u0435 \u0432\u0430\u0436\u043d\u044b.\u042d\u0442\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0430\u0434\u0438\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f \u0447\u0430\u0441\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0434\u0430\u0442\u044c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0438 \u0434\u0430\u043d\u043d\u044b\u0435. Blocking gates \u043b\u0443\u0447\u0448\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435 triage \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 noise reduction.SBOM \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 artifactSBOM \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0444\u0430\u0439\u043b\u043e\u043c \u0440\u0430\u0434\u0438 \u0444\u0430\u0439\u043b\u0430.\u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0442\u043e, \u0447\u0442\u043e \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u0441\u044f.\u0414\u043b\u044f single-module \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 extension \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442:package -&gt; cyclonedx:makeBom\u041e\u0442\u0447\u0435\u0442\u044b:target\/reports\/cyclonedx\u0412\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f:compile dependenciesruntime dependencies\u0418\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f:test scopeprovided scopesystem scope\u0414\u043b\u044f multi-module \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 root \u0447\u0430\u0441\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e aggregator. \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c SBOM \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 root \u0431\u044b\u0432\u0430\u0435\u0442 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u043d\u043e.Extension \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 Spring Boot module \u043f\u043e:org.springframework.boot:spring-boot-maven-plugin\u0415\u0441\u043b\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442, inject-\u0438\u0442 CycloneDX \u0442\u0443\u0434\u0430.\u0415\u0441\u043b\u0438 \u043d\u0435\u0442, fallback \u043d\u0430 aggregate SBOM \u043d\u0430 root:package -&gt; cyclonedx:makeAggregateBom\u042d\u0442\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u0435\u0435 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 Maven-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432, \u0433\u0434\u0435 deployable artifact \u0436\u0438\u0432\u0435\u0442 \u043d\u0435 \u0432 root.Multi-module MavenMulti-module Maven \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043b\u043e\u0433\u0438\u043a\u0438.Extension \u0441\u0447\u0438\u0442\u0430\u0435\u0442 build multi-module, \u043a\u043e\u0433\u0434\u0430 Maven \u0432\u0438\u0434\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0434\u043d\u043e\u0433\u043e project \u0438 secure.forceSimpleMode \u043d\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d.Java modules:jarwar\u041c\u043e\u0436\u043d\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c:&lt;properties&gt;  &lt;secure.includedModules&gt;api,service&lt;\/secure.includedModules&gt;  &lt;secure.excludedModules&gt;test-fixtures&lt;\/secure.excludedModules&gt;&lt;\/properties&gt;\u0412 multi-module \u0440\u0435\u0436\u0438\u043c\u0435 extension:\u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 SonarQube \u043d\u0430 root project;inject-\u0438\u0442 JaCoCo \u0432 Java-\u043c\u043e\u0434\u0443\u043b\u0438;\u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 module-level SonarQube paths;inject-\u0438\u0442 aggregate Dependency-Check \u043d\u0430 root;\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 CycloneDX \u0438\u0437 Spring Boot module, \u0435\u0441\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e;fallback-\u0438\u0442\u0441\u044f \u043d\u0430 aggregate SBOM, \u0435\u0441\u043b\u0438 deployable module \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\u042d\u0442\u043e \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u201c\u043c\u044b \u0432\u044b\u0437\u0432\u0430\u043b\u0438 scanner &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-478904","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/478904","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=478904"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/478904\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=478904"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=478904"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=478904"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}