Configuración de las exploraciones ZAP

Zed Attack Proxy (ZAP) es una herramienta de pruebas de penetración (PEN) gratuita y de código abierto que se mantiene bajo el paraguas de OWASP.ZAP es un proxy "man-in-the-middle" que se sitúa entre el navegador web de la persona que realiza la prueba y un servidor web. ZAP intercepta los paquetes, modifica el contenido si es necesario y los reenvía al servidor web.

Ejecución de exploraciones ZAP

Puede crear un script específico para iniciar los escaneos ZAP, como trigger_zap_scans dentro del repositorio de su aplicación, en una ubicación de su elección, por ejemplo, dentro de un directorio scripts e invocar este script en la etapa dynamic-scan del archivo pipeline-config.

Puede personalizar el archivo de script trigger_zap_scans para invocar el escaneo zap apropiado (api o ui) como se describe aquí y confiar en el script de ejecución de escaneo zap común para ejecutar un escaneo ZAP (ui o api) para ejecutar pruebas de penetración en su aplicación en ejecución.

Una forma alternativa es ejecutar la(s) exploración(es) zap en una sub-línea de producción como se define en la implementación de referencia, ver hello-compliance-app.

Con esta configuración en el archivo de configuración del pipeline, la etapa dynamic-scan invocará el script trigger-async-zap.sh para activar la etapa owasp-zap para iniciar el escaneo de la herramienta Zed Attack Proxy (ZAP) en un sub-pipeline dedicado. También se basa en el script de ejecución de escaneo de zap común para ejecutar un escaneo ZAP (ui o api) para ejecutar pruebas de penetración en su aplicación en ejecución.

Parámetros disponibles para las exploraciones ZAP

Puede establecer y personalizar los siguientes parámetros para configurar los escaneos ZAP para ejecutar pruebas de penetración en su aplicación en ejecución.

Parámetros de configuración del escáner ZAP
Nombre Tipo Descripción Obligatoria u opcional
cluster-name Serie El nombre del clúster en el que desea que se despliegue y ejecute el escáner zap, si no se ejecuta en DinD. Obligatorio si no se ejecuta en DinD, es decir, zap-dind se establece en false.
ibmcloud-api Serie Especifica el entorno de nube para el clúster ZAP. El valor predeterminado es https://cloud.ibm.com Obligatorio si no se ejecuta en DinD, es decir, zap-dind se establece en false.
ibmcloud-api-key Serie Clave API para desplegar ZAP en un clúster. Obligatorio si no se ejecuta en DinD, es decir, zap-dind se establece en false.
iam-token-endpoint Serie El endpoint para recuperar el token para la autenticación IAM. El valor predeterminado es https://iam.cloud.ibm.com/identity/token Opcional, pero si se proporciona, también debe proporcionarse target-api-key.
target-api-key Serie Clave API para la autenticación IAM. Opcional, pero si se proporciona, también debe proporcionarse iam-token-endpoint.
target-application-server-url Serie La base URL del servidor de aplicaciones para que zap lo escanee. Puede ser el mismo que el de URL de la aplicación desplegada. Obligatorio
filter-options Serie Configúralo para que filtre las alertas en función de su gravedad. Valores posibles: Critical, High, Medium, Low, Informational. Por defecto Informational, puede ser una lista separada por comas. Opcional
zap-custom-api-policy-file-path Serie Ruta relativa en el repositorio al archivo de política personalizada (formato XML) para las exploraciones de la API ZAP. Si no se establece, se utilizará la política por defecto API-Minimal.policy. Opcional
zap-custom-ui-policy-file-path Serie Ruta relativa en el repositorio para el archivo de política personalizada (formato XML) utilizado en las exploraciones de la interfaz de usuario de ZAP. Si no se establece esta ruta, se utilizará la política por defecto default.policy. Opcional
zap-ui-scan Serie Bandera para determinar si el escaneo es el escaneo UI o el escaneo API. Valores posibles: true, false. Si se define como true, se ejecuta el análisis de la interfaz de usuario; si se define como false, se ejecuta el análisis de la API. Este parámetro funciona con los parámetros opt-in-dynamic-api-scan y opt-in-dynamic-ui-scan. Obligatorio
zap_dind Serie Bandera para cambiar entre desplegar ZAP en un cluster o ejecutar DinD. Valor predeterminado: true. Valores posibles: true, false. Establecerlo en true ejecuta ZAP como DinD, establecerlo en false despliega ZAP en un cluster para el cual cluster-name, ibmcloud-api, y ibmcloud-api-key deben ser establecidos. Opcional
zap-dind-localhost Serie Nombre de host para los escáneres ZAP cuando se ejecutan en DinD, por defecto: localhost. Opcional
zap-namespace Serie Espacio de nombres para desplegar los escáneres ZAP API y UI en el clúster, por defecto: zap. Opcional para ejecutar ZAP en clúster, Not required para ejecutar ZAP en DinD.
zap-polling-interval Serie Intervalo para que los escáneres pregunten a ZAP si se ha completado el escaneado, por defecto: 120s. Opcional
zap-artifact Serie La clave de activo para el artefacto que se va a escanear con zap y para el que se va a invocar collect-evidence, El valor por defecto es app-image. Opcional
zap_evidence_type Serie El tipo de prueba para la recopilación de pruebas para las exploraciones realizadas por ZAP, por defecto: com.ibm.dynamic_scan. Opcional
show-container-log Serie Bandera para activar o desactivar la capacidad de registro de contenedores para los escáneres ZAP cuando se ejecutan en DinD, por defecto: false. Opcional
show-zap-log Serie Bandera para activar o desactivar la capacidad de registro del servidor ZAP, por defecto: false. Opcional

