IBM Cloud Docs
配置 ZAP 掃描

配置 ZAP 掃描

Zed Attack Proxy (ZAP) 是在 OWASP 的保護傘下維護的免費開放程式碼滲透測試 (PEN) 工具。 ZAP 是位於測試者 Web 瀏覽器與 Web 伺服器之間的「中間人」Proxy。 ZAP 會截取封包、修改內容 (必要的話),然後將那些封包轉遞至 Web 伺服器。

ZAP 掃描可用的參數

在應用程式儲存庫內,於您選擇的位置 (例如,在 scripts 目錄內) 建立檔案 trigger_zap_scans

將這些行新增至 trigger_zap_scans,以設定對應參數的值,如下所示- set_env <parameter name> <value>。如需參照實作的相關資訊,請參閱 hello-compliance-app

您可以設定並自訂下列參數,以配置 ZAP 掃描在執行中應用程式上執行滲透測試。

表 1. ZAP 掃描配置參數
名稱 類型 說明 必要或選用
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 字串 應用程式伺服器的基本 URL,供 zap 掃描。 它可以與已部署應用程式的 URL 相同。 必要
filter-options 字串 設定它以根據嚴重性來過濾出警示。 可能的值: CriticalHighMediumLowInformational。預設為 Informational,可以是以逗點區隔的清單。 選用
zap-custom-api-policy-file-path 字串 儲存庫中 ZAP API 掃描的自訂原則檔 (XML 格式) 的相對路徑。 如果未設定此原則,則會使用預設原則 API-Minimal.policy 選用
zap-custom-ui-policy-file-path 字串 儲存庫中用於 ZAP 使用者介面掃描的自訂原則檔 (XML 格式) 的相對路徑。 如果未設定此路徑,則會使用預設原則 default.policy 選用
zap-ui-scan 字串 決定掃描是使用者介面掃描還是 API 掃描的旗標。 可能的值: truefalse。將此旗標設為 true 會執行使用者介面掃描,將它設為 false 會執行 API 掃描。 此參數與 opt-in-dynamic-api-scanopt-in-dynamic-ui-scan 參數搭配使用。 必要
zap_dind 字串 在將 ZAP 部署至叢集或執行 DinD之間切換的旗標。 預設值: true。 可能的值: truefalse。將它設為 true 會以 DinD身分執行 ZAP,將它設為 false 會將 ZAP 部署至必須為其設定 cluster-nameibmcloud-apiibmcloud-api-key 的叢集。 選用
zap-dind-localhost 字串 在 DinD中執行時「ZAP 掃描器」的主機名稱,預設值: localhost 選用
zap-namespace 字串 在叢集裡部署 ZAP API 和使用者介面掃描器的名稱空間,預設值: zap 對於在叢集裡執行 ZAP,此為選用項目; 對於在 DinD中執行的 ZAP,此為 Not required
zap-polling-interval 字串 掃描器輪詢 ZAP 以完成掃描的間隔,預設值: 120s 選用
zap-artifact 字串 要掃描且要呼叫其 collect-evidence 之構件的資產索引鍵,預設值為 app-image 選用
zap_evidence_type 字串 ZAP 所執行掃描的證明收集證明類型,預設值: com.ibm.dynamic_scan 選用
show-container-log 字串 在 DinD中執行時,啟用或停用 ZAP 掃描器的儲存器記載功能的旗標,預設值: false 選用
show-zap-log 字串 啟用或停用 ZAP 伺服器記載功能的旗標,預設值: false 選用

配置 ZAP API 掃描

在應用程式儲存庫內,您必須至少呈現一個 API 定義檔,格式為 json。 此 API 定義檔必須是有效的 swaggeropenapi 定義。 這些檔案可以呈現在應用程式儲存庫內的任何位置,例如,在 definitions 目錄內。 為了明確說明,這些檔案如下所示: definitions1.jsondefinitions2.json 等。

配置 ZAP API 掃描需要更多參數。 透過將下列行新增至 trigger_zap_scans,可以設定這些參數,如下所示- set_env <parameter name> <value>

表 2. 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 選用

在應用程式儲存庫內,於您選擇的位置 (例如,在 scripts/zap-custom-scripts 目錄內) 建立檔案 custom-api-script。 此檔案也可以不同方式命名,並根據 zap-api-custom-script 參數設定此檔案的路徑。

使用檔案 custom-api-script 來修改進入 ZAP 掃描器的要求。 可以在要求有效負載中使用的參數如下:

表 3. 要求有效負載中的參數
名稱 類型 說明 必要或選用
excludeScanTypes 陣列 使用者想要排除的掃描清單。 掃描的完整清單可供選擇: 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 陣列 要掃描的 API 清單,以及必要的參數。 如果提及 "apisToScan": ["all"],則會使用必要參數/主體的模擬資料來掃描 Swagger 定義中提及的所有 API。 若要自訂此陣列以具有要掃描的選擇性 API,請使用此子結構 apisToScan: [ { "path": "/path/to/endpoint", method: "get" } ] 必要
globalExcludeUrls 陣列 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 的使用者名稱。 如果 authenticationTypeBasic,則為必要項目
password 字串 用於 authenticationType Basic 的密碼。 如果 authenticationTypeBasic,則為必要項目

