Konfigurieren von ZAP-Scans

Zed Attack Proxy (ZAP) ist ein kostenloses und quelloffenes Tool für Penetrationstests (PEN), das unter dem Dach von OWASP gepflegt wird.ZAP ist ein "Man-in-the-Middle"-Proxy, der zwischen dem Webbrowser des Testers und einem Webserver sitzt. ZAP fängt Pakete ab, ändert den Inhalt bei Bedarf und leitet diese Pakete an den Webserver weiter.

ZAP scannt die Ausführung

Sie können ein spezielles Skript zum Starten von ZAP-Scans erstellen, z. B. trigger_zap_scans in Ihrem Anwendungs-Repository, an einem Ort Ihrer Wahl, z. B. in einem Verzeichnis scripts, und dieses Skript in der Phase dynamic-scan der Datei pipeline-config aufrufen.

Sie können die Skriptdatei trigger_zap_scans anpassen, um den richtigen Zap-Scan (api oder ui) aufzurufen, wie hier beschrieben, und sich auf das gemeinsame Skript zur Ausführung von Zap-Scans verlassen, um einen ZAP-Scan (ui oder api) auszuführen, um Penetrationstests für Ihre laufende Anwendung durchzuführen.

Eine andere Möglichkeit besteht darin, zap-Scans in einer Sub-Pipeline auszuführen, wie sie in der Referenzimplementierung definiert ist, siehe hello-compliance-app.

Mit dieser Konfiguration in der Pipeline-Konfigurationsdatei ruft die Stufe dynamic-scan das Skript trigger-async-zap.sh auf, um die Stufe owasp-zap auszulösen und das Scannen des Zed Attack Proxy (ZAP)-Tools in einer speziellen Sub-Pipeline zu initiieren. Es verlässt sich auch auf das Skript Common zap scan execution, um einen ZAP-Scan (ui oder api) auszuführen, um Penetrationstests für Ihre laufende Anwendung durchzuführen.

Verfügbare Parameter für ZAP-Scans

Sie können die folgenden Parameter einstellen und anpassen, um ZAP-Scans für die Durchführung von Penetrationstests für Ihre laufende Anwendung zu konfigurieren.

