IBM Cloud Docs
配置 ZAP 扫描

配置 ZAP 扫描

安全攻击代理 (ZAP) 是一种免费的开放式源代码渗透测试 (PEN) 工具,在 OWASP 的保护伞下进行维护。 ZAP 是一个“中间人”代理,位于测试人员的 Web 浏览器和 Web 服务器之间。 ZAP 拦截包,根据需要修改内容,并将这些包转发到 Web 服务器。

ZAP 扫描的可用参数

在应用程序存储库中的某个位置 (例如,在 scripts 目录中) 创建文件 trigger_zap_scans

通过将这些行添加到 trigger_zap_scans 来设置相应参数的值,如下所示- set_env <parameter name> <value>。有关参考实施的更多信息,请参阅 hello-compliance-app

您可以设置和定制以下参数,以配置 ZAP 扫描来对正在运行的应用程序运行渗透测试。

表 1. ZAP 扫描配置参数
名称 Type 描述 必需或可选
cluster-name 字符串 要从中部署和运行 zap 扫描程序的集群的名称 (如果未在 DinD中运行)。 如果未在 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 字符串 将其设置为根据严重性过滤掉警报。 可能的值: CriticalHighMediumLowInformational。缺省为 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 扫描的标志。 可能的值: truefalse。将此标志设置为 true 将运行 UI 扫描,将其设置为 false 将运行 API 扫描。 此参数与 opt-in-dynamic-api-scanopt-in-dynamic-ui-scan 参数配合使用。 必需
zap_dind 字符串 用于在将 ZAP 部署到集群或运行 DinD之间切换的标志。 缺省值: true。 可能的值: truefalse。将其设置为 true 会将 ZAP 作为 DinD运行,将其设置为 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 字符串 要扫描的工件以及要为其调用收集证据的工件的资产键,缺省值为 app-image 可选
zap_evidence_type 字符串 针对 ZAP 执行的扫描的证据收集的证据类型,缺省值: com.ibm.dynamic_scan 可选
show-container-log 字符串 用于在 DinD中运行时为 ZAP 扫描程序启用或禁用容器日志记录功能的标志,缺省值: false 可选
show-zap-log 字符串 用于启用或禁用 ZAP 服务器日志记录功能的标志,缺省值: false 可选

配置 ZAP API 扫描

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

配置 ZAP API 扫描需要更多参数。 可以通过将以下行添加到 trigger_zap_scans 来设置这些参数,如下所示- set_env <parameter name> <value>

表 2. ZAP API 配置参数
名称 Type 描述 必需或可选
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 可选

在应用程序存储库中的某个位置 (例如,在 scripts/zap-custom-scripts 目录中) 创建文件 custom-api-script。 此文件也可以以不同方式命名,并针对 zap-api-custom-script 参数设置此文件的路径。

使用文件 custom-api-script 来修改进入 ZAP 扫描程序的请求。 可在请求有效内容中使用的参数如下所示:

表 3. 请求有效内容中的参数
名称 Type 描述 必需或可选
excludeScanTypes Array 用户要排除的扫描的列表。 要选择的扫描的完整列表: CRLF_InjectionBuffer_OverflowDirectory_BrowsingExternal_RedirectFormat_String_ErrorParameter_TamperingRemote_File_InclusionScript_Active_ScanServer_Side_Code_InjectionServer_Side_IncludeSQL_InjectionXpath_InjectionXXE_External_EntitySOAP_Action_SpoofingSOAP_XML_InjectionRelative_Path_ConfusionRemote_OS_Command_InjectionElmahScanRuleHtAccessScanRule 可选
apisToScan Array 要扫描的 API 以及必需参数的列表。 如果提及 "apisToScan": ["all"],那么将使用必需参数/主体的模拟数据扫描 Swagger 定义中提及的所有 API。 要定制此数组以具有要扫描的选择性 API,请使用此子结构 apisToScan: [ { "path": "/path/to/endpoint", method: "get" } ] 必需
globalExcludeUrls Array URL 正则表达式数组,用于指示 ZAP 不扫描这些路径。 例如,"globalExcludeUrls": [ "^http://foo.bar$", "^http://john.doe$" ] 可选
authenticationType 字符串 请求头的认证机制。 受支持的认证机制为 BearerBasicApiKey 可选
apiKey 字符串 如果未发送 authenticationType,那么此 API 密钥将用于针对所有请求在 Authorization 头中发送的 IAM 认证。 如果 authenticationType 设置为 Bearer,那么构成的头为 Authorization: Bearer <apiKey>。 如果 authenticationType 设置为 ApiKey,那么构成的头为 Authorization: <apiKey>。 对于作为 BasicauthenticationType,将忽略字段。 可选
username 字符串 要用于 authenticationType Basic 的用户名。 authenticationType 作为 Basic 时必需
password 字符串 要用于 authenticationType Basic 的密码。 authenticationType 作为 Basic 时必需

