Configuração de varreduras ZAP

O Zed Attack Proxy (ZAP) é uma ferramenta de teste de penetração (PEN) gratuita e de código aberto mantida sob a égide da OWASP.O ZAP é um proxy "man-in-the-middle" que fica entre o navegador da Web do testador e um servidor da Web. O ZAP intercepta os pacotes, modifica o conteúdo, se necessário, e encaminha esses pacotes para o servidor da Web.

Execução de varreduras ZAP

Você pode criar um script específico para iniciar as varreduras do ZAP, como trigger_zap_scans dentro do repositório do aplicativo, em um local de sua escolha, por exemplo, dentro de um diretório scripts e invocar esse script no estágio dynamic-scan do arquivo pipeline-config.

Você pode personalizar o arquivo de script trigger_zap_scans para invocar a varredura zap adequada (api ou ui), conforme descrito aqui, e confiar no script de execução de varredura zap comum para executar uma varredura ZAP (ui ou api) para executar testes de penetração no seu aplicativo em execução.

Uma maneira alternativa é executar a(s) varredura(s) do zap em um subpipeline, conforme definido na implementação de referência, consulte hello-compliance-app.

Com essa configuração no arquivo de configuração do pipeline, o estágio dynamic-scan invocará o script trigger-async-zap.sh para acionar o estágio owasp-zap para iniciar a varredura da ferramenta Zed Attack Proxy (ZAP) em um subpipeline dedicado. Ele também conta com um script de execução de varredura de zap comum para executar uma varredura de ZAP (ui ou api) para executar testes de penetração em seu aplicativo em execução.

Parâmetros disponíveis para varreduras ZAP

Você pode definir e personalizar os seguintes parâmetros para configurar as varreduras do ZAP para executar testes de penetração em seu aplicativo em execução.

Parâmetros de configuração da varredura ZAP
Nome Tipo Descrição Obrigatório ou opcional
cluster-name Sequência O nome do cluster no qual você deseja que o scanner zap seja implantado e executado, se não estiver sendo executado em DinD. Necessário se não estiver sendo executado em DinD,, ou seja, zap-dind está definido como false.
ibmcloud-api Sequência Especifica o ambiente de nuvem para o cluster do ZAP. O padrão é https://cloud.ibm.com Necessário se não estiver sendo executado em DinD,, ou seja, zap-dind está definido como false.
ibmcloud-api-key Sequência Chave de API para implantar o ZAP em um cluster. Necessário se não estiver sendo executado em DinD,, ou seja, zap-dind está definido como false.
iam-token-endpoint Sequência O ponto de extremidade para recuperar o token para autenticação do IAM. O padrão é https://iam.cloud.ibm.com/identity/token Opcional, mas se fornecido, target-api-key também deve ser fornecido.
target-api-key Sequência Chave de API para autenticação do IAM. Opcional, mas se fornecido, iam-token-endpoint também deve ser fornecido.
target-application-server-url Sequência A base URL do servidor de aplicativos para que o zap faça a varredura. Ele pode ser o mesmo que o URL do aplicativo implantado. Obrigatório
filter-options Sequência Configure-o para filtrar os alertas com base na gravidade. Valores possíveis: Critical, High, Medium, Low, Informational. O padrão é Informational, pode ser uma lista separada por vírgulas. Opcional
zap-custom-api-policy-file-path Sequência Caminho relativo no repositório para o arquivo de política personalizado (formato XML) para varreduras da API ZAP. Se isso não for definido, a política padrão API-Minimal.policy será usada. Opcional
zap-custom-ui-policy-file-path Sequência Caminho relativo no repositório para o arquivo de política personalizado (formato XML) usado nas varreduras da UI do ZAP. Se esse caminho não for definido, será usada a política padrão default.policy. Opcional
zap-ui-scan Sequência Sinalizador para determinar se a varredura é a varredura da interface do usuário ou a varredura da API. Valores possíveis: true, false. Definir esse sinalizador como true executa a varredura da interface do usuário e defini-lo como falso executa a varredura da API. Esse parâmetro funciona com os parâmetros opt-in-dynamic-api-scan e opt-in-dynamic-ui-scan. Obrigatório
zap_dind Sequência Sinalizador para alternar entre a implantação do ZAP em um cluster ou a execução do DinD. Padrão: true. Valores possíveis: true, false. Configurá-lo para true executa o ZAP como DinD,. Configurá-lo para false implementa o ZAP em um cluster para o qual cluster-name, ibmcloud-api e ibmcloud-api-key devem ser definidos. Opcional
zap-dind-localhost Sequência Nome do host para os scanners ZAP quando executados em DinD, padrão: localhost. Opcional
zap-namespace Sequência Namespace para implantar a API ZAP e os scanners de UI no cluster, padrão: zap. Opcional para execução do ZAP em cluster, Not required para execução do ZAP em DinD.
zap-polling-interval Sequência Intervalo para os scanners pesquisarem o ZAP para a conclusão da varredura, padrão: 120s. Opcional
zap-artifact Sequência A chave do ativo para o artefato que deve ser escaneado por zapping e para o qual o collect-evidence deve ser chamado. O valor padrão é app-image. Opcional
zap_evidence_type Sequência O tipo de evidência para coleta de evidências para varreduras realizadas pelo ZAP, padrão: com.ibm.dynamic_scan. Opcional
show-container-log Sequência Sinalizador para ativar ou desativar o recurso de registro de contêineres para os scanners ZAP ao serem executados em DinD, padrão: false. Opcional
show-zap-log Sequência Sinalizador para ativar ou desativar o recurso de registro do servidor ZAP, padrão: false. Opcional

