可確保專案的質量和安全性的三個Maven外掛 - rieckpil

banq發表於2019-11-07

檢測依賴項內部的漏洞對於建立安全的應用程式至關重要。除此之外,靜態程式碼分析工具和預定義規則可以幫助您確保質量。幸運的是,有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相關的部落格文章。


 

相關文章