配置 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 扫描 (ui 或 api) 来对运行中的应用程序进行渗透测试。
另一种方法是在参考实现中定义的子管道中执行 zap 扫描,参见 hello-compliance-app。
有了管道配置文件中的这一配置,dynamic-scan 阶段将调用 trigger-async-zap.sh 脚本,触发 owasp-zap 阶段在专用子管道中启动 Zed Attack Proxy (ZAP) 工具扫描。 它还依靠 常见的 zap 扫描执行脚本 运行 ZAP 扫描(ui 或 api ),对运行中的应用程序进行渗透测试。
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-scan 和 opt-in-dynamic-ui-scan 参数一起使用。 |
必需 |
zap_dind |
字符串 | 在将 ZAP 部署到群集或运行 DinD 之间切换的标志。 默认值:true。 可能的值:true, false。将其设置为 true 会以 DinD, 的方式运行 ZAP,将其设置为 false 会将 ZAP 部署到集群中,集群中必须设置 cluster-name、ibmcloud-api 和 ibmcloud-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 定义文件必须是有效的 swagger 或 openapi 定义。 这些文件可以存在于应用程序资源库的任何位置,例如 definitions 目录内。 为清楚起见,这些文件的名称如下:definitions1.json, definitions2.json,等等。
| 名称 | 类型 | 描述 | 必需或可选 |
|---|---|---|---|
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 |
字符串 | 请求头的验证机制。 支持的验证机制有 Bearer、Basic 或 ApiKey。 |
可选 |
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-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.sh。run.sh 驱动用户界面测试。 我们可以配置基于 Protractor 的测试或任何其他合适的框架。
在 uiscripts 目录内创建一个文件 export.sh。 该文件包含测试框架需要使用的所有不同环境变量。 通过添加 export <VARIABLE_NAME>=<VALUE> 来设置这些环境值。
要保存测试框架的任何配置信息,请在 uiscripts 目录内创建 conf 文件夹,以存放测试框架的配置信息。
有关使用 Protractor 作为测试框架的参考实现,请参阅 hello-compliance-app。
管理 ZAP 扫描结果
根据 opt-in-dynamic-api-scan 和 opt-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-result 和 ui-scan-result 进行检查。
这些参数的可能取值为 success 或 failure,默认值为 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 扫描所需的附加参数。
| 名称 | 类型 | 描述 | 必需或可选 |
|---|---|---|---|
app-url |
字符串 | URL 运行 ZAP 扫描的已部署应用程序的名称。 使用应用程序的 staging 网址。 |
必需 |
repo-url |
字符串 | URL 的资源库。 | 可选,如果 inventory repo 只有一个应用程序软件仓库的所有工件。 |
配置 Zap UI 扫描以使用自定义 UI 测试图像,而无需压缩 UI 测试
下表列出了配置 ZAP UI 扫描使用自定义 UI 测试图像所需的附加参数。
| 名称 | 类型 | 描述 | 必需或可选 |
|---|---|---|---|
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 测试图像时必须设置的环境变量。