Configuración de las exploraciones de la API ZAP

Dentro de su repositorio de aplicaciones, debe tener al menos un archivo de definición de API presente, en formato json. Este archivo de definición de API debe ser una definición válida de swagger o openapi. Estos archivos pueden estar presentes en cualquier ubicación dentro del repositorio de la aplicación, por ejemplo, dentro de un directorio definitions. Para mayor claridad, estos archivos se denominan de la siguiente manera: definitions1.json, definitions2.json, etc.

Parámetros de configuración de la API ZAP
Nombre Tipo Descripción Obligatoria u opcional
zap-api-custom-script Serie Ruta al archivo que contiene la lógica de transformación de la solicitud antes de iniciar el análisis de la API de ZAP. Obligatorio
swagger-definition-files Serie Ruta a los archivos que contienen las definiciones Swagger. Puede ser una lista separada por comas. Obligatorio
zap-api-port Serie Puerto para ejecutar el escáner de la API de ZAP cuando se despliega en un clúster, por defecto: 9086. Opcional
zap_api_deployment_name Serie Nombre del despliegue del escáner de la API ZAP, por defecto: zap-api-deployment. Opcional
zap-api-image Serie Establezca este parámetro para utilizar una imagen personalizada del escáner de la API ZAP. En caso contrario, se utiliza el valor por defecto de IBM. Opcional
flatten-zap-api-scan-report Serie Establezca este parámetro en true para aplanar los resultados del escaneo de la API ZAP en un único archivo html y json. Por defecto false. Opcional

Cree un archivo custom-api-script dentro del repositorio de su aplicación, en una ubicación de su elección, por ejemplo, dentro del directorio scripts/zap-custom-scripts. Este archivo también puede llamarse de otra forma, y establecer la ruta a este archivo en el parámetro zap-api-custom-script.

Utilice el archivo custom-api-script para modificar la solicitud que entra en el escáner ZAP. Los parámetros que pueden utilizarse en la carga útil de la solicitud son los siguientes:

Parámetros de la carga útil de la solicitud
Nombre Tipo Descripción Obligatoria u opcional
excludeScanTypes Matriz Lista de exploraciones que el usuario desea excluir. Lista completa de exploraciones para elegir: 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 y, HtAccessScanRule. Opcional
apisToScan Matriz Lista de APIs a escanear junto con los parámetros requeridos. Si se menciona "apisToScan": ["all"], entonces todas las APIs mencionadas en la definición swagger son escaneadas con datos mock para parámetros/body obligatorios. Para personalizar esta matriz de modo que se analicen API selectivas, utilice esta subestructura apisToScan: [ { "path": "/path/to/endpoint", method: "get" } ]. Obligatorio
globalExcludeUrls Matriz Conjunto de expresiones regulares URL para indicar a ZAP que no busque esas rutas. Por ejemplo, "globalExcludeUrls": [ "^http://foo.bar$", "^http://john.doe$" ]. Opcional
authenticationType Serie Mecanismo de autenticación para las cabeceras de solicitud. Los mecanismos de autenticación admitidos son Bearer, Basic o ApiKey. Opcional
apiKey Serie Si no se envía authenticationType, esta clave API se utiliza para la autenticación IAM que se envía en la cabecera Authorization para todas las solicitudes. Si authenticationType se establece en Bearer, la cabecera que se forma es Authorization: Bearer <apiKey>. Si authenticationType se establece en ApiKey, la cabecera que se forma es Authorization: <apiKey>. El campo se ignora para authenticationType como Basic. Opcional
username Serie Nombre de usuario que se utilizará para authenticationType Basic. Obligatorio si authenticationType como Basic
password Serie Contraseña que se utilizará para authenticationType Basic. Obligatorio si authenticationType como Basic

Para información sensible como las credenciales, debes leer estos valores desde una bóveda o un almacén secreto.

Configuración de las exploraciones de ZAP UI

Establezca el parámetro zap-ui-scan en true para que se ejecute la exploración de ZAP UI.

Los parámetros necesarios para configurar las exploraciones de ZAP UI son los siguientes.

Parámetros de configuración de ZAP UI
Nombre Tipo Descripción Obligatoria u opcional
zap-ui-custom-script Serie Ruta al archivo que contiene la lógica de modificación de la carga útil del análisis de la interfaz de usuario, si es necesario, antes de que se inicie el análisis de la interfaz de usuario de ZAP. Opcional
zap-ui-script-directory Serie Ruta al directorio que contiene las pruebas de interfaz de usuario y los archivos necesarios para ejecutar el análisis de interfaz de usuario. Obligatorio
context-file Serie Ruta a un archivo de contexto personalizado para las exploraciones de interfaz de usuario proporcionadas a ZAP. Opcional
zap-ui-auth-user Serie Nombre de usuario que se utilizará para autorizar y ejecutar zap ui scan como. Esto requiere que se proporcione context-file que también debe contener la información de la forma de autenticar a este usuario. Opcional
zap-ui-port Serie Puerto para ejecutar el escáner ZAP UI cuando se despliega en un clúster, por defecto: 9085. Opcional
zap_ui_deployment_name Serie Nombre del despliegue del escáner ZAP UI, por defecto: zap-ui-deployment. Opcional
zap-proxy-service Serie Nombre del servicio ZAP Proxy requerido por el escáner de interfaz de usuario, por defecto: zap-proxy-service. Opcional
zap-ui-image Serie Establezca este parámetro para utilizar una imagen personalizada de ZAP UI Scanner. En caso contrario, se utiliza el valor por defecto de IBM. Opcional
zap-proxy-image Serie Configure esta opción para utilizar una imagen de proxy ZAP personalizada. En caso contrario, se utiliza el valor por defecto de IBM. Opcional

Cree una carpeta uiscripts dentro del directorio scripts/zap dentro del repositorio de su aplicación. Establezca también esta ruta de carpeta en zap-ui-script-directory en el archivo trigger_zap_scans. Esta carpeta también puede crearse en cualquier otro lugar. La ruta debe ajustarse para zap-ui-script-directory.

Cree un archivo run.sh dentro del directorio uiscripts. run.sh controla las pruebas de interfaz de usuario. Podemos configurar pruebas basadas en Protractor o en cualquier otro marco adecuado.

