IBM Cloud Docs
配置 ZAP 扫描

配置 ZAP 扫描

Zed Attack Proxy (ZAP) 是一款免费开源渗透测试 (PEN) 工具,由 OWASP 负责维护。ZAP 是一种“中间人”代理,位于测试者的网络浏览器和网络服务器之间。 ZAP 拦截数据包,在必要时修改内容,然后将这些数据包转发到网络服务器。

执行 ZAP 扫描

您可以创建一个特定的脚本来启动 ZAP 扫描,比如在您选择的位置(如 scripts 目录内)创建应用程序存储库内的 trigger_zap_scans,并在管道配置文件的 dynamic-scan 阶段调用该脚本。

您可以自定义 trigger_zap_scans 脚本文件,以调用适当的 zap 扫描(api 或 ui),如 此处 所述,并依靠 通用 zap 扫描执行脚本 运行 ZAP 扫描 (uiapi) 来对运行中的应用程序进行渗透测试。

另一种方法是在参考实现中定义的子管道中执行 zap 扫描,参见 hello-compliance-app

有了管道配置文件中的这一配置,dynamic-scan 阶段将调用 trigger-async-zap.sh 脚本,触发 owasp-zap 阶段在专用子管道中启动 Zed Attack Proxy (ZAP) 工具扫描。 它还依靠 常见的 zap 扫描执行脚本 运行 ZAP 扫描(uiapi ),对运行中的应用程序进行渗透测试。

ZAP 扫描的可用参数

您可以设置和自定义以下参数,以配置 ZAP 扫描,在运行中的应用程序上运行渗透测试。

ZAP 扫描配置参数
名称 类型 描述 必需或可选
cluster-name 字符串 如果不在 DinD 中运行,则为您希望部署和运行 zap 扫描仪的群集名称。 如果不在 DinD, 中运行,即 zap-dind 设置为 false,则为必填项。
ibmcloud-api 字符串 指定 ZAP 群集的云环境。 缺省为 https://cloud.ibm.com 如果不在 DinD, 中运行,即 zap-dind 设置为 false,则为必填项。
ibmcloud-api-key 字符串 在集群上部署 ZAP 的 API 密钥。 如果不在 DinD, 中运行,即 zap-dind 设置为 false,则为必填项。
iam-token-endpoint 字符串 用于检索 IAM 身份验证令牌的端点。 缺省为 https://iam.cloud.ibm.com/identity/token 可选项,但如果提供,也必须提供 target-api-key
target-api-key 字符串 用于 IAM 身份验证的 API 密钥。 可选项,但如果提供,也必须提供 iam-token-endpoint
target-application-server-url 字符串 用于 zap 扫描的应用服务器的基本 URL。 它可以与已部署应用程序的 URL 相同。 必需
filter-options 字符串 设置为根据严重程度过滤警报。 可能的值:Critical, High, Medium, Low, Informational。默认为 Informational,可以是逗号分隔的列表。 可选
zap-custom-api-policy-file-path 字符串 存储库中用于 ZAP API 扫描的自定义策略文件(XML 格式)的相对路径。 如果未设置,将使用默认策略 API-Minimal.policy 可选
zap-custom-ui-policy-file-path 字符串 ZAP UI 扫描中使用的自定义策略文件(XML 格式)在存储库中的相对路径。 如果未设置该路径,则将使用默认策略 default.policy 可选
zap-ui-scan 字符串 标记,用于确定扫描是 UI 扫描还是 API 扫描。 可能的值:true, false。将此标志设置为 true 时,将运行 UI 扫描;将其设置为 false 时,将运行 API 扫描。 该参数与 opt-in-dynamic-api-scanopt-in-dynamic-ui-scan 参数一起使用。 必需
zap_dind 字符串 在将 ZAP 部署到群集或运行 DinD 之间切换的标志。 默认值:true。 可能的值:true, false。将其设置为 true 会以 DinD, 的方式运行 ZAP,将其设置为 false 会将 ZAP 部署到集群中,集群中必须设置 cluster-nameibmcloud-apiibmcloud-api-key 可选
zap-dind-localhost 字符串 在 DinD, 中运行时,ZAP 扫描仪的主机名默认为:localhost 可选
zap-namespace 字符串 在群集中部署 ZAP API 和 UI 扫描仪的命名空间,默认为:zap 在集群中运行 ZAP 时为可选项,在 DinD 中运行 ZAP 时为 Not required
zap-polling-interval 字符串 扫描仪轮询 ZAP 以完成扫描的时间间隔,默认值:120s 可选
zap-artifact 字符串 要进行 zap 扫描并调用 collect-evidence 的工件的资产密钥,默认值为 app-image 可选
zap_evidence_type 字符串 ZAP 执行扫描时收集证据的证据类型,默认为:com.ibm.dynamic_scan 可选
show-container-log 字符串 用于启用或禁用 ZAP 扫描仪在 DinD, 中运行时的容器记录功能的标志 默认值:false 可选
show-zap-log 字符串 启用或禁用 ZAP 服务器日志功能的标志,默认值:false 可选

