ZAP 스캔 구성
제드 공격 프록시(ZAP)는 무료 오픈 소스 모의 침투 테스트(PEN) 도구로, OWASP의 산하에 유지 관리되고 있습니다.ZAP은 테스터의 웹 브라우저와 웹 서버 사이에 있는 '중간자' 프록시입니다. ZAP은 패킷을 가로채고 필요한 경우 콘텐츠를 수정한 후 해당 패킷을 웹 서버로 전달합니다.
ZAP 스캔 실행
애플리케이션 리포지토리 내부(예: scripts 디렉토리 내부)에서 원하는 위치(예: trigger_zap_scans )에 ZAP 스캔을 시작하는 특정 스크립트를 생성하고 파이프라인-config 파일의 dynamic-scan 단계에서 이 스크립트를 호출할 수 있습니다.
trigger_zap_scans 스크립트 파일을 사용자 지정하여 여기 에 설명된 대로 적절한 ZAP 스캔(API 또는 UI)을 호출하고 일반적인 스냅 스캔 실행 스크립트 에 의존하여 실행 중인 앱에서 침투 테스트(ui 또는 api)를 실행할 수 있습니다.
다른 방법은 참조 구현에 정의된 대로 하위 파이프라인에서 zap 스캔을 실행하는 것입니다( hello-compliance-app 참조).
파이프라인 구성 파일에서 이 구성을 사용하면 dynamic-scan 단계에서 trigger-async-zap.sh 스크립트를 호출하여 owasp-zap 단계를 트리거하여 전용 하위 파이프라인에서 Zed 공격 프록시(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 |
문자열 | API 키를 사용하여 클러스터에 ZAP를 배포합니다. | 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 |
문자열 | Zap이 스캔할 애플리케이션 서버의 기본 URL. 배포된 애플리케이션의 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, 으로 실행됩니다. false 로 설정하면 cluster-name, ibmcloud-api,
ibmcloud-api-key 이 설정되어야 하는 클러스터에 ZAP을 배포합니다. |
선택사항 |
zap-dind-localhost |
문자열 | DinD, 기본값: localhost 에서 실행할 때 ZAP 스캐너의 호스트 이름. |
선택사항 |
zap-namespace |
문자열 | 클러스터에 ZAP API 및 UI 스캐너를 배포할 네임스페이스, 기본값: zap. |
클러스터에서 ZAP를 실행하는 경우 선택 사항, DinD 에서 실행하는 ZAP의 경우 Not required. |
zap-polling-interval |
문자열 | 스캐너가 스캔 완료를 위해 ZAP를 폴링하는 간격, 기본값: 120s. |
선택사항 |
zap-artifact |
문자열 | 재핑 스캔하고 증거 수집을 호출할 아티팩트의 에셋 키. 기본값은 app-image 입니다. |
선택사항 |
zap_evidence_type |
문자열 | ZAP에서 수행하는 스캔의 증거 수집을 위한 증거 유형, 기본값: com.ibm.dynamic_scan. |
선택사항 |
show-container-log |
문자열 | DinD, 기본값: false 에서 실행할 때 ZAP 스캐너의 컨테이너 로깅 기능을 활성화 또는 비활성화하기 위한 플래그입니다. |
선택사항 |
show-zap-log |
문자열 | ZAP 서버 로깅 기능을 활성화 또는 비활성화하기 위한 플래그, 기본값: false. |
선택사항 |
ZAP API 스캔 구성
애플리케이션 리포지토리에는 json 형식의 API 정의 파일이 하나 이상 있어야 합니다. 이 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"] 이 언급된 경우, 스웨거 정의에 언급된 모든 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 키는 모든 요청에 대해 권한 부여 헤더로 전송되는 IAM 인증에 사용됩니다. authenticationType 이 Bearer 으로 설정된 경우 형성되는 헤더는 Authorization: Bearer <apiKey> 입니다. authenticationType 이 ApiKey 으로 설정된 경우 형성되는 헤더는 Authorization: <apiKey> 입니다. Basic 으로 authenticationType 필드가 무시됩니다. |
선택사항 |
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 프록시 서비스의 이름, 기본값: zap-proxy-service. |
선택사항 |
zap-ui-image |
문자열 | 이 매개변수를 설정하면 사용자 지정 ZAP UI 스캐너 이미지를 사용할 수 있습니다. 그렇지 않으면 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 테스트를 구동합니다. 각도기 기반 테스트 또는 기타 적합한 프레임워크를 구성할 수 있습니다.
uiscripts 디렉터리 내에 export.sh 파일을 만듭니다. 이 파일에는 테스트 프레임워크가 사용하는 데 필요한 다양한 환경 변수가 모두 들어 있습니다. export <VARIABLE_NAME>=<VALUE> 을 추가하여 해당 환경 값을 설정합니다.
테스트 프레임워크에 대한 구성 정보를 보관하려면 uiscripts 디렉터리 내에 conf 폴더를 만들어 테스트 프레임워크의 구성 정보를 저장합니다.
각도기를 테스트 프레임워크로 사용하는 참조 구현에 대해서는 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 에 하나의 애플리케이션 리포지토리에만 모든 아티팩트가 있는 경우 선택 사항입니다. |
UI 테스트를 압축하지 않고 사용자 지정 UI 테스트 이미지를 사용하도록 Zap UI 스캔 구성하기
다음 표에는 사용자 지정 UI 테스트 이미지를 사용하도록 ZAP UI 스캔을 구성하는 데 필요한 추가 매개변수가 나와 있습니다.
| 이름 | 유형 | 설명 | 필수 또는 선택사항 |
|---|---|---|---|
zap-custom-ui-deployment-name |
문자열 | 사용자 지정 UI 도커 컨테이너 이름. | 선택사항 |
zap-custom-ui-docker-run-param |
문자열 | Docker 매개변수를 실행하여 사용자 지정 UI 이미지를 실행합니다. | 선택사항 |
zap-custom-ui-exit-code-ignored |
문자열 | Zap UI는 커스텀 UI 종료 코드를 사용하여 종료되지만 이 변수가 true 로 설정되어 있으면 종료 코드가 무시됩니다. |
선택사항 |
zap-custom-ui-image |
문자열 | 테스트를 실행하는 사용자 지정 UI 도커 이미지입니다. | 필수 |
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 스캔 단계는 기본 경우인 zip 파일에 도커 이미지 정보를 넣는 대신 사용자의 사용자 지정 UI 도커 이미지를 사용하여 zap UI 스캔을 테스트하는 단계입니다.
zap-custom-ui-image 는 사용자 지정 UI 테스트 이미지를 사용하도록 ZAP UI 스캔을 구성하기 위해 설정해야 하는 필수 환경 변수입니다.