Konfigurationsparameter für den ZAP-Scan
Name Typ Beschreibung Erforderlich oder optional
cluster-name Zeichenfolge Der Name des Clusters, in dem der zap-Scanner bereitgestellt und ausgeführt werden soll, wenn er nicht in DinD läuft. Erforderlich, wenn es nicht in DinD, läuft, d.h. zap-dind ist auf false eingestellt.
ibmcloud-api Zeichenfolge Gibt die Cloud-Umgebung für den ZAP-Cluster an. Der Standardwert ist https://cloud.ibm.com Erforderlich, wenn es nicht in DinD, läuft, d.h. zap-dind ist auf false eingestellt.
ibmcloud-api-key Zeichenfolge API-Schlüssel, um ZAP in einem Cluster einzusetzen. Erforderlich, wenn es nicht in DinD, läuft, d.h. zap-dind ist auf false eingestellt.
iam-token-endpoint Zeichenfolge Der Endpunkt zum Abrufen des Tokens für die IAM-Authentifizierung. Der Standardwert ist https://iam.cloud.ibm.com/identity/token Fakultativ, aber wenn angegeben, muss auch target-api-key angegeben werden.
target-api-key Zeichenfolge API-Schlüssel für die IAM-Authentifizierung. Fakultativ, aber wenn angegeben, muss auch iam-token-endpoint angegeben werden.
target-application-server-url Zeichenfolge Die Basis URL des Anwendungsservers, den zap scannen soll. Sie kann dieselbe sein wie die URL der bereitgestellten Anwendung. Erforderlich
filter-options Zeichenfolge Stellen Sie es so ein, dass Alarme nach Schweregrad gefiltert werden. Mögliche Werte: Critical, High, Medium, Low, Informational. Der Standardwert ist Informational, kann eine durch Komma getrennte Liste sein. Optionale
zap-custom-api-policy-file-path Zeichenfolge Relativer Pfad im Repository zu der benutzerdefinierten Richtliniendatei (XML-Format) für ZAP-API-Scans. Wenn dies nicht festgelegt ist, wird die Standardrichtlinie API-Minimal.policy verwendet. Optionale
zap-custom-ui-policy-file-path Zeichenfolge Relativer Pfad im Repository für die benutzerdefinierte Richtliniendatei (XML-Format), die bei ZAP UI-Scans verwendet wird. Wenn dieser Pfad nicht angegeben ist, wird die Standardrichtlinie default.policy verwendet. Optionale
zap-ui-scan Zeichenfolge Flagge zur Bestimmung, ob es sich um einen UI-Scan oder einen API-Scan handelt. Mögliche Werte: true, false. Wenn Sie dieses Flag auf true setzen, wird der UI-Scan ausgeführt, wenn Sie es auf false setzen, wird der API-Scan ausgeführt. Dieser Parameter funktioniert mit den Parametern opt-in-dynamic-api-scan und opt-in-dynamic-ui-scan. Erforderlich
zap_dind Zeichenfolge Flagge, um zwischen der Bereitstellung von ZAP in einem Cluster und der Ausführung von DinD zu wechseln. Standardwert: true. Mögliche Werte: true, false. Mit dem Wert true wird ZAP als DinD, ausgeführt. Mit dem Wert false wird ZAP in einem Cluster eingesetzt, für den cluster-name, ibmcloud-api und ibmcloud-api-key festgelegt werden müssen. Optionale
zap-dind-localhost Zeichenfolge Hostname für ZAP-Scanner bei Ausführung in DinD, Standard: localhost. Optionale
zap-namespace Zeichenfolge Namespace für die Bereitstellung von ZAP-API und UI-Scannern im Cluster, Standard: zap. Optional für den Betrieb von ZAP in einem Cluster, Not required für den Betrieb von ZAP in DinD.
zap-polling-interval Zeichenfolge Intervall, in dem die Scanner ZAP für den Abschluss des Scanvorgangs abfragen, Standardwert: 120s. Optionale
zap-artifact Zeichenfolge Der Asset-Schlüssel für das Artefakt, das zap-gescannt werden soll und für das collect-evidence aufgerufen werden soll. Der Standardwert ist app-image. Optionale
zap_evidence_type Zeichenfolge Der Evidenztyp für die Evidenzerfassung für von ZAP durchgeführte Scans, Standard: com.ibm.dynamic_scan. Optionale
show-container-log Zeichenfolge Flagge zum Aktivieren oder Deaktivieren der Containerprotokollierung für die ZAP-Scanner, wenn sie unter DinD, ausgeführt werden Standard: false. Optionale
show-zap-log Zeichenfolge Flagge zum Aktivieren oder Deaktivieren der ZAP-Server-Protokollierungsfunktion, Standardwert: false. Optionale

Konfigurieren von ZAP-API-Scans

In Ihrem Anwendungs-Repository muss mindestens eine API-Definitionsdatei im Format json vorhanden sein. Diese API-Definitionsdatei muss eine gültige swagger oder openapi Definition sein. Diese Dateien können sich an einem beliebigen Ort innerhalb des Anwendungs-Repositorys befinden, z. B. in einem Verzeichnis definitions. Der Übersichtlichkeit halber werden diese Dateien wie folgt bezeichnet: definitions1.json, definitions2.json, und so weiter.

ZAP-API-Konfigurationsparameter
Name Typ Beschreibung Erforderlich oder optional
zap-api-custom-script Zeichenfolge Pfad zu der Datei, die die Logik zur Umwandlung der Anfrage enthält, bevor der ZAP-API-Scan eingeleitet wird. Erforderlich
swagger-definition-files Zeichenfolge Pfad zu den Dateien, die die Swagger-Definitionen enthalten. Kann eine kommagetrennte Liste sein. Erforderlich
zap-api-port Zeichenfolge Port, an dem der ZAP-API-Scanner ausgeführt wird, wenn er in einem Cluster eingesetzt wird, Standard: 9086. Optionale
zap_api_deployment_name Zeichenfolge Name des ZAP-API-Scanner-Einsatzes, Standard: zap-api-deployment. Optionale
zap-api-image Zeichenfolge Setzen Sie diesen Parameter, um ein benutzerdefiniertes ZAP API Scanner-Bild zu verwenden. Andernfalls wird der Standardwert IBM verwendet. Optionale
flatten-zap-api-scan-report Zeichenfolge Setzen Sie diesen Parameter auf true, um die ZAP-API-Scanergebnisse in einer einzigen html- und json-Datei zusammenzufassen. Standard false. Optionale

