Configurazione delle scansioni ZAP

Zed Attack Proxy (ZAP) è uno strumento di penetration testing (PEN) gratuito e open source, gestito da OWASP.ZAP è un proxy "man-in-the-middle" che si interpone tra il browser Web del tester e un server Web. ZAP intercetta i pacchetti, ne modifica il contenuto se necessario e li inoltra al server web.

Esecuzione di scansioni ZAP

È possibile creare uno script specifico per avviare le scansioni ZAP, come trigger_zap_scans all'interno del repository dell'applicazione, in una posizione a scelta, ad esempio all'interno di una directory scripts e invocare questo script nello stage dynamic-scan del file pipeline-config.

È possibile personalizzare il file di script trigger_zap_scans per richiamare la scansione zap appropriata (api o ui) come descritto qui e affidarsi allo script di esecuzione della scansione zap comune per eseguire una scansione ZAP (ui o api) per eseguire i test di penetrazione sull'applicazione in esecuzione.

Un modo alternativo è quello di eseguire le scansioni zap in una sottopiplina, come definito nell'implementazione di riferimento, vedi hello-compliance-app.

Con questa configurazione nel file di configurazione della pipeline, lo stage dynamic-scan invocherà lo script trigger-async-zap.sh per attivare lo stage owasp-zap e avviare la scansione dello strumento Zed Attack Proxy (ZAP) in una sottopiplina dedicata. Si basa anche sullo script di esecuzione della scansione Common zap per eseguire una scansione ZAP (ui o api) per eseguire test di penetrazione sull'applicazione in esecuzione.

Parametri disponibili per le scansioni ZAP

È possibile impostare e personalizzare i seguenti parametri per configurare le scansioni ZAP per l'esecuzione di test di penetrazione sull'applicazione in esecuzione.

Parametri di configurazione della scansione ZAP
Nome Immettere Descrizione Obbligatoria o facoltativa
cluster-name Stringa Il nome del cluster in cui si desidera che lo scanner zap venga distribuito ed eseguito, se non è in esecuzione in DinD. Richiesto se non viene eseguito in DinD,, cioè se zap-dind è impostato su false.
ibmcloud-api Stringa Specifica l'ambiente cloud per il cluster ZAP. Il valore predefinito è https://cloud.ibm.com Richiesto se non viene eseguito in DinD,, cioè se zap-dind è impostato su false.
ibmcloud-api-key Stringa Chiave API per distribuire ZAP in un cluster. Richiesto se non viene eseguito in DinD,, cioè se zap-dind è impostato su false.
iam-token-endpoint Stringa L'endpoint per recuperare il token per l'autenticazione IAM. Il valore predefinito è https://iam.cloud.ibm.com/identity/token Facoltativo, ma se fornito, deve essere fornito anche target-api-key.
target-api-key Stringa Chiave API per l'autenticazione IAM. Facoltativo, ma se fornito, deve essere fornito anche iam-token-endpoint.
target-application-server-url Stringa La base URL del server applicativo che zap deve analizzare. Può essere lo stesso URL dell'applicazione distribuita. Obbligatorio
filter-options Stringa Impostare il filtro degli avvisi in base alla gravità. Valori possibili: Critical, High, Medium, Low, Informational. Il valore predefinito è Informational, può essere un elenco separato da virgole. Facoltativo
zap-custom-api-policy-file-path Stringa Percorso relativo nel repository del file di criterio personalizzato (formato XML) per le scansioni ZAP API. Se non viene impostata, verrà utilizzato il criterio predefinito API-Minimal.policy. Facoltativo
zap-custom-ui-policy-file-path Stringa Percorso relativo nel repository per il file di criterio personalizzato (formato XML) utilizzato nelle scansioni dell'interfaccia utente ZAP. Se questo percorso non è impostato, verrà utilizzato il criterio predefinito default.policy. Facoltativo
zap-ui-scan Stringa Flag per determinare se la scansione è quella dell'interfaccia utente o quella dell'API. Valori possibili: true, false. Impostando questo flag su true si esegue la scansione dell'interfaccia utente, mentre impostandolo su false si esegue la scansione dell'API. Questo parametro funziona con i parametri opt-in-dynamic-api-scan e opt-in-dynamic-ui-scan. Obbligatorio
zap_dind Stringa Flag per passare dalla distribuzione di ZAP a un cluster all'esecuzione di DinD. Predefinito: true. Valori possibili: true, false. Impostando true si esegue ZAP come DinD, impostando false si distribuisce ZAP in un cluster per il quale devono essere impostati cluster-name, ibmcloud-api e ibmcloud-api-key. Facoltativo
zap-dind-localhost Stringa Hostname per gli scanner ZAP durante l'esecuzione in DinD, predefinito: localhost. Facoltativo
zap-namespace Stringa Namespace per distribuire gli scanner ZAP API e UI nel cluster, predefinito: zap. Opzionale per l'esecuzione di ZAP in cluster, Not required per ZAP in DinD.
zap-polling-interval Stringa Intervallo per il polling di ZAP da parte degli scanner per il completamento della scansione, valore predefinito: 120s. Facoltativo
zap-artifact Stringa La chiave dell'asset per l'artefatto che deve essere sottoposto a zap scanning e per il quale deve essere invocata collect-evidence. Il valore predefinito è app-image. Facoltativo
zap_evidence_type Stringa Il tipo di prova per la raccolta di prove per le scansioni eseguite da ZAP, predefinito: com.ibm.dynamic_scan. Facoltativo
show-container-log Stringa Flag per abilitare o disabilitare la funzionalità di registrazione dei container per gli scanner ZAP quando vengono eseguiti in DinD, predefinito: false. Facoltativo
show-zap-log Stringa Flag per abilitare o disabilitare la capacità di registrazione del server ZAP, default: false. Facoltativo

