配置 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 扫描来对正在运行的应用程序运行渗透测试。
名称 | 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 |
字符串 | 将其设置为根据严重性过滤掉警报。 可能的值: 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 会将 ZAP 作为 DinD运行,将其设置为 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 |
字符串 | 要扫描的工件以及要为其调用收集证据的工件的资产键,缺省值为 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 定义文件需要是有效的 swagger
或 openapi
定义。 这些文件可以存在于应用程序存储库中的任何位置,例如,definitions
目录中。 为清楚起见,这些文件如下所示: definitions1.json
,definitions2.json
等。
配置 ZAP API 扫描需要更多参数。 可以通过将以下行添加到 trigger_zap_scans
来设置这些参数,如下所示- set_env <parameter name> <value>
。
名称 | 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 扫描程序的请求。 可在请求有效内容中使用的参数如下所示:
名称 | Type | 描述 | 必需或可选 |
---|---|---|---|
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 正则表达式数组,用于指示 ZAP 不扫描这些路径。 例如,"globalExcludeUrls": [ "^http://foo.bar$", "^http://john.doe$" ] 。 |
可选 |
authenticationType |
字符串 | 请求头的认证机制。 受支持的认证机制为 Bearer ,Basic 或 ApiKey 。 |
可选 |
apiKey |
字符串 | 如果未发送 authenticationType ,那么此 API 密钥将用于针对所有请求在 Authorization 头中发送的 IAM 认证。 如果 authenticationType 设置为 Bearer ,那么构成的头为 Authorization: Bearer <apiKey> 。 如果 authenticationType 设置为 ApiKey ,那么构成的头为 Authorization: <apiKey> 。 对于作为 Basic 的 authenticationType ,将忽略字段。 |
可选 |
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 扫描所需的参数如下所示。
名称 | 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.sh
。run.sh
驱动 UI 测试。 我们可以配置基于量角器的测试或任何其他合适的框架。
在 uiscripts
目录中创建文件 export.sh
。 此文件包含测试框架要使用的所有不同的环境变量。 通过添加 export <VARIABLE_NAME>=<VALUE>
来设置这些环境值。
要保存测试框架的任何配置信息,请在 uiscripts
目录中创建 conf
文件夹以存放测试框架的配置信息。
有关使用量角器作为测试框架的参考实现,请参阅 hello-compliance-app。
管理 ZAP 扫描结果
根据参数 opt-in-dynamic-api-scan
和 opt-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-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
可以在 此存储库中的 scripts/zap
目录内的 trigger_zap_scans
文件中找到样本实现。
为 CC 管道配置 ZAP 扫描
下表列出了在 CC 管道 中运行 ZAP 扫描所需的其他参数。
名称 | Type | 描述 | 必需或可选 |
---|---|---|---|
app-url |
字符串 | 运行 ZAP 扫描的已部署应用程序的 URL。 使用应用程序的 staging URL。 |
必需 |
repo-url |
字符串 | 已部署应用程序的存储库的 URL。 | 可选 (如果 inventory repo 只有一个应用程序存储库中的所有工件)。 |
配置 Zap UI 扫描以使用定制 UI 测试图像而不压缩 UI 测试
下表列出了配置 ZAP UI 扫描以使用定制 UI 测试图像所需的其他参数。
名称 | 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
环境变量。