Press "Enter" to skip to content

Installationsanleitung: Automatische Vulnerability Scans mit OWASP ZAP in SonarQube und Jenkins (CI, DevSecOps)

Um die dynamischen Scans von OWASP Zed Attack Proxy (ZAP) in die Build-Pipeline zu integrieren kann das SonarQube ZAP Plugin eingesetzt werden. Der folgenden Beitrag dient als Schritt-für-Schritt Installationsanleitung vom Aufsetzen der VM bis zum fertigen Report.

Passend zu diesem Beitrag auch: Dynamische Analyse mit OWASP ZAP

Übersicht verwendeter Programmversionen

Zur Übersicht werden hier die Versionsnummern der verwendeten Programme aufgelistet.

NameVersion
Oracle VirtualBoxVersion 5.2.20 r125813 (Qt5.6.2)
Ubuntu DesktopUbuntu 18.04.1 LTS
Jenkins Jenkins 2.138.2
SonarQube SonarQube 7.4
OWASP ZAP ZAP 2.7.0

1. Installation Oracle VirtualBox

VirtualBox von der offiziellen Seite für das betreffende Betriebssystem herunterladen[1] und die .exe ausführen.

Die darauffolgenden Dialoge mit den Standardeinstellungen bestätigen und die Installation abschließen.

2. Installation Linux Ubuntu Desktop

Als Betriebssystem wird Linux Ubuntu Desktop in der Version 18.04.1 LTS verwendet. Das .iso „ubuntu-18.04.1-desktop-amd64.iso“ von der offiziellen Seite herunterladen[2]. Der Download dauert mit knapp 2 Gigabyte etwas.

Nach dem Download den Oracle VM Virtual Box Manager öffnen und dort auf „Neu“ klicken. Im sich öffnenden Dialog den Namen der virtuellen Maschine vergeben und bei Typ „Linux“ sowie unter Version „Ubuntu (64-bit)“ wählen.

Abbildung 1: Erstellung neue virtuelle Maschine

Den Dialog mit „Weiter“ bestätigen. Im nächsten Fenster die Speichergröße vergeben, initial wurden 2048 MB verwendet. Nach Bestätigung mit „Weiter“ die Option bei „Platte“ auf „Festplatte erzeugen“ belassen und auf „Erzeugen“ klicken. Als Dateityp der Festplatte VDI (VirtualBox Disk Image) angewählt lassen und auf „Weiter“ gehen. Den Storage on „Physical hard disk“ ebenfalls auf dem voreingestellten Wert „dynamisch alloziert“ belassen. Nach Klick auf „Weiter“ den Festplattenplatz der auf 10 GB eingestellt ist bestätigen und auf „Erzeugen“ klicken. Die VM ist nun erzeugt. Doppelt auf die neu erstellte VM im VirtualBox Manager klicken. Es öffnet sich folgender Dialog:

Abbildung 2: Medium für Start auswählen

Nun den Ablageort des zuvor heruntergeladenen Linux Ubuntu Iso wählen und den Dialog bestätigen. Nun startet die VM mit dem Installationsmenü von Ubuntu Linux

Abbildung 3: Installationsmenü Ubuntu Linux

Die Lokalisierung auf Deutsch einstellen und auf „Ubuntu installieren“ klicken. Bei der Tastaturbelegung ebenfalls „Deutsch“ wählen. Im nächsten Fenster die Option „Normale Installation“ abwählen und „Minimale Installation“ auswählen, die weiteren Felder bleiben wie im Standard vorbelegt. Die Installationsart mit Festplatte löschen und Ubuntu installieren wählen und dies mit „Jetzt installieren“ bestätigen. Die folgenden zwei Dialoge ebenfalls in den Standardeinstellungen belassen und mit „Weiter“ akzeptieren. Nun den Benutzernamen „team01“ und das Passwort „S3curity“ für den User vergeben und die Installation starten.

Abbildung 4: Ubuntu Linux Benutzer

Nach der erfolgreichen Installation muss Ubuntu neu gestartet werden. Dazu Enter betätigen und nach dem Neustart mit dem eben vergebenen User und Passwort anmelden.

3. Installation Jenkins