对于诸如凭证之类的敏感信息,您必须从保险库文件或私钥库中读取这些值。

配置 ZAP UI 扫描

与配置 ZAP API 扫描类似,在应用程序存储库中的某个位置 (例如,在 scripts 目录中) 创建或更新文件 trigger_zap_scans

通过将这些行添加到 trigger_zap_scans 来设置相应参数的值,如下所示- set_env <parameter name> <value>。有关参考实施的更多信息,请参阅 hello-compliance-app

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

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

表 4. ZAP UI 配置参数
名称 Type 描述 必需或可选
zap-ui-custom-script 字符串 在启动 ZAP UI 扫描之前,包含 UI 扫描有效内容的修改逻辑的文件的路径 (如果需要)。 可选
zap-ui-script-directory 字符串 包含 UI 测试和运行 UI 扫描所需的文件的目录的路径。 必需
context-file 字符串 提供给 ZAP 的 UI 扫描的定制上下文文件的路径。 可选
zap-ui-port 字符串 用于在部署到集群时运行 ZAP UI 扫描程序的端口,缺省值: 9085 可选
zap_ui_deployment_name 字符串 ZAP UI 扫描程序部署的名称,缺省值: zap-ui-deployment 可选
zap-proxy-service 字符串 UI 扫描程序所需的 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 驱动 UI 测试。 我们可以配置基于量角器的测试或任何其他合适的框架。

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

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

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

管理 ZAP 扫描结果

根据参数 opt-in-dynamic-api-scanopt-in-dynamic-ui-scan 的值,我们可以选择选择性地运行 API 扫描和/或 UI 扫描。

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

可以在 此存储库中的 scripts/zap 目录内的 trigger_zap_scans 文件中找到样本实现。

为 CC 管道配置 ZAP 扫描

下表列出了在 CC 管道 中运行 ZAP 扫描所需的其他参数。

表 5. CC 管道中的 ZAP 参数
名称 Type 描述 必需或可选
app-url 字符串 运行 ZAP 扫描的已部署应用程序的 URL。 使用应用程序的 staging URL。 必需
repo-url 字符串 已部署应用程序的存储库的 URL。 可选 (如果 inventory repo 只有一个应用程序存储库中的所有工件)。

配置 Zap UI 扫描以使用定制 UI 测试图像而不压缩 UI 测试

下表列出了配置 ZAP UI 扫描以使用定制 UI 测试图像所需的其他参数。

表 6. CC 管道中的 ZAP 参数
名称 Type 描述 必需或可选
zap-custom-ui-deployment-name 字符串 定制 UI Docker 容器名称。 可选
zap-custom-ui-docker-run-param 字符串 Docker 运行参数以运行定制 UI 映像。 可选
zap-custom-ui-exit-code-ignored 字符串 具有定制 UI 退出代码的 Zap UI 退出,但如果此变量设置为 true,那么将忽略其退出代码。 可选
zap-custom-ui-image 字符串 运行测试的定制 UI Docker 映像。 必需
zap-custom-ui-post-script 字符串 要在运行定制 UI 图像之后执行的脚本。 可选
zap-custom-ui-pre-script 字符串 要在运行定制 UI 图像之前执行的脚本。 可选
zap-custom-ui-progress-script 字符串 运行定制 UI 图像时要执行的脚本。 可选
zap-custom-ui-timeout-in-sec 字符串 在此时间之后,Zap UI 扫描将退出。 可选

此定制 UI 扫描步骤是使用用户的定制 UI Docker 映像来测试 zap UI 扫描,而不是将 Docker 映像信息放入 zip 文件中 (这是缺省情况) 要配置 ZAP UI 扫描以使用定制 UI 测试图像,需要设置 zap-custom-ui-image 环境变量。