Configuração de varreduras da API ZAP

No repositório do seu aplicativo, você deve ter pelo menos um arquivo de definição de API no formato json. Esse arquivo de definição de API precisa ser uma definição válida de swagger ou openapi. Esses arquivos podem estar presentes em qualquer local dentro do repositório de aplicativos, por exemplo, em um diretório definitions. Para maior clareza, esses arquivos são mencionados da seguinte forma: definitions1.json, definitions2.json, e assim por diante.

Parâmetros de configuração da API ZAP
Nome Tipo Descrição Obrigatório ou opcional
zap-api-custom-script Sequência Caminho para o arquivo que contém a lógica de transformação da solicitação antes de iniciar a varredura da API ZAP. Obrigatório
swagger-definition-files Sequência Caminho para os arquivos que contêm as definições do Swagger. Pode ser uma lista separada por vírgulas. Obrigatório
zap-api-port Sequência Porta para executar o scanner da API do ZAP quando implantado em um cluster, padrão: 9086. Opcional
zap_api_deployment_name Sequência Nome da implantação do scanner de API ZAP, padrão: zap-api-deployment. Opcional
zap-api-image Sequência Defina esse parâmetro para usar uma imagem personalizada do scanner da API ZAP. Caso contrário, será usado o padrão IBM. Opcional
flatten-zap-api-scan-report Sequência Defina esse parâmetro como true para nivelar os resultados da varredura da API ZAP em um único arquivo html e json. Padrão false. Opcional

Crie um arquivo custom-api-script dentro do repositório do seu aplicativo, em um local de sua escolha, por exemplo, dentro do diretório scripts/zap-custom-scripts. Esse arquivo também pode ter um nome diferente e definir o caminho para esse arquivo com o parâmetro zap-api-custom-script.

Use o arquivo custom-api-script para modificar a solicitação que vai para o scanner ZAP. Os parâmetros que podem ser usados na carga útil da solicitação são os seguintes:

Parâmetros na carga útil da solicitação
Nome Tipo Descrição Obrigatório ou opcional
excludeScanTypes Matriz Lista de varreduras que o usuário deseja excluir. Lista completa de varreduras para você escolher: 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. Opcional
apisToScan Matriz Lista de APIs a serem examinadas juntamente com os parâmetros necessários. Se "apisToScan": ["all"] for mencionado, todas as APIs mencionadas na definição do swagger serão verificadas com dados simulados para parâmetros/corpo obrigatórios. Para personalizar essa matriz para ter APIs seletivas a serem examinadas, use esta subestrutura apisToScan: [ { "path": "/path/to/endpoint", method: "get" } ]. Obrigatório
globalExcludeUrls Matriz Matriz de URL regexes para instruir o ZAP a não procurar essas rotas. Por exemplo, "globalExcludeUrls": [ "^http://foo.bar$", "^http://john.doe$" ]. Opcional
authenticationType Sequência Mecanismo de autenticação para cabeçalhos de solicitação. Os mecanismos de autenticação compatíveis são Bearer, Basic ou ApiKey. Opcional
apiKey Sequência Se authenticationType não for enviado, essa chave de API será usada para a autenticação do IAM que é enviada no cabeçalho Authorization para todas as solicitações. Se authenticationType for definido como Bearer, o cabeçalho formado será Authorization: Bearer <apiKey>. Se authenticationType for definido como ApiKey, o cabeçalho formado será Authorization: <apiKey>. O campo é ignorado para authenticationType como Basic. Opcional
username Sequência Nome de usuário a ser usado para authenticationType Basic. Obrigatório se authenticationType for Basic
password Sequência Senha a ser usada para authenticationType Basic. Obrigatório se authenticationType for Basic

Para informações confidenciais, como credenciais, você deve ler esses valores em um cofre ou em um armazenamento secreto.

Configuração de varreduras da UI do ZAP

Defina o parâmetro zap-ui-scan como true para que a varredura da UI do ZAP seja executada.

Os parâmetros necessários para configurar as varreduras da interface do usuário do ZAP são os seguintes.

Parâmetros de configuração da UI do ZAP
Nome Tipo Descrição Obrigatório ou opcional
zap-ui-custom-script Sequência Caminho para o arquivo que contém a lógica de modificação da carga útil da varredura da interface do usuário, se necessário, antes que a varredura da interface do usuário do ZAP seja iniciada. Opcional
zap-ui-script-directory Sequência Caminho para o diretório que contém os testes da interface do usuário e os arquivos necessários para executar a varredura da interface do usuário. Obrigatório
context-file Sequência Caminho para um arquivo de contexto personalizado para varreduras da interface do usuário fornecidas ao ZAP. Opcional
zap-ui-auth-user Sequência Nome de usuário a ser usado para autorizar e executar o zap ui scan como. Isso requer o fornecimento do endereço context-file, que também deve conter as informações sobre a forma de autenticar esse usuário. Opcional
zap-ui-port Sequência Porta para executar o scanner da UI do ZAP quando implantado em um cluster, padrão: 9085. Opcional
zap_ui_deployment_name Sequência Nome da implantação do scanner da UI do ZAP, padrão: zap-ui-deployment. Opcional
zap-proxy-service Sequência Nome do serviço ZAP Proxy exigido pelo scanner da interface do usuário, padrão: zap-proxy-service. Opcional
zap-ui-image Sequência Defina esse parâmetro para usar uma imagem personalizada do scanner ZAP UI. Caso contrário, será usado o padrão IBM. Opcional
zap-proxy-image Sequência Defina isso para usar uma imagem personalizada do ZAP Proxy. Caso contrário, será usado o padrão IBM. Opcional

Crie uma pasta uiscripts dentro do diretório scripts/zap em seu repositório de aplicativos. Defina também esse caminho de pasta em relação a zap-ui-script-directory no arquivo trigger_zap_scans. Essa pasta também pode ser criada em qualquer outro lugar. O caminho deve ser ajustado para zap-ui-script-directory.

Crie um arquivo run.sh dentro do diretório uiscripts. O run.sh conduz os testes de interface do usuário. Podemos configurar testes baseados no Protractor ou em qualquer outra estrutura adequada.

