Configuration des balayages ZAP

Zed Attack Proxy (ZAP) est un outil de test de pénétration (PEN) libre et gratuit qui est maintenu sous l'égide de l'OWASP.ZAP est un proxy "man-in-the-middle" qui s'intercale entre le navigateur web du testeur et un serveur web. ZAP intercepte les paquets, modifie le contenu si nécessaire et transmet ces paquets au serveur web.

Exécution des balayages ZAP

Vous pouvez créer un script spécifique pour lancer les scans ZAP, comme trigger_zap_scans dans votre référentiel d'applications, à l'emplacement de votre choix, par exemple, dans un répertoire scripts et invoquer ce script dans l'étape dynamic-scan du fichier pipeline-config.

Vous pouvez personnaliser le fichier script trigger_zap_scans pour invoquer le scan zap approprié (api ou ui) comme décrit ici et vous appuyer sur le script d'exécution du scan zap commun pour exécuter un scan ZAP (ui ou api) afin d'effectuer des tests de pénétration sur votre application en cours d'exécution.

Une autre solution consiste à exécuter le(s) scan(s) zap dans une sous-pipeline telle que définie dans l'implémentation de référence, voir hello-compliance-app.

Avec cette configuration dans le fichier de configuration du pipeline, l'étape dynamic-scan invoquera le script trigger-async-zap.sh pour déclencher l'étape owasp-zap afin de lancer l'analyse de l'outil Zed Attack Proxy (ZAP) dans un sous-pipeline dédié. Il s'appuie également sur le script d'exécution Common zap scan pour exécuter un ZAP scan (ui ou api) afin de réaliser des tests de pénétration sur votre application en cours d'exécution.

Paramètres disponibles pour les balayages ZAP

Vous pouvez définir et personnaliser les paramètres suivants pour configurer les scans ZAP afin qu'ils effectuent des tests de pénétration sur votre application en cours d'exécution.

Paramètres de configuration du balayage ZAP
Nom Type Description Requise ou facultative
cluster-name Chaîne Le nom du cluster dans lequel vous souhaitez que le scanner zap soit déployé et exécuté, s'il n'est pas exécuté dans DinD. Requis s'il n'est pas exécuté dans DinD,, c'est-à-dire si zap-dind est configuré pour false.
ibmcloud-api Chaîne Spécifie l'environnement en nuage pour le cluster ZAP. La valeur par défaut est https://cloud.ibm.com Requis s'il n'est pas exécuté dans DinD,, c'est-à-dire si zap-dind est configuré pour false.
ibmcloud-api-key Chaîne Clé API pour déployer ZAP sur un cluster. Requis s'il n'est pas exécuté dans DinD,, c'est-à-dire si zap-dind est configuré pour false.
iam-token-endpoint Chaîne Le point de terminaison pour récupérer le jeton pour l'authentification IAM. La valeur par défaut est https://iam.cloud.ibm.com/identity/token Facultatif, mais s'il est fourni, target-api-key doit également l'être.
target-api-key Chaîne Clé API pour l'authentification IAM. Facultatif, mais s'il est fourni, iam-token-endpoint doit également l'être.
target-application-server-url Chaîne La base URL du serveur d'application que zap doit analyser. Il peut être identique au site URL de l'application déployée. Obligatoire
filter-options Chaîne Configurez-le pour qu'il filtre les alertes en fonction de leur gravité. Valeurs possibles : Critical, High, Medium, Low, Informational. La valeur par défaut est Informational, qui peut être une liste séparée par des virgules. Facultatif
zap-custom-api-policy-file-path Chaîne Chemin relatif dans le référentiel vers le fichier de politique personnalisée (format XML) pour les analyses de l'API ZAP. Si ce paramètre n'est pas défini, la politique par défaut API-Minimal.policy sera utilisée. Facultatif
zap-custom-ui-policy-file-path Chaîne Chemin relatif dans le référentiel pour le fichier de politique personnalisée (format XML) utilisé dans les analyses de l'interface utilisateur ZAP. Si ce chemin n'est pas défini, la politique par défaut default.policy sera utilisée. Facultatif
zap-ui-scan Chaîne Indicateur permettant de déterminer s'il s'agit d'une analyse de l'interface utilisateur ou de l'API. Valeurs possibles : true, false. La valeur true permet d'exécuter l'analyse de l'interface utilisateur, la valeur false permet d'exécuter l'analyse de l'API. Ce paramètre fonctionne avec les paramètres opt-in-dynamic-api-scan et opt-in-dynamic-ui-scan. Obligatoire
zap_dind Chaîne Drapeau pour basculer entre le déploiement de ZAP sur un cluster ou l'exécution de DinD. Valeur par défaut : true. Valeurs possibles : true, false. La valeur true exécute ZAP en tant que DinD,. La valeur false déploie ZAP sur un cluster pour lequel cluster-name, ibmcloud-api, et ibmcloud-api-key doivent être définis. Facultatif
zap-dind-localhost Chaîne Nom d'hôte pour les scanners ZAP lorsqu'ils sont exécutés dans DinD, default : localhost. Facultatif
zap-namespace Chaîne Espace de noms pour déployer les scanners ZAP API et UI dans le cluster, par défaut : zap. Facultatif pour l'exécution de ZAP dans un cluster, Not required pour l'exécution de ZAP dans DinD.
zap-polling-interval Chaîne Intervalle entre les interrogations du ZAP par les scanners à la fin de la numérisation, valeur par défaut : 120s. Facultatif
zap-artifact Chaîne La clé de l'artefact qui doit être analysé par zap et pour lequel collect-evidence doit être invoqué. La valeur par défaut est app-image. Facultatif
zap_evidence_type Chaîne Le type de preuve pour la collecte de preuves pour les scans effectués par ZAP, par défaut : com.ibm.dynamic_scan. Facultatif
show-container-log Chaîne Indicateur permettant d'activer ou de désactiver la capacité de journalisation des conteneurs pour les scanners ZAP lorsqu'ils fonctionnent à l'adresse DinD, default : false. Facultatif
show-zap-log Chaîne Indicateur permettant d'activer ou de désactiver la capacité de journalisation du serveur ZAP, valeur par défaut : false. Facultatif