Als Voraussetzung benötigt Jenkins ab der Version 2.xx zwingend Java 8.
Die Installation erfolgt durch Öffnen des Terminals in Ubuntu und Eingabe des folgenden Kommandos

sudo apt-get install openjdk-8-jdk 

Java 8 wird nun installiert. Nach der Installation mit dem Befehl java -version prüfen ob die Installation erfolgreich war und die Java-Version korrekt ist.

Um die Installation des Jenkins zu starten die folgenden Kommandos ausführen

wget -q -O -https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add
-
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ >
/etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins

Nach der Installation mit dem Befehl sudo service jenkins status prüfen ob die Installation erfolgreich war und der Jenkins als Service aktiv ist (vgl. Abbildung 5).

Abbildung 5: Prüfung Jenkins Service Status

Um den Jenkins nun aufzurufen und die Installation abzuschließen im Browser die URL localhost:8080 aufrufen.

Nach Aufruf der URL erscheint der „Jenkins entsperren“ Dialog. Dieser Dialog stellt sicher, dass Jenkins von einem autorisierten Administrator eingerichtet wurde und erzeugt ein zufällig generiertes Passwort in einer Datei auf dem Server. Über den folgendem Befehl die im Dialog angegebene Datei öffnen:

sudo su
view /var/lib/jenkins/secrets/initalAdminPassword

Das initiale Administrator Passwort kopieren, in den Dialog eingeben und mit „Weiter“ bestätigen. Im nächsten Fenster die Option „Install suggested plugin“ wählen. Nach der Installation der vorgeschlagenen Plugins im nächsten Dialog den Jenkins Admin Benutzer vergeben. Die verwendeten Zugangsdaten für den Jenkins lauten:

  • Benutzer: team01
  • Passwort: S3curity

Danach den folgenden Dialog mit „Start using Jenkins“ bestätigen.

Wenn beim Aufruf von localhost:8080 eine leere Seite geladen wird hilft ein Neustart des Jenkins Service. Dazu wurden folgende Kommandos im Linux Terminal eingegeben:

sudo service jenkins stop
sudo service jenkins start

Nach Eingabe der URL im Browser erscheint nun die Jenkins Anmeldemaske.

Abbildung 6: Jenkins Anmeldemaske

4. Installation SonarQube

Als Voraussetzung benötigt SonarQube ebenfalls Java in der Version 8. Dies wurde bereits vorangegangen installiert.

Die aktuelle SonarQube Version mit dem folgenden Befehl im Linux Terminal herunterladen.

wget
https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.4.zip

Danach die Datei im opt-Verzeichnis entpacken und den Ordner in den Namen sonar umbenennen.

sudo unzip sonarqube-7.4.zip -d /opt
sudo mv /opt/sonarqube-7.4 /opt/sonar

Es wird empfohlen SonarQube im Produktivmodus mit einer der unterstützten Datenbanken zu betreiben. Zu Demonstrationszwecken ist die integrierte H2 Datenbank ausreichend.

Damit SonarQube als Service zur Verfügung steht, muss das folgende Script[3] mit dem Namen sonar unter /etc/init.d/ erstellt werden

#!/bin/sh

#

# rc file for SonarQube

#

# chkconfig: 345 96 10

# description: SonarQube system (www.sonarsource.org)

#

### BEGIN INIT INFO

# Provides: sonar

# Required-Start: $network

# Required-Stop: $network

# Default-Start: 3 4 5

# Default-Stop: 0 1 2 6

# Short-Description: SonarQube system

# Description: SonarQube system

### END INIT INFO


/usr/bin/sonar $*

Danach den Service registrieren damit er beim Booten des Systems automatisch startet

sudo ln -s $SONAR_HOME/bin/linux-x86-64/sonar.sh /usr/bin/sonar
sudo chmod 755 /etc/init.d/sonar
sudo chkconfig --add sonar

Als nächstes via localhost:9000 SonarQube aufrufen. Leider wird nur eine leere Seite angezeigt. Nach Prüfung der Logs von SonarQube unter /opt/sonar/logs/ wurde identifiziert, dass das in SonarQube verwendete ElasticSearch[4] nicht mit Root-Rechten ausgeführt werden darf. Deswegen wurde ein Linux User sonar in einer neuen Benutzergruppe sonar  erstellt. Den SonarQube Dateien wurde der eben erstellte User als neuer Besitzer vergeben.

