可確保專案的質量和安全性的三個Maven外掛 - rieckpil
檢測依賴項內部的漏洞對於建立安全的應用程式至關重要。除此之外,靜態程式碼分析工具和預定義規則可以幫助您確保質量。幸運的是,有Maven外掛可用於在您的構建中自動執行此操作。透過此部落格文章,我將向您展示我的前三個Maven外掛,以確保質量和安全性。
為了檢視這三個Maven外掛的實際使用,我使用Java 11和以下依賴項建立了一個Spring Boot Maven專案:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>de.rieckpil.blog</groupId> <artifactId>maven-plugins-to-ensure-quality</artifactId> <version>0.0.1-SNAPSHOT</version> <name>maven-plugins-to-ensure-quality</name> <properties> <java.version>11</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project> |
除了用於啟動Spring Boot應用程式的標準Java類之外,我還新增了第二個類來讀取檔案並在啟動時列印輸出:
@Component public class BadPracticeFileReader implements CommandLineRunner { @Override public void run(String... args) throws Exception { InputStream in = this.getClass().getResourceAsStream("/message.txt"); byte[] allBytes = in.readAllBytes(); System.out.println(new String(allBytes)); } } |
Maven Enforcer外掛
Maven的強制實施的外掛檢查幾個預定義的規則像在構建期間檢查Java,Maven或OS版本一樣簡單(在此處查詢所有規則的列表)。同樣,您可以使用此外掛將專案中禁止的一組依賴項列入黑名單。一個很好的用例是在從JUnit 4過渡到JUnit 5之後。一旦所有測試都使用JUnit 5,就可以排除JUnit 4依賴關係並建立一條規則,這樣其他隊友就不會再因意外而包含它。
接下來,您可以使用dependencyConvergenceMaven Enforcer外掛中的規則來確保專案中只有一個版本的依賴項可用。一旦您的專案擴充套件幷包含更多的依賴項,例如,在引入不同版本的Jackson時可能會有兩個依賴項。這可能是一個問題,因為預設的類載入器只會在它可以找到的類路徑上選擇第一個。
為了檢測這種情況,該dependencyConvergence規則將失敗,並顯示適當的控制檯輸出。然後,您可以透過將依賴項版本固定在dependencyManagement或從一個依賴項中排除它來解決此問題。
您可以像下面這樣將該外掛包含到您的專案中:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <configuration> <rules> <bannedDependencies> <excludes> <exclude>junit:junit</exclude> <exclude>junit:junit-dep</exclude> </excludes> </bannedDependencies> <dependencyConvergence /> </rules> </configuration> <executions> <execution> <goals> <goal>enforce</goal> </goals> </execution> </executions> </plugin> |
一旦執行mvn verify或mvn enforcer:enforce檢查配置的規則。
OWASP依賴性檢查以確保依賴性質量
您新增到專案中的依賴項越多,您越有可能必須處理常見漏洞和披露(CVE)。手動檢查CVE資料庫是否有新問題很麻煩。幸運的是,有一個免費的Maven外掛可以在構建期間執行此操作:OWASP Dependency-Check Maven外掛。此外掛會分析您的所有依賴關係,並且一旦其中一個依賴關係成為CVE的一部分,就會使構建失敗(如果已配置)或產生日誌警告。
請注意,這些漏洞是從NIST託管的國家漏洞資料庫(NVD)中下載的:https://nvd.nist.gov。第一次執行可能需要花費幾分鐘,如果您打算使用它,則一定要為CI / CD管道啟用快取。過去,我們還觀察到了該託管漏洞資料庫的一些停機時間。在這種情況下,我們將外掛配置為不會使構建失敗。
此外,可能僅針對特定的依賴項設定或作業系統會發生漏洞。為了消除這種假陽性,可以將owasp-suppressions.xml檔案新增到專案中,並排除以下CVE:
<?xml version="1.0" encoding="UTF-8"?> <suppressions xmlns="https://jeremylong.github.io/DependencyCheck/dependency-suppression.1.2.xsd"> <!-- example to suppress a false warning <suppress> <notes><![CDATA[ Suppress all dependencies for CVE-2018-1258 (https://pivotal.io/security/cve-2018-1258) ]]></notes> <cve>CVE-2018-1258</cve> </suppress> --> </suppressions> |
包括外掛如下所示:
<plugin> <groupId>org.owasp</groupId> <artifactId>dependency-check-maven</artifactId> <version>5.2.2</version> <configuration> <suppressionFiles> <suppressionFile>owasp-suppressions.xml</suppressionFile> </suppressionFiles> <failBuildOnCVSS>8</failBuildOnCVSS> <assemblyAnalyzerEnabled>false</assemblyAnalyzerEnabled> <failOnError>true</failOnError> </configuration> <executions> <execution> <goals> <goal>check</goal> </goals> </execution> </executions> </plugin> |
使用failBuildOnCVSS配置值,您可以指定使構建失敗的CVE的嚴重性。分數範圍從0到10。
一旦執行mvn verify或對mvn depencency-check:check您的依賴關係進行了分析。
SpotBugs Maven外掛可確保程式碼質量
擁有靜態程式碼分析工具可能有助於修復潛在的錯誤。除了SonarQube,還有一個流行的Maven外掛,不需要進一步設定:SpotBugs Maven外掛(以前稱為FindBugs)。
從個人經驗來看,我不會因為靜態程式碼分析工具而使構建失敗。寧時不時檢查可能的警告並修復最明顯的警告。
您可以使用以下配置包括此Maven外掛:
<plugin> <groupId>com.github.spotbugs</groupId> <artifactId>spotbugs-maven-plugin</artifactId> <version>3.1.12.2</version> <dependencies> <dependency> <groupId>com.github.spotbugs</groupId> <artifactId>spotbugs</artifactId> <version>4.0.0-beta4</version> </dependency> </dependencies> </plugin> |
現在,您可以執行 mvn spotbugs:check以分析您的原始碼。此外,您可以啟動一個簡單的UI來分析潛在的程式碼分析警告mvn spotbugs:gui。
在我們的示例中,SpotBugs抱怨BadPracticeFileReader該類的實現。當我們在位元組陣列之外建立String時使用預設編碼時,它檢測到三個潛在的錯誤,並且沒有正確清理開啟的資源。
您可以在GitHub上找到此部落格文章的原始碼。在此處查詢其他與Maven相關的部落格文章。
相關文章
- 用“質量門”確保專案質量(轉)
- Maven2 用於度量和品質保證的外掛Maven
- nukkit maven 專案除錯外掛Maven除錯
- 【Maven實戰技巧】「外掛使用專題」Maven-Archetype外掛建立自定義maven專案骨架Maven
- 軟體專案管理的質量保證(轉)專案管理
- 專案管理: 軟體質量的可靠保證(轉)專案管理
- 專案管理: 軟體質量的可靠保證2(轉)專案管理
- 專案管理: 軟體質量的可靠保證3(轉)專案管理
- 專案中對外暴露的http介面的安全性如何保證HTTP
- Maven的常用外掛Maven
- 質量控制和質量保證的區別
- MybatisGenerator的Maven外掛配置MyBatisMaven
- Maven 外掛Maven
- 怎樣確保專案評估的精確 (轉)
- Maven生命週期和外掛Maven
- Maven自定義繫結外掛目標:建立專案的原始碼jarMaven原始碼JAR
- 保護隱私的3個火狐外掛
- 軟體專案質量保證:編碼規範
- 牽引力教育360度確保就業質量就業
- 【Maven實戰技巧】「外掛使用專題」Maven-Assembly外掛實現自定義打包Maven
- Flutter進階 | Flutter 優質練手專案以及優質外掛Flutter
- 專案開發中質量和速度哪個更重要?
- Maven--外掛Maven
- maven外掛配置Maven
- 探究如何在專案管理中使用質量保證(QA)?專案管理
- 確保應用程式安全性
- 解決專案版本衝突——maven-shade外掛使用Maven
- Maven-Maven整合的tomcat7外掛MavenTomcat
- 專案質量管理
- maven的外掛才是真正的執行者Maven
- PMD外掛:你必須掌握的程式碼質量工具!
- [譯] 5個Vuex外掛,給你的下個VueJS專案VueJS
- [Maven]mvn單獨執行某一個外掛的goalMavenGo
- Maven配置 Jetty 外掛MavenJetty
- maven Multiple sourceDirectory外掛Maven
- 為你下一個專案準備的50個Bootstrap外掛(上)boot
- 為你下一個專案準備的50個Bootstrap外掛(下)boot
- 質量體系--最終檢驗和試驗的質量保證模式(轉載)模式