Configuration des analyses de l'API ZAP

Dans votre référentiel d'applications, vous devez avoir au moins un fichier de définition d'API présent, au format json. Ce fichier de définition de l'API doit être une définition valide de swagger ou openapi. Ces fichiers peuvent se trouver à n'importe quel endroit du référentiel d'application, par exemple dans un répertoire definitions. Par souci de clarté, ces fichiers sont désignés comme suit : definitions1.json, definitions2.json, et ainsi de suite.

Paramètres de configuration de l'API ZAP
Nom Type Description Requise ou facultative
zap-api-custom-script Chaîne Chemin d'accès au fichier qui contient la logique de transformation de la demande avant de lancer l'analyse de l'API ZAP. Obligatoire
swagger-definition-files Chaîne Chemin d'accès aux fichiers contenant les définitions Swagger. Peut être une liste séparée par des virgules. Obligatoire
zap-api-port Chaîne Port d'exécution de l'analyseur de l'API ZAP lors du déploiement dans un cluster, par défaut : 9086. Facultatif
zap_api_deployment_name Chaîne Nom du déploiement du scanner ZAP API, par défaut : zap-api-deployment. Facultatif
zap-api-image Chaîne Définissez ce paramètre pour utiliser une image personnalisée du scanner de l'API ZAP. Dans le cas contraire, c'est la valeur par défaut de IBM qui est utilisée. Facultatif
flatten-zap-api-scan-report Chaîne Définissez ce paramètre sur true pour aplatir les résultats de l'analyse de l'API ZAP dans un seul fichier html et json. Défaut false. Facultatif

Créez un fichier custom-api-script dans le référentiel de votre application, à l'emplacement de votre choix, par exemple dans le répertoire scripts/zap-custom-scripts. Ce fichier peut également être nommé différemment, et le chemin d'accès à ce fichier doit être indiqué dans le paramètre zap-api-custom-script.

Utilisez le fichier custom-api-script pour modifier la requête qui entre dans le scanner ZAP. Les paramètres qui peuvent être utilisés dans la charge utile de la demande sont les suivants :