Crie um arquivo export.sh dentro do diretório uiscripts. Esse arquivo contém todas as diferentes variáveis de ambiente que são necessárias para o uso da estrutura de teste. Defina esses valores de ambiente adicionando export <VARIABLE_NAME>=<VALUE>.

Para manter todas as informações de configuração da estrutura de teste, crie uma pasta conf dentro do diretório uiscripts para abrigar as informações de configuração da estrutura de teste.

Para obter uma implementação de referência que usa o Protractor como estrutura de teste, consulte hello-compliance-app.

Gerenciamento dos resultados do ZAP Scan

Com base no valor dos parâmetros opt-in-dynamic-api-scan e opt-in-dynamic-ui-scan, podemos optar por executar seletivamente a varredura de API, a varredura de UI ou ambas.

Por exemplo, dentro do arquivo trigger_zap_scans, é possível acionar varreduras individuais com base nos parâmetros de adesão da seguinte forma.

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

O COMMONS_PATH refere-se a um local que contém os scripts de compilação e os scripts de execução de várias ferramentas que fazem parte do pipeline DevSecOps. Para obter mais informações, consulte Scripts comuns.

Você pode calcular o sucesso da varredura ZAP definindo um código de saída com base na execução da varredura de API ou da varredura de UI. Todas as vulnerabilidades encontradas também são relatadas. Isso pode ser verificado acessando as variáveis api-scan-result e ui-scan-result.

Os valores possíveis que esses parâmetros podem assumir são success ou failure, e o padrão é 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

Configuração do escaneamento ZAP para o pipeline CC

A tabela a seguir lista os parâmetros adicionais necessários para executar varreduras ZAP dentro do pipeline CC.

Parâmetros ZAP no pipeline CC
Nome Tipo Descrição Obrigatório ou opcional
app-url Sequência URL do aplicativo implantado no qual a varredura ZAP é executada. Use a url staging do aplicativo. Obrigatório
repo-url Sequência URL do repositório do aplicativo implantado. Opcional, se o site inventory repo tiver todos os artefatos de apenas um repositório de aplicativos.

Configuração de varreduras da interface do usuário do Zap para usar imagens de teste da interface do usuário personalizadas sem compactar os testes da interface do usuário

A tabela a seguir lista os parâmetros adicionais necessários para configurar as varreduras de UI do ZAP para usar imagens de teste de UI personalizadas.

Parâmetros ZAP no pipeline CC
Nome Tipo Descrição Obrigatório ou opcional
zap-custom-ui-deployment-name Sequência Nome personalizado do contêiner do docker da interface do usuário. Opcional
zap-custom-ui-docker-run-param Sequência Docker executar parâmetros para executar a imagem de IU personalizada. Opcional
zap-custom-ui-exit-code-ignored Sequência A interface do usuário do Zap é encerrada com o código de saída da interface do usuário personalizada, mas seu código de saída será ignorado se essa variável for definida como true. Opcional
zap-custom-ui-image Sequência Imagem da janela de encaixe da interface do usuário personalizada que executa testes. Obrigatório
zap-custom-ui-post-script Sequência Script a ser executado após a execução da imagem da IU personalizada. Opcional
zap-custom-ui-pre-script Sequência Script a ser executado antes de executar a imagem da IU personalizada. Opcional
zap-custom-ui-progress-script Sequência Script a ser executado durante a execução da imagem da IU personalizada. Opcional
zap-custom-ui-timeout-in-sec Sequência O escaneamento da interface do usuário do Zap é encerrado após esse tempo. Opcional

Essa etapa de varredura de UI personalizada serve para usar as imagens de docker de UI personalizadas do usuário para testar as varreduras de UI do zap, em vez de colocar as informações da imagem de docker no arquivo zip, que é o caso padrão. zap-custom-ui-image é a variável de ambiente necessária a ser definida para configurar as varreduras de UI do ZAP para usar imagens de teste de UI personalizadas.