配置 ZAP API 扫描

在应用程序存储库中,必须至少有一个 API 定义文件,格式为 json。 该 API 定义文件必须是有效的 swaggeropenapi 定义。 这些文件可以存在于应用程序资源库的任何位置,例如 definitions 目录内。 为清楚起见,这些文件的名称如下:definitions1.json, definitions2.json,等等。

ZAP API 配置参数
名称 类型 描述 必需或可选
zap-api-custom-script 字符串 在启动 ZAP API 扫描之前,包含请求转换逻辑的文件的路径。 必需
swagger-definition-files 字符串 包含 Swagger 定义的文件的路径。 可以是逗号分隔的列表。 必需
zap-api-port 字符串 部署到群集时运行 ZAP API 扫描仪的端口,默认为:9086 可选
zap_api_deployment_name 字符串 ZAP API 扫描仪部署的名称,默认为:zap-api-deployment 可选
zap-api-image 字符串 设置此参数可使用自定义 ZAP API 扫描仪图像。 否则,将使用 IBM 默认值。 可选
flatten-zap-api-scan-report 字符串 将此参数设置为 true,可将 ZAP API 扫描结果扁平化为单一的 html 和 json 文件。 默认 false. 可选

在应用程序版本库内创建一个文件 custom-api-script,位置由您选择,例如 scripts/zap-custom-scripts 目录内。 该文件也可以有不同的名称,并根据 zap-api-custom-script 参数设置该文件的路径。

使用文件 custom-api-script 修改进入 ZAP 扫描仪的请求。 请求有效载荷中可使用的参数如下:

请求有效载荷中的参数
名称 类型 描述 必需或可选
excludeScanTypes Array 用户希望排除的扫描列表。 可供选择的完整扫描列表: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 和,HtAccessScanRule 可选
apisToScan Array 要扫描的 API 列表及所需参数。 如果提到 "apisToScan": ["all"],则会使用模拟数据扫描 swagger 定义中提到的所有 API 的必选参数/主体。 要自定义该数组以选择要扫描的 API,请使用此子结构 apisToScan: [ { "path": "/path/to/endpoint", method: "get" } ] 必需
globalExcludeUrls Array URL regexes 数组,用于指示 ZAP 不要扫描这些路线。 例如,"globalExcludeUrls": [ "^http://foo.bar$", "^http://john.doe$" ] 可选
authenticationType 字符串 请求头的验证机制。 支持的验证机制有 BearerBasicApiKey 可选
apiKey 字符串 如果未发送 authenticationType,则该 API 密钥将用于 IAM 身份验证,并在所有请求的授权标头中发送。 如果 authenticationType 设置为 Bearer,则形成的标头为 Authorization: Bearer <apiKey>。 如果 authenticationType 设置为 ApiKey,则形成的标头为 Authorization: <apiKey>authenticationType 时,该字段将被忽略,因为 Basic 可选
username 字符串 用于 authenticationType Basic 的用户名。 如果 authenticationType 作为 Basic
password 字符串 用于 authenticationType Basic 的密码。 如果 authenticationType 作为 Basic

对于凭证等敏感信息,必须从保险库或秘密存储器中读取这些值。

配置 ZAP UI 扫描

zap-ui-scan 参数设置为 true,以便运行 ZAP UI 扫描。

配置 ZAP UI 扫描所需的参数如下。