Paramètres dans les données utiles de la demande
Nom Type Description Requise ou facultative
excludeScanTypes Tableau Liste des analyses que l'utilisateur souhaite exclure. Liste complète des scans à choisir parmi : 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 et, HtAccessScanRule. Facultatif
apisToScan Tableau Liste des API à analyser avec les paramètres requis. Si "apisToScan": ["all"] est mentionné, toutes les API mentionnées dans la définition swagger sont analysées avec des données fictives pour les paramètres obligatoires/le corps. Pour personnaliser ce tableau afin d'avoir des API sélectives à analyser, utilisez la sous-structure apisToScan: [ { "path": "/path/to/endpoint", method: "get" } ]. Obligatoire
globalExcludeUrls Tableau Tableau de URL regexes pour indiquer à ZAP de ne pas rechercher ces itinéraires. Par exemple, "globalExcludeUrls": [ "^http://foo.bar$", "^http://john.doe$" ]. Facultatif
authenticationType Chaîne Mécanisme d'authentification pour les en-têtes de requête. Les mécanismes d'authentification pris en charge sont Bearer, Basic ou ApiKey. Facultatif
apiKey Chaîne Si authenticationType n'est pas envoyé, cette clé API est utilisée pour l'authentification IAM qui est envoyée dans l'en-tête Authorization pour toutes les demandes. Si authenticationType est défini sur Bearer, l'en-tête formé est Authorization: Bearer <apiKey>. Si authenticationType est défini sur ApiKey, l'en-tête formé est Authorization: <apiKey>. Le champ est ignoré pour authenticationType comme Basic. Facultatif
username Chaîne Nom d'utilisateur à utiliser pour authenticationType Basic. Obligatoire si authenticationType comme Basic
password Chaîne Mot de passe à utiliser pour authenticationType Basic. Obligatoire si authenticationType comme Basic

Pour les informations sensibles telles que les informations d'identification, vous devez lire ces valeurs à partir d'un coffre-fort ou d'une réserve secrète.

Configuration des balayages de l'interface utilisateur ZAP

Réglez le paramètre zap-ui-scan sur true pour que le balayage de l'interface utilisateur ZAP s'exécute.

Les paramètres nécessaires à la configuration des analyses de l'interface utilisateur ZAP sont les suivants.

Paramètres de configuration de l'interface utilisateur ZAP
Nom Type Description Requise ou facultative
zap-ui-custom-script Chaîne Chemin d'accès au fichier contenant la logique de modification de la charge utile de l'analyse de l'interface utilisateur, si nécessaire, avant que l'analyse de l'interface utilisateur ZAP ne soit lancée. Facultatif
zap-ui-script-directory Chaîne Chemin d'accès au répertoire contenant les tests de l'interface utilisateur et les fichiers nécessaires à l'exécution de l'analyse de l'interface utilisateur. Obligatoire
context-file Chaîne Chemin d'accès à un fichier de contexte personnalisé pour les analyses d'interface utilisateur fournies à ZAP. Facultatif
zap-ui-auth-user Chaîne Nom d'utilisateur à utiliser pour autoriser et exécuter le scan zap ui. Pour ce faire, il faut fournir context-file, qui doit également contenir des informations sur la manière d'authentifier l'utilisateur. Facultatif
zap-ui-port Chaîne Port d'exécution de l'analyseur de l'interface utilisateur ZAP lors du déploiement dans un cluster, par défaut : 9085. Facultatif
zap_ui_deployment_name Chaîne Nom du déploiement du scanner ZAP UI, par défaut : zap-ui-deployment. Facultatif
zap-proxy-service Chaîne Nom du service ZAP Proxy requis par le scanner de l'interface utilisateur, par défaut : zap-proxy-service. Facultatif
zap-ui-image Chaîne Réglez ce paramètre pour utiliser une image personnalisée du scanner ZAP UI. Dans le cas contraire, c'est la valeur par défaut de IBM qui est utilisée. Facultatif
zap-proxy-image Chaîne Ce paramètre permet d'utiliser une image ZAP Proxy personnalisée. Dans le cas contraire, c'est la valeur par défaut de IBM qui est utilisée. Facultatif

Créez un dossier uiscripts dans le répertoire scripts/zap de votre référentiel d'applications. Ce chemin d'accès au dossier est également défini par rapport à zap-ui-script-directory dans le fichier trigger_zap_scans. Ce dossier peut également être créé n'importe où ailleurs. Le chemin doit être ajusté pour zap-ui-script-directory.

Créez un fichier run.sh dans le répertoire uiscripts. run.sh pilote les tests de l'interface utilisateur. Nous pouvons configurer des tests basés sur Protractor ou tout autre cadre approprié.