Erstellen Sie eine Datei custom-api-script innerhalb Ihres Anwendungs-Repositorys, an einem Ort Ihrer Wahl, z. B. im Verzeichnis scripts/zap-custom-scripts. Diese Datei kann auch anders benannt werden, und der Pfad zu dieser Datei muss mit dem Parameter zap-api-custom-script angegeben werden.

Verwenden Sie die Datei custom-api-script, um die Anfrage zu ändern, die an den ZAP-Scanner geht. Die Parameter, die in der Nutzlast der Anfrage verwendet werden können, sind folgende

Parameter in der Nutzlast der Anfrage
Name Typ Beschreibung Erforderlich oder optional
excludeScanTypes Array Liste der Scans, die der Benutzer ausschließen möchte. Vollständige Liste der Scans zur Auswahl: CRLF_Injection,Buffer_Overflow, Directory_Browsing, External_Redirect, Format_String_Error, Parameter_Tampering, Remote_File_Inclusion, Script_Active_Scan, Server_Side_Code_Injection, Server_Side_Include, SQL_Injection, Xpath_Injection, XXE_External_Entity, SOAP_Action_Spoofing, SOAP_XML_Injection, Relative_Path_Confusion, Remote_OS_Command_Injection, ElmahScanRule und, HtAccessScanRule. Optionale
apisToScan Array Liste der zu scannenden APIs mit den erforderlichen Parametern. Wenn "apisToScan": ["all"] erwähnt wird, werden alle in der Swagger-Definition genannten APIs mit Mock-Daten nach obligatorischen Parametern/Body durchsucht. Um dieses Array so anzupassen, dass nur bestimmte APIs gescannt werden, verwenden Sie diese Unterstruktur apisToScan: [ { "path": "/path/to/endpoint", method: "get" } ]. Erforderlich
globalExcludeUrls Array Array von URL regexes, um ZAP anzuweisen, nicht nach diesen Routen zu suchen. Beispiel: "globalExcludeUrls": [ "^http://foo.bar$", "^http://john.doe$" ]. Optionale
authenticationType Zeichenfolge Authentifizierungsmechanismus für Anfrage-Header. Unterstützte Authentifizierungsmechanismen sind Bearer, Basic oder ApiKey. Optionale
apiKey Zeichenfolge Wenn authenticationType nicht gesendet wird, wird dieser API-Schlüssel für die IAM-Authentifizierung verwendet, die im Authorization-Header für alle Anfragen gesendet wird. Wenn authenticationType auf Bearer gesetzt ist, wird die Kopfzeile Authorization: Bearer <apiKey> gebildet. Wenn authenticationType auf ApiKey gesetzt ist, wird die Kopfzeile Authorization: <apiKey> gebildet. Das Feld wird bei authenticationType als Basic ignoriert. Optionale
username Zeichenfolge Für authenticationType Basic zu verwendender Benutzername. Erforderlich, wenn authenticationType als Basic
password Zeichenfolge Passwort für authenticationType Basic. Erforderlich, wenn authenticationType als Basic

Bei sensiblen Informationen wie Anmeldedaten müssen Sie diese Werte aus einem Tresor oder einem geheimen Speicher lesen.

Konfigurieren der ZAP UI-Scans

Setzen Sie den Parameter zap-ui-scan auf true, damit der ZAP UI-Scan ausgeführt werden kann.

Die folgenden Parameter sind für die Konfiguration von ZAP UI-Scans erforderlich.