Configurazione delle scansioni API ZAP

All'interno del repository dell'applicazione, deve essere presente almeno un file di definizione delle API, in formato json. Questo file di definizione dell'API deve essere una definizione valida di swagger o openapi. Questi file possono essere presenti in qualsiasi posizione all'interno del repository dell'applicazione, ad esempio all'interno di una cartella definitions. Per chiarezza, questi file sono indicati come segue: definitions1.json, definitions2.json, e così via.

Parametri di configurazione dell'API ZAP
Nome Immettere Descrizione Obbligatoria o facoltativa
zap-api-custom-script Stringa Percorso del file che contiene la logica di trasformazione della richiesta prima di avviare la scansione ZAP API. Obbligatorio
swagger-definition-files Stringa Percorso dei file che contengono le definizioni di Swagger. Può essere un elenco separato da virgole. Obbligatorio
zap-api-port Stringa Porta per eseguire lo scanner API ZAP quando viene distribuito in un cluster, predefinita: 9086. Facoltativo
zap_api_deployment_name Stringa Nome dell'installazione dello scanner ZAP API, predefinito: zap-api-deployment. Facoltativo
zap-api-image Stringa Impostare questo parametro per utilizzare un'immagine ZAP API Scanner personalizzata. Altrimenti, viene utilizzato il valore predefinito di IBM. Facoltativo
flatten-zap-api-scan-report Stringa Impostare questo parametro su true per appiattire i risultati della scansione API ZAP in un unico file html e json. Predefinito false. Facoltativo

Creare un file custom-api-script all'interno del repository dell'applicazione, in una posizione a scelta, ad esempio all'interno della cartella scripts/zap-custom-scripts. Questo file può essere chiamato anche in modo diverso e si può impostare il percorso di questo file con il parametro zap-api-custom-script.

Utilizzare il file custom-api-script per modificare la richiesta che viene inviata allo scanner ZAP. I parametri che possono essere utilizzati nel payload della richiesta sono i seguenti:

