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