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