Cree un archivo export.sh dentro del directorio uiscripts. Este archivo contiene todas las diferentes variables de entorno que se requieren para el marco de pruebas a utilizar. Establezca esos valores de entorno añadiendo export <VARIABLE_NAME>=<VALUE>.

Para guardar la información de configuración del marco de pruebas, cree una carpeta conf dentro del directorio uiscripts para alojar la información de configuración del marco de pruebas.

Para ver una implementación de referencia que utiliza Protractor como marco de pruebas, consulte hello-compliance-app.

Gestión de los resultados de la exploración ZAP

Basándonos en el valor de los parámetros opt-in-dynamic-api-scan y opt-in-dynamic-ui-scan, podemos elegir ejecutar selectivamente el escaneo API o el escaneo UI o ambos.

Por ejemplo, dentro del archivo trigger_zap_scans, se pueden activar escaneos individuales basados en los parámetros opt-in de la siguiente manera.

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 hace referencia a una ubicación que contiene los scripts de compilación y los scripts de ejecución de varias herramientas que forman parte del proceso de DevSecOps. Para más información, consulte Guiones comunes.

Puede calcular el éxito del escaneo ZAP estableciendo un código de salida basado en si se ejecutó el escaneo API o el escaneo UI. También se informa de cualquier vulnerabilidad encontrada. Esto puede comprobarse consultando las variables api-scan-result y ui-scan-result.

Los posibles valores que pueden tomar estos parámetros son success o failure, y por defecto 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

Configuración de la exploración ZAP para el canal CC

En la siguiente tabla se enumeran los parámetros adicionales necesarios para ejecutar exploraciones ZAP dentro de la canalización CC.

Parámetros ZAP en la canalización CC
Nombre Tipo Descripción Obligatoria u opcional
app-url Serie URL de la aplicación desplegada sobre la que se ejecuta el escaneo ZAP. Utilice la url staging de la aplicación. Obligatorio
repo-url Serie URL del repositorio de la aplicación desplegada. Opcional, si inventory repo tiene todos los artefactos de un único repositorio de aplicaciones.

Configuración de las exploraciones de interfaz de usuario de Zap para utilizar imágenes de prueba de interfaz de usuario personalizadas sin comprimir las pruebas de interfaz de usuario

La siguiente tabla enumera los parámetros adicionales necesarios para configurar los escaneos de interfaz de usuario de ZAP para utilizar imágenes de prueba de interfaz de usuario personalizadas.

Parámetros ZAP en la canalización CC
Nombre Tipo Descripción Obligatoria u opcional
zap-custom-ui-deployment-name Serie Nombre de contenedor docker de interfaz de usuario personalizada. Opcional
zap-custom-ui-docker-run-param Serie Docker parámetros de ejecución para ejecutar la imagen de interfaz de usuario personalizada. Opcional
zap-custom-ui-exit-code-ignored Serie Zap UI sale con el código de salida de la interfaz de usuario personalizada, pero su código de salida será ignorado si esta variable se establece en true. Opcional
zap-custom-ui-image Serie Imagen docker de interfaz de usuario personalizada que ejecuta pruebas. Obligatorio
zap-custom-ui-post-script Serie Script que se ejecutará después de ejecutar la imagen de interfaz de usuario personalizada. Opcional
zap-custom-ui-pre-script Serie Script a ejecutar antes de ejecutar la imagen de interfaz de usuario personalizada. Opcional
zap-custom-ui-progress-script Serie Script que se ejecutará mientras se ejecuta la imagen de interfaz de usuario personalizada. Opcional
zap-custom-ui-timeout-in-sec Serie La exploración de la interfaz de usuario de Zap sale después de este tiempo. Opcional

Este paso de escaneo de UI personalizado es para usar las imágenes docker de UI personalizadas del usuario para probar los escaneos de UI de zap, en lugar de poner la información de la imagen docker en el archivo zip que es el caso por defecto. zap-custom-ui-image es una variable de entorno necesaria para configurar las exploraciones de interfaz de usuario de ZAP para utilizar imágenes de prueba de interfaz de usuario personalizadas.