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.
| 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.
| 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
| 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.
| 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.
| 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.
| 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.