sudo groupadd sonar
sudo adduser sonar --ingroup sonar
sudo chown -R sonar:sonar /opt/sonar/

Zusätzlich muss in folgender Datei

sudo nano /opt/sonar/bin/linux-x86-64/sonar.sh

der Wert RUN_AS_USER aktiviert werden und hier der eben erstellten User sonar hinterlegt werden.

Nach einem Neustart des SonarQube Service und erneutem Öffnen von localhost:9000 im Browser wird die SonarQube Oberfläche angezeigt.

Die Standardzugangsdaten lauten:

  • Benutzer: admin
  • Passwort: admin
Abbildung 7: SonarQube Startbildschirm

5. Installation SonarQube Jenkins Plugin

Um SonarQube via Jenkins auszuführen, muss im Jenkins Plugin Center das SonarQube Plugin installiert werden. Dazu im Jenkins einloggen und durch Eingabe der folgenden URL zu localhost:8080/pluginManager/available navigieren, dort nach „SonarQube Scanner for Jenkins“ suchen und die aktuelle Version 2.8.1 installieren.

Danach zu localhost:8080/configure navigieren und scrollen zum Absatz „SonarQube servers“ scrollen. Hier werden ein Name und der SonarQube Server-Authentifizierungs-Token abgefragt. Um diese zu bekommen in SonarQube unter localhost:9000 einloggen, in der Headerleiste auf das Benutzericon klicken und die Auswahl „MyAccount“ wählen. Dort den Reiter „Security“ öffnen und unter Tokens einen neuen Token mit dem Namen „team01“ vergeben. Diesen Token mitsamt dem Namen im Jenkins im vorgenannten Bereich „SonarQube servers“ eingeben und speichern.

Abbildung 8: SonarQube Token erstellen

Danach im Jenkins unter localhost:8080/configureTools navigieren und zum Bereich „SonarQube Scanner“ scrollen. Dort einen neuen SonarQube Scanner hinzufügen indem ein beliebiger Name vergeben wird, die Checkbox bei „Install automatically“ aktivieren und in der Selectbox-Auswahl die Version SonarQube Scanner 3.2.0.1227 wählen. Nach dem Speichern kann nun der erste SonarQube Job im Jenkins eingerichtet werden.

6. Konfiguration SonarQube Jenkins Job

Im Jenkins zu localhost:8080 navigieren, anmelden und in der linken Navigation auf „New Item“ klicken. Einen beliebigen Namen vergeben, darunter die Auswahl „Freestyle Project“ wählen und mit „Ok“ bestätigen.

Im Rahmen der Arbeit wird beispielhaft die aktuelle WordPress Version geprüft, im Absatz „Source Code Management“ die Auswahl GIT wählen, als Repository URL https://www.github.com/WordPress/WordPress.git eingeben und bei „Branch Specifier“ den Masterbranch via */master wählen. Alternativ kann man die Einstellung „Source Code Management“ auch deaktiviert lassen, wenn man den Source Code lokal auf der Festplatte prüfen möchte.

Im Bereich „Build“ auf „Add build step“ klicken und „Execute SonarQube Scanner“ wählen. Nun im Feld „Analysis properties“ die folgenden Werte eingeben (vgl. Abbildung 8):

sonar.projectKey=team01
sonar.projectName=Projektarbeit Team01 WordPress Latest
sonar.projectVersion=1.0
sonar.sources=/var/lib/jenkins/workspace/$JOB_NAME/wp-admin/

Erklärung der Werte:

  • sonar.projectKey: Beliebiger Wert. Muss pro Job im Jenkins unterschiedlich sein, damit in SonarQube ein einzelnes Projekt pro Jenkins Job angezeigt wird
  • sonar.projectName: Beliebiger Name
  • sonar.projectVersion: Für unsere Demozwecke immer auf 1.0
  • sonar.sources: Pfad zum Jenkins Workspace des aktuellen Builds zzgl. weiterer Einschränkung des zu prüfenden Codes. In unserem genannten Beispiel wird der WordPress Code innerhalb des Verzeichnisses /wp-admin/ geprüft
Abbildung 9: SonarQube Properties