Créez un fichier export.sh dans le répertoire uiscripts. Ce fichier contient toutes les variables d'environnement nécessaires à l'utilisation du cadre de test. Définissez ces valeurs d'environnement en ajoutant export <VARIABLE_NAME>=<VALUE>.

Pour contenir les informations de configuration du cadre de test, créez un dossier conf à l'intérieur du répertoire uiscripts pour contenir les informations de configuration du cadre de test.

Pour une implémentation de référence qui utilise Protractor comme cadre de test, voir hello-compliance-app.

Gestion des résultats du ZAP Scan

En fonction de la valeur des paramètres opt-in-dynamic-api-scan et opt-in-dynamic-ui-scan, nous pouvons choisir d'exécuter sélectivement soit l'analyse de l'API, soit l'analyse de l'interface utilisateur, soit les deux.

Par exemple, dans le fichier trigger_zap_scans, il est possible de déclencher des analyses individuelles en fonction des paramètres d'acceptation comme suit.

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

Le site COMMONS_PATH fait référence à un emplacement qui contient les scripts de construction et les scripts d'exécution pour divers outils qui font partie du pipeline DevSecOps. Pour plus d'informations, voir Scripts communs.

Vous pouvez calculer le succès de l'analyse ZAP en définissant un code de sortie en fonction de l'exécution de l'analyse API ou de l'analyse UI. Toutes les vulnérabilités trouvées sont également signalées. Ceci peut être vérifié en utilisant les variables api-scan-result et ui-scan-result.

Les valeurs possibles de ces paramètres sont success ou failure, et la valeur par défaut est 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

Configuration de l'analyse ZAP pour le pipeline CC

Le tableau suivant répertorie les paramètres supplémentaires nécessaires pour exécuter des analyses ZAP dans le pipeline CC.

Paramètres ZAP dans le pipeline CC
Nom Type Description Requise ou facultative
app-url Chaîne URL de l'application déployée sur laquelle s'exécute l'analyse ZAP. Utilisez l'url staging de l'application. Obligatoire
repo-url Chaîne URL du référentiel de l'application déployée. Facultatif, si inventory repo possède tous les artefacts d'un seul repo d'application.

Configurer les scans d'interface utilisateur de Zap pour utiliser des images de test d'interface utilisateur personnalisées sans zipper les tests d'interface utilisateur

Le tableau suivant répertorie les paramètres supplémentaires nécessaires pour configurer les analyses de l'interface utilisateur ZAP afin d'utiliser des images de test de l'interface utilisateur personnalisées.

Paramètres ZAP dans le pipeline CC
Nom Type Description Requise ou facultative
zap-custom-ui-deployment-name Chaîne Nom du conteneur docker de l'interface utilisateur personnalisée. Facultatif
zap-custom-ui-docker-run-param Chaîne Docker paramètres d'exécution pour exécuter l'image personnalisée de l'interface utilisateur. Facultatif
zap-custom-ui-exit-code-ignored Chaîne L'interface utilisateur Zap se termine avec le code de sortie de l'interface personnalisée, mais son code de sortie sera ignoré si cette variable est définie à true. Facultatif
zap-custom-ui-image Chaîne Image docker de l'interface utilisateur personnalisée qui exécute les tests. Obligatoire
zap-custom-ui-post-script Chaîne Script à exécuter après l'exécution de l'image d'interface utilisateur personnalisée. Facultatif
zap-custom-ui-pre-script Chaîne Script à exécuter avant de lancer l'image d'interface utilisateur personnalisée. Facultatif
zap-custom-ui-progress-script Chaîne Script à exécuter lors de l'exécution de l'image d'interface utilisateur personnalisée. Facultatif
zap-custom-ui-timeout-in-sec Chaîne L'analyse de l'interface utilisateur Zap se termine après ce délai. Facultatif

Cette étape de scan personnalisé de l'interface utilisateur permet d'utiliser les images docker de l'interface utilisateur personnalisée pour tester les scans de l'interface utilisateur de zap, au lieu de mettre les informations de l'image docker dans le fichier zip, ce qui est le cas par défaut. zap-custom-ui-image est une variable d'environnement nécessaire pour configurer les analyses de l'interface utilisateur de ZAP afin d'utiliser des images de test de l'interface utilisateur personnalisées.