配置 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 掃描在執行中應用程式上執行滲透測試。
名稱 | 類型 | 說明 | 必要或選用 |
---|---|---|---|
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 會以 DinD身分執行 ZAP,將它設為 false 會將 ZAP 部署至必須為其設定 cluster-name 、ibmcloud-api 及 ibmcloud-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 定義檔必須是有效的 swagger
或 openapi
定義。 這些檔案可以呈現在應用程式儲存庫內的任何位置,例如,在 definitions
目錄內。 為了明確說明,這些檔案如下所示: definitions1.json
、definitions2.json
等。
配置 ZAP API 掃描需要更多參數。 透過將下列行新增至 trigger_zap_scans
,可以設定這些參數,如下所示- set_env <parameter name> <value>
。
名稱 | 類型 | 說明 | 必要或選用 |
---|---|---|---|
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 正規表示式的陣列,指示 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 API 掃描,在您選擇的位置 (例如,在 scripts
目錄內),建立或更新應用程式儲存庫內的 trigger_zap_scans
檔案。
將這些行新增至 trigger_zap_scans
,以設定對應參數的值,如下所示- set_env <parameter name> <value>
。如需參照實作的相關資訊,請參閱 hello-compliance-app。
將 zap-ui-scan
參數設為 true
,以執行 ZAP 使用者介面掃描。
配置 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-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
是指保留建置 Script 並針對 DevSec管線中的各種工具執行 Script 的位置。 如需相關資訊,請參閱 共用 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
您可以在 這個儲存庫內 scripts/zap
目錄內的 trigger_zap_scans
檔中找到範例實作。
配置 CC 管線的 ZAP 掃描
下表列出在 CC 管線 內執行 ZAP 掃描所需的其他參數。
名稱 | 類型 | 說明 | 必要或選用 |
---|---|---|---|
app-url |
字串 | 執行 ZAP 掃描之已部署應用程式的 URL。 使用應用程式的 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 使用者介面掃描來使用自訂使用者介面測試映像檔。