Den aktuell konfigurierten Job via „Save“ speichern und den Job in der Jobansicht via „Build Now“ ausführen.

Beim ersten Build des Jobs bricht dieser leider mit einem Fehler ab. Die Konsolenausgabe des fehlgeschlagenen Build gibt den Grund „Nicht genügend Hauptspeicher verfügbar“ an. Die VM schließen und via dem Oracle VirtualBox Manager den ihr zugeordneten Arbeitsspeicher auf 5 Gigabyte[5] erhöhen. Den Job im Jenkins erneut via „Build Now“ ausführen.

7. Konfiguration Official OWASP Zed Attack Proxy Jenkins Plugin

Im Gegensatz zu den zuvor installierten Tools, kann OWASP ZAP direkt im Jenkins konfiguriert und installiert werden. Dazu im Jenkins einloggen und zu localhost:8080/pluginManager/available navigieren. Dort nach den Plugins „Custom Tools“ und „Official OWASP ZAP“ suchen, diese installieren und den Jenkins neustarten.

Zu localhost:8080/configureTools/ navigieren und im Bereich „Custom tool“ den Button „Custom tool hinzufügen“ betätigen.

Als Name „ZAP_2.7.0“ wählen. Die Checkbox bei „Automatisch installieren“ muss aktiv sein. Als Download-URL des Archivs „Binärdatei“ die folgende URL  eingeben https://github.com/zaproxy/zaproxy/releases/download/2.7.0/ZAP_2.7.0_Linux.tar.gz. Als Unterverzeichnis des entpackten Archivs geben wir ZAP_2.7.0 an.

Abbildung 10: Jenkins Konfiguration

Nun einen neuen Job anlegen. Dazu im Jenkins zur Startseite via localhost:8080 navigieren und in der linken Navigation auf „New Item“ klicken. Einen beliebigen Namen vergeben, darunter die Auswahl „Freestyle Project“ wählen und mit „Ok“ bestätigen.

In der Jobkonfiguration im Bereich „Buildverfahren“ via „Build-Schritt hinzufügen“ das Modul „Execute ZAP“ auswählen. Im Bereich „Installation Method“, falls nicht vorausgewählt, unter „Custom Tools Installation“ den eben via den Custom Tools installierten ZAP_2.7.0 auswählen. Im Bereich „ZAP Home Directory“ muss unter „Path“ der Wert ~/.ZAP eingetragen werden. Bei Session Management die Option „Persist Session“ wählen und einen frei wählbaren Namen vergeben. Im Bereich „Session Properties“ als Context Name “Team01_Projektarbeit_${BUILD_ID}” angeben. Unter „Include Context“ wird die URL angegeben, die geprüft werden soll. Im Rahmen dieser Arbeit prüfen wir die URL https://www.hs-aalen.de. Im Bereich „Attack Mode“ unter „Starting Point“ erneut die URL https://www.hs-aalen.de eingeben, die Option Spider Scan aktivieren und prüfen ob die Option “Recurse” gesetzt ist. Als letztes im Bereich „Finalize Run“ die Box „Generate Reports“ wählen und bei der Option „Generate Report“ das Format xml und html aktivieren.

Damit nach der Durchführung des Builds die Ergebnisse im Build angezeigt werden muss zuvor auf bekanntem Weg im Jenkins das Plugin „HTML Publisher“ installiert werden. Nun kann im Job im Bereich „Post-Build-Aktionen“ das Modul „Publish HTML Reports“ hinzugefügt werden und dort auf den eben im Build erstellten HTML Report verwiesen werden. Alle vorgenommenen Einstellungen via „Speichern“ am Seitenende speichern und den Build durch einen Klick auf „Build Now“ starten. Nach erfolgreichem Durchlauf des Builds sind die Ergebnisse via Klick auf „Latest Report“ sichtbar.

ZAP Scanning Report

[1] https://www.virtualbox.org/wiki/Downloads

[2] https://www.ubuntu.com/download/desktop/thank-you?country=DE&version=18.04.1&architecture=amd64

[3] https://docs.sonarqube.org/latest/setup/operate-server/

[4] https://www.elastic.co/

[5] https://docs.sonarqube.org/latest/requirements/requirements/

Leave a Reply

Your email address will not be published. Required fields are marked *