配置 ZAP 掃描
Zed Attack Proxy (ZAP) 是在 OWASP 的保護傘下維護的免費開放程式碼滲透測試 (PEN) 工具。 ZAP 是位於測試者 Web 瀏覽器與 Web 伺服器之間的「中間人」Proxy。 ZAP 會截取封包、修改內容 (必要的話),然後將那些封包轉遞至 Web 伺服器。
ZAP掃描執行
您可建立特定腳本以啟動 ZAP 掃描 trigger_zap_scans,例如在應用程式儲存庫內的指定位置(例如某個 scripts 目錄中),並在 pipeline-config 檔案的 build 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)工具掃描。 它還依賴 Common zap 掃描執行腳 本來執行 ZAP 掃描(ui 或 api),對您正在運行的應用程式執行滲透測試。
ZAP 掃描可用的參數
您可以設定並自訂下列參數,以配置 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 |
字串 | 設定它以根據嚴重性來過濾出警示。 可能的值: 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 使用者介面掃描的自訂原則檔 (XML 格式) 的相對路徑。 如果未設定此路徑,則會使用預設原則 default.policy。 |
選用 |
zap-ui-scan |
字串 | 決定掃描是使用者介面掃描還是 API 掃描的旗標。 可能的值: true、false。將此旗標設為 true 會執行使用者介面掃描,將它設為 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,預設值: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,預設值: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. |
選用 |
在應用程式儲存庫內,於您選擇的位置 (例如,在 scripts/zap-custom-scripts 目錄內) 建立檔案 custom-api-script。 此檔案也可以不同方式命名,並根據 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。 若要自訂此陣列以具有要掃描的選擇性 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 金鑰用於所有要求在 Authorization 標頭中傳送的 IAM 鑑別。 如果 authenticationType 設為 Bearer,則形成的標頭為 Authorization: Bearer <apiKey>。 如果 authenticationType 設為 ApiKey,則形成的標頭為 Authorization: <apiKey>。 對於作為 Basic 的 authenticationType,會忽略欄位。 |
選用 |
username |
字串 | 用於 authenticationType Basic 的使用者名稱。 |
如果 authenticationType 為 Basic,則為必要項目 |
password |
字串 | 用於 authenticationType Basic 的密碼。 |
如果 authenticationType 為 Basic,則為必要項目 |
對於機密資訊 (例如認證),您必須從儲存庫或密鑰儲存庫讀取這些值。
配置 ZAP 使用者介面掃描
將 zap-ui-scan 參數設為 true,以執行 ZAP 使用者介面掃描。
配置 ZAP 使用者介面掃描所需的參數如下。
| 名稱 | 類型 | 說明 | 必要或選用 |
|---|---|---|---|
zap-ui-custom-script |
字串 | 在起始 ZAP 使用者介面掃描之前,包含使用者介面掃描有效負載之修改邏輯的檔案路徑 (必要的話)。 | 選用 |
zap-ui-script-directory |
字串 | 包含使用者介面測試及執行使用者介面掃描所需檔案的目錄路徑。 | 必要 |
context-file |
字串 | 提供給 ZAP 之使用者介面掃描的自訂環境定義檔路徑。 | 選用 |
zap-ui-auth-user |
字串 | 用來授權和執行 zap ui 掃描的使用者名稱。 這需要提供 context-file,其中還應包含驗證此使用者的方式資訊。 |
選用 |
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-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管道中各種工具的建置腳本和執行腳本的位置。 如需相關資訊,請參閱 共用 Script。
您可以根據是否執行 API 掃描或使用者介面掃描來設定結束碼,以計算 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 只具有來自一個應用程式儲存庫的所有構件,則為選用項目。 |
將 Zap 使用者介面掃描配置成使用自訂使用者介面測試影像,而不壓縮使用者介面測試
下表列出將 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 使用者介面掃描來使用自訂使用者介面測試映像檔。