設定 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 掃描 (ui 或 api),以在您執行中的應用程式上執行滲透測試。
另一種方法是在參考實作中定義的子管道中執行 zap 掃描,請參閱 hello-compliance-app。
有了管道設定檔中的這項設定,dynamic-scan 階段會呼叫 trigger-async-zap.sh 指令碼,以觸發 owasp-zap 階段啟動 Zed Attack Proxy (ZAP) 工具在專用子管道中的掃描。 它還依賴 Common 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 |
字串 | 應用程式伺服器的基本 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-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 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 |
字串 | 請求標頭的驗證機制。 支援的認證機制為 Bearer、Basic 或 ApiKey。 |
選用 |
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-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.sh。run.sh 驅動 UI 測試。 我們可以配置基於 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 掃描或 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
為 CC 管道設定 ZAP 掃描
下表列出在 CC 管道 內執行 ZAP 掃描所需的附加參數。
| 名稱 | 類型 | 說明 | 必要或選用 |
|---|---|---|---|
app-url |
字串 | URL 執行 ZAP 掃描的已部署應用程式。 使用應用程式的 staging URL。 |
必要 |
repo-url |
字串 | URL 的儲存庫。 | 可選,如果 inventory repo 只有一個應用程式 repo 的所有工件。 |
設定 Zap UI 掃描以使用自訂的 UI 測試影像,而無須壓縮 UI 測試
下表列出了配置 ZAP UI 掃描使用自訂 UI 測試影像所需的其他參數。
| 名稱 | 類型 | 說明 | 必要或選用 |
|---|---|---|---|
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 測試影像所需的環境變數。