ZAP UI Konfigurationsparameter
Name Typ Beschreibung Erforderlich oder optional
zap-ui-custom-script Zeichenfolge Pfad zu der Datei, die die Änderungslogik für die UI-Scan-Nutzlast enthält, falls erforderlich, bevor der ZAP-UI-Scan eingeleitet wird. Optionale
zap-ui-script-directory Zeichenfolge Pfad zu dem Verzeichnis, das die UI-Tests und die für die Durchführung des UI-Scans erforderlichen Dateien enthält. Erforderlich
context-file Zeichenfolge Pfad zu einer benutzerdefinierten Kontextdatei für UI-Scans, die ZAP zur Verfügung gestellt wird. Optionale
zap-ui-auth-user Zeichenfolge Benutzername, der für die Autorisierung und Ausführung von zap ui scan verwendet werden soll. Dazu muss context-file angegeben werden, das auch Informationen über die Art der Authentifizierung dieses Benutzers enthalten sollte. Optionale
zap-ui-port Zeichenfolge Port für die Ausführung des ZAP UI-Scanners beim Einsatz in einem Cluster, Standard: 9085. Optionale
zap_ui_deployment_name Zeichenfolge Name des ZAP UI Scanner-Einsatzes, Standard: zap-ui-deployment. Optionale
zap-proxy-service Zeichenfolge Name für den vom UI-Scanner benötigten ZAP-Proxy-Dienst, Standard: zap-proxy-service. Optionale
zap-ui-image Zeichenfolge Setzen Sie diesen Parameter, um ein benutzerdefiniertes ZAP UI Scanner-Bild zu verwenden. Andernfalls wird der Standardwert IBM verwendet. Optionale
zap-proxy-image Zeichenfolge Legen Sie dies fest, um ein benutzerdefiniertes ZAP-Proxy-Bild zu verwenden. Andernfalls wird der Standardwert IBM verwendet. Optionale

Erstellen Sie einen Ordner uiscripts innerhalb des Verzeichnisses scripts/zap in Ihrem Anwendungs-Repository. Setzen Sie diesen Ordnerpfad auch gegen zap-ui-script-directory in der Datei trigger_zap_scans. Dieser Ordner kann auch an einem anderen Ort angelegt werden. Der Pfad sollte für zap-ui-script-directory angepasst werden.

Legen Sie eine Datei run.sh im Verzeichnis uiscripts an. run.sh steuert die UI-Tests. Wir können Protractor-basierte Tests oder jedes andere geeignete Framework konfigurieren.

Erstellen Sie eine Datei export.sh im Verzeichnis uiscripts. Diese Datei enthält alle verschiedenen Umgebungsvariablen, die für die Verwendung des Test-Frameworks erforderlich sind. Setzen Sie diese Umgebungswerte, indem Sie export <VARIABLE_NAME>=<VALUE> hinzufügen.

Um alle Konfigurationsinformationen für das Test-Framework zu speichern, erstellen Sie einen Ordner conf innerhalb des Verzeichnisses uiscripts, der die Konfigurationsinformationen für das Test-Framework enthält.

Eine Referenzimplementierung, die Protractor als Testrahmen verwendet, finden Sie unter hello-compliance-app.

Verwaltung der ZAP-Scan-Ergebnisse

Basierend auf dem Wert der Parameter opt-in-dynamic-api-scan und opt-in-dynamic-ui-scan können wir wählen, ob wir entweder den API-Scan oder den UI-Scan oder beide durchführen wollen.

In der Datei trigger_zap_scans kann man zum Beispiel einzelne Scans auf der Grundlage der Opt-in-Parameter wie folgt auslösen.

if [ -n "$(get_env opt-in-dynamic-api-scan "")" ]; then
    # start the api scan
    set_env "zap-ui-scan" "false"
    source "${COMMONS_PATH}"/owasp-zap/run_scan.sh
fi

if [ -n "$(get_env opt-in-dynamic-ui-scan "")" ]; then
    # set for zap-ui-scans and start zap-ui-scan
    set_env "zap-ui-scan" "true"
    source "${COMMONS_PATH}"/owasp-zap/run_scan.sh
