Neuigkeiten von trion.
Immer gut informiert.

Sicherheitsprüfung von Maven-Abhängigkeiten mit dem OWASP Dependency-Check

GitLab

Im heutigen Software-Entwicklungsalltag ist Security ein entscheidendes Thema. Moderne Java-Anwendungen bestehen zu einem erheblichen Teil aus Fremdbibliotheken. Diese sollten regelmäßig auf den neusten Stand gebracht werden, auch um möglichen Sicherheitslücken entgegenzuwirken.

Wie im Vorgängerartikel Build-Warnungen bei Dependency-Updates beschrieben, machen externe Abhängigkeiten oft über 90% des Codes in Microservices aus. Neben der Aktualität der Bibliotheken ist es besonders wichtig, bekannte Sicherheitslücken (CVEs) zu erkennen und rechtzeitig Gegenmaßnahmen einzuleiten.

Das OWASP Dependency-Check-Maven-Plugin bietet eine praktische Lösung, um aus dem Build-Prozess heraus auf mögliche Sicherheitslücken in Abhängigkeiten aufmerksam zu machen. Im Folgenden stelle ich vor, wie sich das Plugin in eine Spring-Boot-Anwendung sowie eine GitLab CI-Pipeline integrieren lässt.

Das Dependency-Check-Maven-Plugin der Open Web Application Security Foundation (OWASP) scannt alle verwendeten Abhängigkeiten gegen die National Vulnerability Database (NVD) und andere Datenquellen und identifiziert bekannte Sicherheitslücken. Dabei werden nicht nur direkte, sondern auch transitive Abhängigkeiten berücksichtigt.

Über NVD API werden Infos über bekannte Sicherheitslücken kostenlos zur Verfügung gestellt. Jedoch ist die API mit recht strengen Rate-Limits belegt. Gerade der initiale Download kann dadurch sehr viel Zeit in Anspruch nehmen. Daher ist es zu empfehlen, sich einen API-Key zu beschaffen. Dieser kann ebenfalls kostenlos hier beantragt werden.

Einrichtung des OWASP Dependency-Check-Plugins

Das Plugin lässt sich einfach in die pom.xml eurer Anwendung einbinden. Hier ein Beispiel, wie das aussehen könnte:

Ausschnitt aus einer pom.xml mit konfiguriertem Dependency-Check-Plugin
<!-- ... -->
<build>
    <plugins>
        <!-- ... -->
        <plugin>
            <groupId>org.owasp</groupId>
            <artifactId>dependency-check-maven</artifactId>
            <version>12.1.1</version>
            <configuration>
                <nvdApiKey>YOUR_NVD_API_KEY</nvdApiKey>
                <formats>
                    <format>HTML</format>
                    <format>GITLAB</format>
                </formats>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>check</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Mit dieser Konfiguration wird der Dependency-Check als Build-Plugin registriert und während der verify Phase ausgeführt. Im optionalen configuration Block wird zudem der API-Key gesetzt und HTML sowie GitLab-Dependency-Scanning als Report-Formate festgelegt.

Alternativ kann das Ganze auch als Plugin im <reporting> Bereich der pom.xml konfiguriert werden. Dann wird es beim site Goal ausgeführt.

Soll das Plugin nur laufen, wenn es explizit gefordert ist, kann die <executions> Konfiguration entfallen. Eine Überprüfung kann dann mit mvn dependency-check:aggregate gestartet werden. Diese Variante nutzen wir anschließend in der GitLab CI Pipeline.

Neben den bisher beschriebenen Konfigurationen kann aber noch eine ganze Menge mehr eingestellt werden. Die vollständigen Optionen sind hier beschrieben: Dependency Check Configuration.

Dependency-Check-Plugin in GitLab CI

In der Praxis hat es sich bewährt das Plugin regelmäßig in der Build-Pipeline auszuführen. So bekommen Entwickler schnell Feedback zu neuen Projektabhängigkeiten oder gefundenen Schwachstellen.

Der folgende Code-Ausschnitt zeigt daher, wie das Plugin in eine GitLab CI Pipeline eingebunden werden kann.

GitLab CI Pipeline Schritt zum Aufrufen des Dependency-Check-Plugins
check-owasp:
  stage: build
  image: $BUILDER_IMAGE
  script:
    - ./mvnw dependency-check:aggregate $MAVEN_CLI_OPTS
  cache:
    key: $CI_PROJECT_NAME-dependency-check
    paths:
      - /path/to/dependency-check-data
  artifacts:
    paths:
      - target/dependency-check-report.html
    reports:
      dependency_scanning:
        - target/dependency-check-gitlab.json

Für die Konfiguration in einer Pipeline gibt es zusätzlich einige Dinge zu beachten.

Damit die Daten der NVD nicht für jeden Build vollständig geladen werden, müssen diese sinnvoll gecacht werden. Das Plugin legt seine Daten standardmäßig im Verzeichnis dependency-check-data im Maven Repository ab. Also zum Beispiel unter ~/.m2/repository/org/owasp/dependency-check-data.

Damit die erzeugten Reports abgerufen werden können, empfiehlt es sich zudem, diese als Artefakte/Reports zu sichern.

Eine Build-Ausgabe, bei der zwei bekannte Schwachstellen identifiziert wurden, sieht beispielsweise wie folgt aus.

gitlab security
Abbildung 1. Security Report in GitLab

Fazit

Das Dependency-Check-Plugin hilft dabei, die Aufmerksamkeit auf Sicherheitslücken in der eigenen Anwendung zu lenken. Mit überschaubarem Aufwand lässt sich so kontinuierlich der Sicherheitsstatus überwachen.



Zu den Themen Java, Spring Boot und Spring Security bieten wir sowohl Beratung, Entwicklungsunterstützung als auch passende Schulungen an:

Auch für Ihren individuellen Bedarf können wir Workshops und Schulungen anbieten. Sprechen Sie uns gerne an.

Feedback oder Fragen zu einem Artikel - per Twitter @triondevelop oder E-Mail freuen wir uns auf eine Kontaktaufnahme!

Los geht's!

Bitte teilen Sie uns mit, wie wir Sie am besten erreichen können.