IBM Cloud Docs
設定 ZAP 掃描

設定 ZAP 掃描

Zed Attack Proxy (ZAP) 是 OWASP 旗下維護的免費開放原始碼滲透測試 (PEN) 工具。ZAP 是「中間人」代理伺服器,位於測試者的網路瀏覽器和網路伺服器之間。 ZAP 會攔截封包,在需要時修改內容,然後將這些封包轉送至網頁伺服器。

ZAP 掃描執行

您可以建立一個特定的腳本來啟動 ZAP 掃描,就像您應用程式儲存庫內的 trigger_zap_scans,在您選擇的位置,例如 scripts 目錄內,並在 dynamic-scan 階段的 pipeline-config 檔案中呼叫這個腳本。

您可以自訂 trigger_zap_scans 指令碼檔案,以啟用適當的 zap 掃描 (api 或 ui),如 這裡 所述,並依賴 Common zap 掃描執行指令碼來 執行 ZAP 掃描 (uiapi),以在您執行中的應用程式上執行滲透測試。

另一種方法是在參考實作中定義的子管道中執行 zap 掃描,請參閱 hello-compliance-app

有了管道設定檔中的這項設定,dynamic-scan 階段會呼叫 trigger-async-zap.sh 指令碼,以觸發 owasp-zap 階段啟動 Zed Attack Proxy (ZAP) 工具在專用子管道中的掃描。 它還依賴 Common 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 字串 應用程式伺服器的基本 URL,供 zap 掃描。 它可以與已部署應用程式的 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-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 定義檔必須是有效的 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 Scanner 影像。 否則會使用 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 陣列 使用者要排除的掃瞄清單。 可選擇的完整掃描清單: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 陣列 要掃描的 API 清單以及所需的參數。 如果提到 "apisToScan": ["all"],則會使用模擬資料掃描 swagger 定義中提到的所有 API,以取得必須的參數/body。 若要自訂此陣列,以便選擇性地掃描 API,請使用此子結構 apisToScan: [ { "path": "/path/to/endpoint", method: "get" } ] 必要
globalExcludeUrls 陣列 URL regexes 的陣列,指示 ZAP 不要掃描這些路徑。 例如,"globalExcludeUrls": [ "^http://foo.bar$", "^http://john.doe$" ] 選用
authenticationType 字串 請求標頭的驗證機制。 支援的認證機制為 BearerBasicApiKey 選用
apiKey 字串 如果未傳送 authenticationType,則此 API 金鑰會用於 IAM 驗證,而 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 UI 掃描啟動前,包含 UI 掃描有效負載修改邏輯的檔案路徑(若需要)。 選用
zap-ui-script-directory 字串 包含 UI 測試和執行 UI 掃描所需檔案的目錄路徑。 必要
context-file 字串 提供給 ZAP 用於 UI 掃描的自訂上下文檔案路徑。 選用
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 字串 UI 掃瞄器所需的 ZAP Proxy 服務名稱,預設值:zap-proxy-service 選用
zap-ui-image 字串 設定此參數可使用自訂的 ZAP UI Scanner 影像。 否則會使用 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 測試。 我們可以配置基於 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 掃描或 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

為 CC 管道設定 ZAP 掃描

下表列出在 CC 管道 內執行 ZAP 掃描所需的附加參數。

CC 管道中的 ZAP 參數
名稱 類型 說明 必要或選用
app-url 字串 URL 執行 ZAP 掃描的已部署應用程式。 使用應用程式的 staging URL。 必要
repo-url 字串 URL 的儲存庫。 可選,如果 inventory repo 只有一個應用程式 repo 的所有工件。

設定 Zap UI 掃描以使用自訂的 UI 測試影像,而無須壓縮 UI 測試

下表列出了配置 ZAP UI 掃描使用自訂 UI 測試影像所需的其他參數。

CC 管道中的 ZAP 參數
名稱 類型 說明 必要或選用
zap-custom-ui-deployment-name 字串 自訂 UI docker 容器名稱。 選用
zap-custom-ui-docker-run-param 字串 Docker run 參數來執行自訂 UI 映像。 選用
zap-custom-ui-exit-code-ignored 字串 Zap UI 會以自訂 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 image 來測試 zap 的 UI 掃描,而不是把 docker image 資訊放在 zip 檔案中,這是預設的情況。 zap-custom-ui-image 是設定 ZAP UI 掃描使用自訂 UI 測試影像所需的環境變數。