fi

COMMONS_PATH verweist auf einen Speicherort, der die Build-Skripte und Run-Skripte für verschiedene Tools enthält, die Teil der Pipeline von DevSecOps sind. Weitere Informationen finden Sie unter Gemeinsame Skripte.

Sie können den Erfolg des ZAP-Scans berechnen, indem Sie einen Exit-Code festlegen, der davon abhängt, ob der API-Scan oder der UI-Scan durchgeführt wurde. Alle gefundenen Schwachstellen werden ebenfalls gemeldet. Dies kann durch Abfragen der Variablen api-scan-result und ui-scan-result überprüft werden.

Die möglichen Werte, die diese Parameter annehmen können, sind success oder failure, die Standardeinstellung ist notRun.

ZAP_API_RESULT=$(get_env api-scan-result "notRun")
ZAP_UI_RESULT=$(get_env ui-scan-result "notRun")

if [[ "${ZAP_API_RESULT}" =~ ^(success|notRun)$ && "${ZAP_UI_RESULT}" =~ ^(success|notRun)$ ]]; then
   exit 0
else
   exit 1
fi

Konfigurieren des ZAP-Scans für die CC-Pipeline

In der folgenden Tabelle sind die zusätzlichen Parameter aufgeführt, die zur Durchführung von ZAP-Scans innerhalb der CC-Pipeline erforderlich sind.

ZAP-Parameter in der CC-Pipeline
Name Typ Beschreibung Erforderlich oder optional
app-url Zeichenfolge URL der bereitgestellten Anwendung, auf der der ZAP-Scan läuft. Verwenden Sie die staging url der Anwendung. Erforderlich
repo-url Zeichenfolge URL des Repositorys der bereitgestellten Anwendung. Optional, wenn inventory repo alle Artefakte von nur einem Anwendungs-Repository hat.

Konfigurieren von Zap UI-Scans zur Verwendung von benutzerdefinierten UI-Testbildern ohne Zippen von UI-Tests

In der folgenden Tabelle sind die zusätzlichen Parameter aufgeführt, die für die Konfiguration von ZAP UI-Scans zur Verwendung benutzerdefinierter UI-Testbilder erforderlich sind.

ZAP-Parameter in der CC-Pipeline
Name Typ Beschreibung Erforderlich oder optional
zap-custom-ui-deployment-name Zeichenfolge Benutzerdefinierter UI-Docker-Containername. Optionale
zap-custom-ui-docker-run-param Zeichenfolge Docker ausführungsparameter, um das benutzerdefinierte UI-Image auszuführen. Optionale
zap-custom-ui-exit-code-ignored Zeichenfolge Zap UI wird mit dem benutzerdefinierten UI-Exit-Code beendet, aber sein Exit-Code wird ignoriert, wenn diese Variable auf true gesetzt ist. Optionale
zap-custom-ui-image Zeichenfolge Benutzerdefiniertes UI-Docker-Image, das Tests ausführt. Erforderlich
zap-custom-ui-post-script Zeichenfolge Skript, das nach der Ausführung des benutzerdefinierten UI-Images ausgeführt wird. Optionale
zap-custom-ui-pre-script Zeichenfolge Skript, das vor der Ausführung des benutzerdefinierten UI-Images ausgeführt wird. Optionale
zap-custom-ui-progress-script Zeichenfolge Skript, das beim Ausführen des benutzerdefinierten UI-Images ausgeführt wird. Optionale
zap-custom-ui-timeout-in-sec Zeichenfolge Der Zap UI-Scan wird nach dieser Zeit beendet. Optionale

Dieser Schritt des benutzerdefinierten UI-Scans dient dazu, benutzerdefinierte UI-Docker-Images für das Testen von zap UI-Scans zu verwenden, anstatt die Docker-Image-Informationen in eine Zip-Datei zu packen, was der Standardfall ist. zap-custom-ui-image ist eine erforderliche Umgebungsvariable, die für die Konfiguration von ZAP UI-Scans zur Verwendung benutzerdefinierter UI-Testbilder gesetzt werden muss.