DrĂŒcke "Enter", um den Text zu ĂŒberspringen.

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/

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.