ZAP UI 配置参数
名称 类型 描述 必需或可选
zap-ui-custom-script 字符串 ZAP 用户界面扫描启动前,包含用户界面扫描有效载荷修改逻辑(如需要)的文件路径。 可选
zap-ui-script-directory 字符串 包含用户界面测试和运行用户界面扫描所需文件的目录路径。 必需
context-file 字符串 向 ZAP 提供的用户界面扫描自定义上下文文件的路径。 可选
zap-ui-auth-user 字符串 用于授权和运行 zap ui 扫描的用户名。 这就需要提供 context-file,其中还应包含验证该用户的方法信息。 可选
zap-ui-port 字符串 部署到群集时运行 ZAP UI 扫描仪的端口,默认值:9085 可选
zap_ui_deployment_name 字符串 ZAP UI 扫描仪部署的名称,默认为:zap-ui-deployment 可选
zap-proxy-service 字符串 用户界面扫描仪所需的 ZAP 代理服务名称,默认为:zap-proxy-service 可选
zap-ui-image 字符串 设置此参数可使用自定义 ZAP UI 扫描仪图像。 否则,将使用 IBM 默认值。 可选
zap-proxy-image 字符串 将其设置为使用自定义 ZAP 代理镜像。 否则,将使用 IBM 默认值。 可选

在应用程序版本库中的 scripts/zap 目录内创建文件夹 uiscripts。 还可在 trigger_zap_scans 文件中针对 zap-ui-script-directory 设置该文件夹路径。 也可以在其他任何地方创建该文件夹。 应根据 zap-ui-script-directory 调整路径。

uiscripts 目录下创建一个文件 run.shrun.sh 驱动用户界面测试。 我们可以配置基于 Protractor 的测试或任何其他合适的框架。

uiscripts 目录内创建一个文件 export.sh。 该文件包含测试框架需要使用的所有不同环境变量。 通过添加 export <VARIABLE_NAME>=<VALUE> 来设置这些环境值。

要保存测试框架的任何配置信息,请在 uiscripts 目录内创建 conf 文件夹,以存放测试框架的配置信息。

有关使用 Protractor 作为测试框架的参考实现,请参阅 hello-compliance-app

管理 ZAP 扫描结果

根据 opt-in-dynamic-api-scanopt-in-dynamic-ui-scan 这两个参数的值,我们可以选择运行 API 扫描或用户界面扫描,或同时运行这两种扫描。

例如,在 trigger_zap_scans 文件中,可以根据以下选择参数触发单个扫描。

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 指的是一个存放构建脚本和运行脚本的位置,这些脚本是 DevSecOps 管道中各种工具的一部分。 更多信息,请参阅 常用脚本

您可以根据运行的是 API 扫描还是 UI 扫描,通过设置退出代码来计算 ZAP 扫描是否成功。 发现的任何漏洞也会报告。 这可以通过访问变量 api-scan-resultui-scan-result 进行检查。

这些参数的可能取值为 successfailure,默认值为 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

为 CC 管道配置 ZAP 扫描

下表列出了在 CC 管道 内运行 ZAP 扫描所需的附加参数。

CC 管道中的 ZAP 参数
名称 类型 描述 必需或可选
app-url 字符串 URL 运行 ZAP 扫描的已部署应用程序的名称。 使用应用程序的 staging 网址。 必需
repo-url 字符串 URL 的资源库。 可选,如果 inventory repo 只有一个应用程序软件仓库的所有工件。

配置 Zap UI 扫描以使用自定义 UI 测试图像,而无需压缩 UI 测试

下表列出了配置 ZAP UI 扫描使用自定义 UI 测试图像所需的附加参数。

CC 管道中的 ZAP 参数
名称 类型 描述 必需或可选
zap-custom-ui-deployment-name 字符串 自定义 UI docker 容器名称。 可选
zap-custom-ui-docker-run-param 字符串 Docker 运行参数来运行自定义用户界面图像。 可选
zap-custom-ui-exit-code-ignored 字符串 Zap UI 使用自定义 UI 退出代码退出,但如果该变量设置为 true,则其退出代码将被忽略。 可选
zap-custom-ui-image 字符串 运行测试的自定义用户界面 docker 镜像。 必需
zap-custom-ui-post-script 字符串 运行自定义用户界面图像后要执行的脚本。 可选
zap-custom-ui-pre-script 字符串 运行自定义用户界面图像前要执行的脚本。 可选
zap-custom-ui-progress-script 字符串 运行自定义用户界面图像时要执行的脚本。 可选
zap-custom-ui-timeout-in-sec 字符串 此时 Zap UI 扫描退出。 可选

自定义用户界面扫描步骤是为了使用用户自定义的用户界面 docker 镜像来测试 zap 的用户界面扫描,而不是将 docker 镜像信息放到 zip 文件中(这是默认情况)。 zap-custom-ui-image 是配置 ZAP UI 扫描使用自定义 UI 测试图像时必须设置的环境变量。