Parametri nel payload della richiesta
Nome Immettere Descrizione Obbligatoria o facoltativa
excludeScanTypes Array Elenco di scansioni che l'utente desidera escludere. Elenco completo di scansioni tra cui scegliere: 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 e, HtAccessScanRule. Facoltativo
apisToScan Array Elenco delle API da analizzare con i parametri richiesti. Se viene menzionato "apisToScan": ["all"], tutte le API menzionate nella definizione di swagger vengono analizzate con dati mock per i parametri/corpi obbligatori. Per personalizzare questo array in modo da avere API selettive da analizzare, utilizzare questa sottostruttura apisToScan: [ { "path": "/path/to/endpoint", method: "get" } ]. Obbligatorio
globalExcludeUrls Array Array di regex URL per indicare a ZAP di non eseguire la scansione di tali percorsi. Ad esempio, "globalExcludeUrls": [ "^http://foo.bar$", "^http://john.doe$" ]. Facoltativo
authenticationType Stringa Meccanismo di autenticazione per le intestazioni delle richieste. I meccanismi di autenticazione supportati sono Bearer, Basic, o ApiKey. Facoltativo
apiKey Stringa Se authenticationType non viene inviato, questa chiave API viene utilizzata per l'autenticazione IAM che viene inviata nell'intestazione Authorization per tutte le richieste. Se authenticationType è impostato su Bearer, l'intestazione che si forma è Authorization: Bearer <apiKey>. Se authenticationType è impostato su ApiKey, l'intestazione che si forma è Authorization: <apiKey>. Il campo viene ignorato per authenticationType come Basic. Facoltativo
username Stringa Nome utente da utilizzare per authenticationType Basic. Richiesto se authenticationType come Basic
password Stringa Password da utilizzare per authenticationType Basic. Richiesto se authenticationType come Basic

Per informazioni sensibili come le credenziali, è necessario leggere questi valori da un caveau o da un archivio segreto.

Configurazione delle scansioni dell'interfaccia utente ZAP

Impostare il parametro zap-ui-scan su true per eseguire la scansione ZAP UI.

I parametri necessari per la configurazione delle scansioni ZAP UI sono i seguenti.

Parametri di configurazione dell'interfaccia ZAP
Nome Immettere Descrizione Obbligatoria o facoltativa
zap-ui-custom-script Stringa Percorso del file che contiene la logica di modifica del payload della scansione UI, se necessario, prima dell'avvio della scansione ZAP UI. Facoltativo
zap-ui-script-directory Stringa Percorso della directory che contiene i test dell'interfaccia utente e i file necessari per eseguire la scansione dell'interfaccia utente. Obbligatorio
context-file Stringa Percorso di un file di contesto personalizzato per le scansioni dell'interfaccia utente fornite a ZAP. Facoltativo
zap-ui-auth-user Stringa Nome utente da utilizzare per autorizzare ed eseguire zap ui scan. Per questo è necessario fornire context-file, che dovrebbe contenere anche le informazioni sul modo in cui autenticare l'utente. Facoltativo
zap-ui-port Stringa Porta per eseguire lo scanner ZAP UI quando viene distribuito in un cluster, predefinita: 9085. Facoltativo
zap_ui_deployment_name Stringa Nome dell'installazione dello scanner ZAP UI, predefinito: zap-ui-deployment. Facoltativo
zap-proxy-service Stringa Nome del servizio ZAP Proxy richiesto dallo scanner UI, predefinito: zap-proxy-service. Facoltativo
zap-ui-image Stringa Impostare questo parametro per utilizzare un'immagine ZAP UI Scanner personalizzata. Altrimenti, viene utilizzato il valore predefinito di IBM. Facoltativo
zap-proxy-image Stringa Impostare questa opzione per utilizzare un'immagine ZAP Proxy personalizzata. Altrimenti, viene utilizzato il valore predefinito di IBM. Facoltativo

Creare una cartella uiscripts all'interno della cartella scripts/zap nel repository dell'applicazione. Impostare anche il percorso di questa cartella rispetto a zap-ui-script-directory nel file trigger_zap_scans. Questa cartella può essere creata anche altrove. Il percorso deve essere regolato per zap-ui-script-directory.

Creare un file run.sh all'interno della cartella uiscripts. run.sh gestisce i test dell'interfaccia utente. Possiamo configurare test basati su Protractor o su qualsiasi altro framework adatto.