對於機密資訊 (例如認證),您必須從儲存庫或密鑰儲存庫讀取這些值。

配置 ZAP 使用者介面掃描

類似於配置 ZAP API 掃描,在您選擇的位置 (例如,在 scripts 目錄內),建立或更新應用程式儲存庫內的 trigger_zap_scans 檔案。

將這些行新增至 trigger_zap_scans,以設定對應參數的值,如下所示- set_env <parameter name> <value>。如需參照實作的相關資訊,請參閱 hello-compliance-app

zap-ui-scan 參數設為 true,以執行 ZAP 使用者介面掃描。

配置 ZAP 使用者介面掃描所需的參數如下。

表 4. ZAP 使用者介面配置參數
名稱 類型 說明 必要或選用
zap-ui-custom-script 字串 在起始 ZAP 使用者介面掃描之前,包含使用者介面掃描有效負載之修改邏輯的檔案路徑 (必要的話)。 選用
zap-ui-script-directory 字串 包含使用者介面測試及執行使用者介面掃描所需檔案的目錄路徑。 必要
context-file 字串 提供給 ZAP 之使用者介面掃描的自訂環境定義檔路徑。 選用
zap-ui-port 字串 部署至叢集時用來執行 ZAP 使用者介面掃描器的埠,預設值: 9085 選用
zap_ui_deployment_name 字串 ZAP 使用者介面掃描器部署的名稱,預設值: zap-ui-deployment 選用
zap-proxy-service 字串 使用者介面掃描器所需的 ZAP Proxy 服務名稱,預設值: zap-proxy-service 選用
zap-ui-image 字串 設定此參數以使用自訂「ZAP 使用者介面掃描器」影像。 否則,會使用 IBM 預設值。 選用
zap-proxy-image 字串 設定此項以使用自訂 ZAP Proxy 映像檔。 否則,會使用 IBM 預設值。 選用

在應用程式儲存庫內的 scripts/zap 目錄內建立資料夾 uiscripts。 同時在 trigger_zap_scans 檔案中針對 zap-ui-script-directory 設定此資料夾路徑。 也可以在任何其他位置建立此資料夾。 應該針對 zap-ui-script-directory 調整路徑。

uiscripts 目錄內建立 run.sh 檔案。run.sh 會驅動使用者介面測試。 我們可以配置量角器型測試或任何其他適當的架構。

uiscripts 目錄內建立 export.sh 檔案。 這個檔案會保留測試架構使用所需的所有不同環境變數。 透過新增 export <VARIABLE_NAME>=<VALUE> 來設定那些環境值。

如果要保留測試架構的任何配置資訊,請在 uiscripts 目錄內建立 conf 資料夾,以儲存測試架構的配置資訊。

如需使用「量角器」作為測試架構的參照實作,請參閱 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 是指保留建置 Script 並針對 DevSec管線中的各種工具執行 Script 的位置。 如需相關資訊,請參閱 共用 Script

您可以根據是否執行 API 掃描或使用者介面掃描來設定結束碼,以計算 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 參數
名稱 類型 說明 必要或選用
app-url 字串 執行 ZAP 掃描之已部署應用程式的 URL。 使用應用程式的 staging URL。 必要
repo-url 字串 已部署應用程式之儲存庫的 URL。 如果 inventory repo 只具有來自一個應用程式儲存庫的所有構件,則為選用項目。

將 Zap 使用者介面掃描配置成使用自訂使用者介面測試影像,而不壓縮使用者介面測試

下表列出將 ZAP 使用者介面掃描配置成使用自訂使用者介面測試映像檔所需的其他參數。

表 6. CC 管線中的 ZAP 參數
名稱 類型 說明 必要或選用
zap-custom-ui-deployment-name 字串 自訂使用者介面 Docker 儲存器名稱。 選用
zap-custom-ui-docker-run-param 字串 Docker 執行參數,以執行自訂使用者介面映像檔。 選用
zap-custom-ui-exit-code-ignored 字串 Zap 使用者介面會以自訂使用者介面結束碼結束,但如果此變數設為 true,則會忽略它的結束碼。 選用
zap-custom-ui-image 字串 執行測試的自訂使用者介面 Docker 映像檔。 必要
zap-custom-ui-post-script 字串 執行自訂使用者介面映像檔之後要執行的 Script。 選用
zap-custom-ui-pre-script 字串 執行自訂使用者介面映像檔之前要執行的 Script。 選用
zap-custom-ui-progress-script 字串 執行自訂使用者介面映像檔時要執行的 Script。 選用
zap-custom-ui-timeout-in-sec 字串 Zap 使用者介面掃描在此時間之後結束。 選用

此自訂使用者介面掃描步驟是使用使用者的自訂使用者介面 Docker 映像檔來啟動 zap 使用者介面掃描,而不是將 Docker 映像檔資訊放置在 zip 檔中 (這是預設案例) 需要設定 zap-custom-ui-image 環境變數,以配置 ZAP 使用者介面掃描來使用自訂使用者介面測試映像檔。