Creare un file export.sh all'interno della directory uiscripts. Questo file contiene tutte le variabili d'ambiente necessarie per l'utilizzo del framework di test. Impostate i valori dell'ambiente aggiungendo export <VARIABLE_NAME>=<VALUE>.

Per conservare le informazioni di configurazione del framework di test, creare una cartella conf all'interno della cartella uiscripts per ospitare le informazioni di configurazione del framework di test.

Per un'implementazione di riferimento che utilizza Protractor come framework di test, vedere hello-compliance-app.

Gestione dei risultati della scansione ZAP

In base al valore dei parametri opt-in-dynamic-api-scan e opt-in-dynamic-ui-scan, si può scegliere di eseguire selettivamente la scansione API, la scansione UI o entrambe.

Ad esempio, all'interno del file trigger_zap_scans è possibile attivare singole scansioni in base ai parametri di opt-in come segue.

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 si riferisce a una posizione che contiene gli script di compilazione e di esecuzione per vari strumenti che fanno parte della pipeline DevSecOps. Per ulteriori informazioni, vedere Script comuni.

È possibile calcolare il successo della scansione ZAP impostando un codice di uscita in base all'esecuzione della scansione API o della scansione UI. Vengono inoltre segnalate le eventuali vulnerabilità riscontrate. Questo può essere verificato attingendo alle variabili api-scan-result e ui-scan-result.

I possibili valori che questi parametri possono assumere sono success o failure, mentre il valore predefinito è 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

Configurazione della scansione ZAP per la pipeline CC

La tabella seguente elenca i parametri aggiuntivi necessari per eseguire le scansioni ZAP all'interno della pipeline CC.

Parametri ZAP nella pipeline CC
Nome Immettere Descrizione Obbligatoria o facoltativa
app-url Stringa URL dell'applicazione distribuita su cui viene eseguita la scansione ZAP. Utilizzare l'url staging dell'applicazione. Obbligatorio
repo-url Stringa URL del repository dell'applicazione distribuita. Opzionale, se inventory repo ha tutti gli artefatti di un solo repo di applicazione.

Configurazione delle scansioni Zap UI per utilizzare immagini di test UI personalizzate senza zippare i test UI

La tabella seguente elenca i parametri aggiuntivi necessari per configurare le scansioni ZAP UI in modo da utilizzare immagini di test UI personalizzate.

Parametri ZAP nella pipeline CC
Nome Immettere Descrizione Obbligatoria o facoltativa
zap-custom-ui-deployment-name Stringa Nome del contenitore docker personalizzato dell'interfaccia utente. Facoltativo
zap-custom-ui-docker-run-param Stringa Docker per eseguire l'immagine personalizzata dell'interfaccia utente. Facoltativo
zap-custom-ui-exit-code-ignored Stringa Zap UI esce con il codice di uscita dell'interfaccia personalizzata, ma il suo codice di uscita viene ignorato se questa variabile è impostata su true. Facoltativo
zap-custom-ui-image Stringa Immagine docker dell'interfaccia utente personalizzata che esegue i test. Obbligatorio
zap-custom-ui-post-script Stringa Script da eseguire dopo l'esecuzione dell'immagine UI personalizzata. Facoltativo
zap-custom-ui-pre-script Stringa Script da eseguire prima di eseguire l'immagine personalizzata dell'interfaccia utente. Facoltativo
zap-custom-ui-progress-script Stringa Script da eseguire durante l'esecuzione dell'immagine UI personalizzata. Facoltativo
zap-custom-ui-timeout-in-sec Stringa La scansione dell'interfaccia utente di Zap esce dopo questo tempo. Facoltativo

Questa fase di scansione dell'interfaccia utente personalizzata serve a utilizzare le immagini docker dell'interfaccia utente personalizzata per testare le scansioni dell'interfaccia utente di zap, invece di inserire le informazioni dell'immagine docker nel file zip, come avviene di default. zap-custom-ui-image è una variabile d'ambiente necessaria da impostare per configurare le scansioni dell'interfaccia utente di ZAP in modo da utilizzare immagini di test dell'interfaccia utente personalizzate.