DAST 스캔 문제 해결
다음 문제 해결 시나리오는 고객 지원 사례에서 수집되었습니다. DAST 스캔에서 문제가 발생했을 때: 그렇지 않으면 다음 질문에 답하여 문제를 발견하세요: 처음으로 DAST를 설정할 때 다음 문제가 발생할 수 있습니다. 대상 URL을 정의하지 않고 DAST 템플릿을 포함하면 파이프라인이 구성 유효성 검사 중에 다음 오류와 함께 실패합니다:
다음 문제 해결 시나리오는 고객 지원 사례에서 수집되었습니다. 여기에서 다루지 않은 문제가 발생하거나 여기의 정보로 문제가 해결되지 않으면 지원 티켓을 생성하세요. 자세한 내용은 GitLab 지원 페이지를 참조하세요.
문제가 발생했을 때#
DAST 스캔에서 문제가 발생했을 때:
그렇지 않으면 다음 질문에 답하여 문제를 발견하세요:
DAST 설정#
처음으로 DAST를 설정할 때 다음 문제가 발생할 수 있습니다.
구성 유효성 검사 실패: 필수 필드 URL이 설정되지 않았습니다#
대상 URL을 정의하지 않고 DAST 템플릿을 포함하면 파이프라인이 구성 유효성 검사 중에 다음 오류와 함께 실패합니다:
ERR MAIN configuration validation failed error="the required field URL was not set"
이 오류는 DAST가 스캔할 URL을 알지 못한다는 것을 나타냅니다. 이 문제를 해결하려면 다음 방법 중 하나로 대상 URL을 정의하세요:
-
.gitlab-ci.yml파일에서DAST_TARGET_URLCI/CD 변수를 설정합니다:stages: - dast include: - template: Security/DAST.gitlab-ci.yml dast: variables: DAST_TARGET_URL: "https://example.com" -
프로젝트 루트에
environment_url.txt파일을 생성하고 대상 URL을 추가합니다. 동적 환경에서 애플리케이션을 테스트하는 데 이 방법을 사용합니다.
러너가 대상 애플리케이션에 연결할 수 없음#
러너가 대상 애플리케이션에 도달할 수 없으면 DAST 스캔이 연결 오류와 함께 실패합니다. 이는 일반적으로 네트워크 구성 또는 방화벽 문제로 인해 발생합니다.
DAST는 지정한 URL을 사용하여 애플리케이션에 연결해야 합니다:
DAST_TARGET_URL또는DAST_AUTH_URL에 포트 번호가 포함된 경우 러너가 해당 특정 포트에 접근할 수 있는지 확인합니다.- URL에 포트가 지정되지 않은 경우 DAST는 표준 포트를 사용합니다:
- HTTP URL의 경우 포트
80(예:http://example.com) - HTTPS URL의 경우 포트
443(예:https://example.com)
- HTTP URL의 경우 포트
연결 문제의 일반적인 원인:
- HTTP와 HTTPS 콘텐츠 혼합. 애플리케이션이 HTTP와 HTTPS를 모두 사용할 수 있습니다. 예를 들어 대상 URL이
http://example.com이지만 사이트가https://example.com에서 리소스를 로드하는 경우 러너가 두 포트에 모두 접근할 수 있는지 확인합니다. - 커스텀 포트. 애플리케이션이 비표준 포트에서 실행되는 경우
DAST_TARGET_URL에 포함합니다. 예:https://example.com:8443 - 방화벽 규칙. 애플리케이션이 방화벽 뒤에 있는 경우 러너의 IP 주소에서 트래픽을 허용하도록 규칙을 구성합니다.
- 내부 및 외부 네트워크. 러너가 애플리케이션에 접근할 수 있는 네트워크에 있는지 확인합니다. 예를 들어 내부 네트워크의 스테이징 환경에서 테스트하는 경우 같은 네트워크의 러너를 사용합니다.
대상 연결 문제#
DAST는 스캔을 시작하기 전에 대상 URL에 도달할 수 있는지 확인합니다. 대상 URL에 도달할 수 없으면 DAST는 문제를 진단하는 데 도움이 되는 자세한 오류 메시지를 생성합니다. 기본적으로 DAST는 60초까지 2초마다 연결을 재시도합니다. DAST_TARGET_CHECK_TIMEOUT으로 DAST가 연결을 재시도하는 시간을 구성할 수 있습니다.
연결 문제가 발생하면:
-
DAST_TARGET_URL구성을 확인합니다.- 호스트명, 포트 또는 프로토콜의 오타를 확인합니다.
- URL에 프로토콜(
http://또는https://)이 포함되어 있는지 확인합니다. - 포트 번호가 애플리케이션이 실행 중인 위치와 일치하는지 확인합니다.
-
러너에서 연결을 테스트합니다.
- 연결 테스트:
curl --verbose "http://your-target-url:port" - DNS 확인 확인:
nslookup your-hostname.com - 포트가 열려 있는지 확인:
nc -zv your-hostname.com port
- 연결 테스트:
-
애플리케이션이 실행 중인지 확인합니다.
- 애플리케이션이 성공적으로 시작되었는지 확인합니다.
- 시작 오류를 위해 애플리케이션 로그를 검토합니다.
- 데이터베이스와 API를 포함한 모든 종속성을 사용할 수 있는지 확인합니다.
-
네트워크와 방화벽 구성을 확인합니다.
- 방화벽 규칙이 필요한 포트에서 트래픽을 허용하는지 확인합니다.
- 내부 애플리케이션의 경우 러너가 내부 DNS 서버에 접근할 수 있는지 확인합니다.
-
애플리케이션이 시작하거나 정상 상태가 되는 데 시간이 오래 걸리면 시간 초과를 늘립니다:
variables: DAST_TARGET_CHECK_TIMEOUT: "5m" # 최대 5분 대기
DNS 조회 실패#
DNS lookup failed와 같은 오류가 표시될 수 있습니다.
이는 다음 이유로 DAST가 제공한 호스트명의 서버 주소를 찾을 수 없을 때 발생합니다:
DAST_TARGET_URL의 호스트명이 잘못되거나 맞춤법이 틀렸습니다.- 도메인이 등록되지 않았거나 존재하지 않습니다.
- 네트워크 또는 러너 환경에서 DNS 확인 문제가 있습니다.
연결 거부됨#
connection refused라는 오류가 표시될 수 있습니다.
이는 일반적으로 서버는 존재하지만 다음과 같은 상황일 때 발생합니다:
- 애플리케이션이 아직 시작을 완료하지 않았습니다.
- 애플리케이션이 지정된 것과 다른 포트에서 실행 중입니다.
- 방화벽이 러너와 애플리케이션 간의 연결을 차단하고 있습니다.
- 애플리케이션이 충돌하거나 시작에 실패했습니다.
대상이 HTTP 5xx 오류로 응답#
대상 애플리케이션이 HTTP 5xx 오류로 응답할 수 있습니다. 이는 애플리케이션에 도달할 수 있지만 500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable, 504 Gateway Timeout과 같은 서버 오류로 응답할 때 발생합니다.
다음과 같은 경우에 서버 오류가 발생할 수 있습니다:
- 애플리케이션이 시작 중이고 아직 완전히 준비되지 않았습니다.
- 애플리케이션에 구성 오류가 있습니다.
- 데이터베이스와 API와 같은 필수 종속성을 사용할 수 없습니다.
예상 결과는 무엇인가?#
DAST 스캔에서 문제를 겪은 많은 사용자는 스캐너가 무엇을 해야 하는지에 대한 좋은 높은 수준의 아이디어를 가지고 있습니다. 예를 들어, 특정 페이지를 스캔하지 않거나 페이지에서 버튼을 선택하지 않습니다.
가능한 한 문제를 격리하여 해결책 탐색을 좁혀보세요. 예를 들어 DAST가 특정 페이지를 스캔하지 않는 상황을 생각해보세요. DAST는 어디서 페이지를 찾았어야 했나요? 어떤 경로를 거쳐 거기에 도달해야 했나요? 참조 페이지에 DAST가 선택해야 했지만 선택하지 않은 요소가 있었나요?
사람이 달성할 수 있는 결과인가?#
사람이 수동으로 애플리케이션을 탐색할 수 없으면 DAST도 애플리케이션을 스캔할 수 없습니다.
예상하는 결과를 알고 있을 때, 사용 중인 기계의 브라우저를 사용하여 수동으로 재현해 보세요. 예를 들어:
- 새 시크릿/비공개 브라우저 창을 엽니다.
- 개발자 도구를 엽니다. 오류 메시지에 대한 콘솔을 주시하세요.
- Chrome에서:
보기 -> 개발자 -> 개발자 도구 - Firefox에서:
도구 -> 브라우저 도구 -> 웹 개발자 도구
- Chrome에서:
- 인증하는 경우:
DAST_AUTH_URL로 이동합니다.DAST_AUTH_USERNAME_FIELD에DAST_AUTH_USERNAME을 입력합니다.DAST_AUTH_PASSWORD_FIELD에DAST_AUTH_PASSWORD를 입력합니다.DAST_AUTH_SUBMIT_FIELD를 선택합니다.
- 링크를 선택하고 양식을 작성합니다. 올바르게 스캔되지 않는 페이지로 이동합니다.
- 애플리케이션의 작동 방식을 관찰합니다. 자동화된 스캐너에 문제를 일으킬 수 있는 것이 있는지 주목하세요.
DAST가 작동하지 않을 이유가 있는가?#
다음과 같은 경우 DAST가 올바르게 스캔할 수 없습니다:
- CAPTCHA가 있는 경우. 스캔 중인 애플리케이션의 테스트 환경에서 이를 비활성화합니다.
- 대상 애플리케이션에 접근할 수 없는 경우. GitLab Runner가 DAST 구성에 사용된 URL을 사용하여 애플리케이션에 접근할 수 있는지 확인합니다.
애플리케이션은 어떻게 작동하는가?#
애플리케이션이 어떻게 작동하는지 이해하는 것은 DAST 스캔이 작동하지 않는 이유를 파악하는 데 중요합니다. 예를 들어 다음과 같은 상황에서는 추가 구성 설정이 필요할 수 있습니다.
- 요소를 숨기는 팝업 대화 상자가 있나요?
- 로드된 페이지가 일정 시간 후에 극적으로 변하나요?
- 애플리케이션이 특히 느리거나 빠르게 로드되나요?
- 로드 중에 대상 애플리케이션이 불규칙하게 작동하나요?
- 애플리케이션이 클라이언트의 위치에 따라 다르게 작동하나요?
- 애플리케이션이 단일 페이지 애플리케이션인가요?
- 애플리케이션이 HTML 양식을 제출하나요, 아니면 JavaScript와 AJAX를 사용하나요?
- 애플리케이션이 웹소켓을 사용하나요?
- 애플리케이션이 특정 웹 프레임워크를 사용하나요?
- 버튼을 선택하면 양식 제출을 계속하기 전에 JavaScript가 실행되나요? 빠른가요, 느린가요?
- DAST가 요소나 페이지가 준비되기 전에 요소를 선택하거나 검색할 가능성이 있나요?
DAST는 무엇을 하고 있는가?#
히스토리
- 간결한 로그가 GitLab 18.3에서 도입되었습니다.
job 콘솔(CI/CD job 로그)은 DAST가 하는 일의 간결한 요약을 제공합니다. 더 자세한 진단 정보를 위해 세분화된 출력을 생성하도록 로그 파일을 구성할 수 있습니다.
다음 로깅 옵션을 사용할 수 있습니다:
- 진단 로그: 분석기가 하는 일을 이해하는 데 유용합니다.
- Chromium DevTools 로깅: DAST와 Chromium 간의 통신을 검사하는 데 유용합니다.
- Chromium 로그: Chromium이 예기치 않게 충돌할 때 오류를 기록하는 데 유용합니다.
진단 로그#
분석기 로그 파일을 사용하여 스캔 문제를 진단합니다. 분석기의 다른 부분을 다른 수준에서 기록할 수 있습니다.
로그 메시지 형식#
로그 메시지의 형식은 [time] [log level] [log module] [message] [additional properties]입니다.
예를 들어 다음 로그 항목은 레벨 INFO이며, CRAWL 로그 모듈의 일부이고, 메시지 Crawled path와 추가 속성 nav_id 및 path를 가집니다.
2021-04-21T00:34:04.000 INF CRAWL Crawled path nav_id=0cc7fd path="LoadURL [https://my.site.com:8090]"
로그 대상#
로그는 로그 파일 아티팩트로 전송됩니다. DAST_LOG_FILE_CONFIG 환경 변수를 사용하여 각 대상이 다른 로그를 수락하도록 구성할 수 있습니다.
예시:
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_BROWSER_SCAN: "true"
DAST_LOG_FILE_CONFIG: "loglevel:debug,cache:warn" # 파일 로그 기본값을 DEBUG 레벨로, CACHE 모듈은 WARN으로
기본적으로 파일 로그는 gl-dast-scan.log라는 job 아티팩트입니다.
이 경로를 구성하려면 DAST_LOG_FILE_PATH CI/CD 변수를 수정합니다.
로그 레벨#
구성할 수 있는 로그 레벨은 다음과 같습니다:
| 로그 모듈 | 구성 요소 개요 | 추가 정보 |
|---|---|---|
TRACE |
기능의 특정하고 종종 노이즈가 많은 내부 작업에 사용됩니다. | |
DEBUG |
기능의 내부 작동을 설명합니다. 진단 목적으로 사용됩니다. | |
INFO |
스캔의 높은 수준의 흐름과 결과를 설명합니다. | 지정하지 않으면 기본 레벨입니다. |
WARN |
DAST가 복구되어 스캔을 계속하는 오류 상황을 설명합니다. | |
FATAL/ERROR/PANIC |
종료 전에 복구할 수 없는 오류를 설명합니다. |
로그 모듈#
LOGLEVEL은 로그 대상의 기본 로그 레벨을 구성합니다. 다음 모듈 중 하나라도 구성되어 있으면,
DAST는 기본 로그 레벨 대신 해당 모듈의 로그 레벨을 사용합니다.
로깅을 위해 구성할 수 있는 모듈은 다음과 같습니다:
| 로그 모듈 | 구성 요소 개요 |
|---|---|
ACTIV |
활성 공격에 사용됩니다. |
AUTH |
인증된 스캔 생성에 사용됩니다. |
BPOOL |
크롤링을 위해 임대되는 브라우저 세트입니다. |
BROWS |
브라우저의 상태나 페이지를 쿼리하는 데 사용됩니다. |
CACHE |
캐시된 HTTP 리소스에 대한 캐시 히트 및 미스 보고에 사용됩니다. |
CHROM |
Chrome DevTools 메시지를 기록하는 데 사용됩니다. |
CONFG |
분석기 구성을 기록하는 데 사용됩니다. |
CONTA |
DevTools 메시지에서 HTTP 요청과 응답 부분을 수집하는 컨테이너에 사용됩니다. |
CRAWL |
핵심 크롤러 알고리즘에 사용됩니다. |
CRWLG |
크롤 그래프 생성기에 사용됩니다. |
DATAB |
내부 데이터베이스에 데이터를 유지하는 데 사용됩니다. |
LEASE |
브라우저 풀에 추가할 브라우저를 생성하는 데 사용됩니다. |
MAIN |
크롤러의 메인 이벤트 루프 흐름에 사용됩니다. |
NAVDB |
탐색 항목을 저장하기 위한 지속성 메커니즘에 사용됩니다. |
REGEX |
정규 표현식 실행 시 성능 통계를 기록하는 데 사용됩니다. |
REPT |
보고서 생성에 사용됩니다. |
STAT |
스캔 실행 중 일반 통계에 사용됩니다. |
VLDFN |
취약성 정의를 로드하고 파싱하는 데 사용됩니다. |
WEBGW |
활성 검사 실행 시 대상 애플리케이션으로 전송되는 메시지를 기록하는 데 사용됩니다. |
SCOPE |
범위 관리와 관련된 메시지를 기록하는 데 사용됩니다. |
SECURE_LOG_LEVEL#
히스토리
- GitLab 17.11에서 도입되었습니다.
DAST_LOG_FILE_CONFIG로 로그 모듈을 구성하는 더 간단한 대안으로 SECURE_LOG_LEVEL을 설정할 수 있습니다:
- 지원되는 로그 레벨 중 하나로 설정합니다. 이렇게 하면 지정된 레벨이 모든 모듈에 대한 로그 파일의 기본 로그 레벨이 됩니다.
debug또는trace로 설정하면 인증 보고서를 활성화합니다.trace로 설정하면 DevTools 로깅을 활성화합니다.
예시:
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
SECURE_LOG_LEVEL: "trace"
# 다음과 동일합니다:
# DAST_LOG_FILE_CONFIG: "loglevel:trace"
# DAST_LOG_DEVTOOLS_CONFIG: "Default:messageAndBody,truncate:2000"
# DAST_AUTH_REPORT: "true"
DAST_LOG_FILE_CONFIG, DAST_LOG_DEVTOOLS_CONFIG, DAST_AUTH_REPORT의 설정은 SECURE_LOG_LEVEL의 설정을 재정의합니다.
예시 - 크롤링된 경로 기록#
로그 파일 모듈 CRAWL을 DEBUG로 설정하여 스캔의 크롤 단계 중에 발견된 탐색 경로를 로그 파일에 기록합니다. DAST가 대상 애플리케이션을 올바르게 크롤링하고 있는지 이해하는 데 유용합니다.
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_LOG_FILE_CONFIG: "crawl:debug"
예를 들어 다음 출력은 https://example.com의 페이지 크롤 중에 발견된 네 개의 앵커 링크를 보여줍니다.
2022-11-17T11:18:05.578 DBG CRAWL executing step nav_id=6ec647d8255c729160dd31cb124e6f89 path="LoadURL [https://example.com]" step=1
...
2022-11-17T11:18:11.900 DBG CRAWL found new navigations browser_id=2243909820020928961 nav_count=4 nav_id=6ec647d8255c729160dd31cb124e6f89 of=1 step=1
2022-11-17T11:18:11.901 DBG CRAWL adding navigation action="LeftClick [a href=/page1.html]" nav=bd458cc1fc2d7c6fb984464b6d968866 parent_nav=6ec647d8255c729160dd31cb124e6f89
2022-11-17T11:18:11.901 DBG CRAWL adding navigation action="LeftClick [a href=/page2.html]" nav=6dcb25f9f9ece3ee0071ac2e3166d8e6 parent_nav=6ec647d8255c729160dd31cb124e6f89
2022-11-17T11:18:11.901 DBG CRAWL adding navigation action="LeftClick [a href=/page3.html]" nav=89efbb0c6154d6c6d85a63b61a7cdc6f parent_nav=6ec647d8255c729160dd31cb124e6f89
2022-11-17T11:18:11.901 DBG CRAWL adding navigation action="LeftClick [a href=/page4.html]" nav=f29b4f4e0bdee70f5255de7fc080f04d parent_nav=6ec647d8255c729160dd31cb124e6f89
Chromium DevTools 로깅#
DevTools 메시지 로깅은 보안 위험입니다. 출력에는 사용자 이름, 암호 및 인증 토큰과 같은 시크릿이 포함됩니다. 출력은 GitLab 서버에 업로드되어 job 로그에 표시될 수 있습니다.
DAST 브라우저 기반 스캐너는 Chrome DevTools 프로토콜을 사용하여 Chromium 브라우저를 조율합니다. DevTools 메시지를 기록하면 브라우저가 하는 일에 대한 투명성을 제공하는 데 도움이 됩니다. 예를 들어 버튼 선택이 작동하지 않으면 DevTools 메시지가 원인이 브라우저 콘솔 로그의 CORS 오류임을 보여줄 수 있습니다. DevTools 메시지가 포함된 로그는 크기가 매우 커질 수 있습니다. 이 때문에 짧은 기간의 job에서만 활성화해야 합니다.
모든 DevTools 메시지를 기록하려면 CHROM 로그 모듈을 trace로 설정하고 로깅 레벨을 구성합니다. 다음은 DevTools 로그의 예시입니다:
2022-12-05T06:27:24.280 TRC CHROM event received {"method":"Fetch.requestPaused","params":{"requestId":"interception-job-3.0","request":{"url":"http://auth-auto:8090/font-awesome.min.css","method":"GET","headers":{"Accept":"text/css,*/*;q=0.1","Referer":"http://auth-auto:8090/login.html","User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/105.0.5195.102 Safari/537.36"},"initialPriority":"VeryHigh","referrerPolicy":"strict-origin-when-cross-origin"},"frameId":"A706468B01C2FFAA2EB6ED365FF95889","resourceType":"Stylesheet","networkId":"39.3"}} method=Fetch.requestPaused
2022-12-05T06:27:24.280 TRC CHROM request sent {"id":47,"method":"Fetch.continueRequest","params":{"requestId":"interception-job-3.0","headers":[{"name":"Accept","value":"text/css,*/*;q=0.1"},{"name":"Referer","value":"http://auth-auto:8090/login.html"},{"name":"User-Agent","value":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/105.0.5195.102 Safari/537.36"}]}} id=47 method=Fetch.continueRequest
2022-12-05T06:27:24.281 TRC CHROM response received {"id":47,"result":{}} id=47 method=Fetch.continueRequest
DevTools 로그 레벨 사용자 지정#
Chrome DevTools 요청, 응답 및 이벤트는 도메인별로 네임스페이스가 지정됩니다. DAST는 각 도메인과 메시지가 있는 각 도메인이 서로 다른 로깅 구성을 가질 수 있도록 허용합니다.
DAST_LOG_DEVTOOLS_CONFIG 환경 변수는 세미콜론으로 구분된 로깅 구성 목록을 허용합니다.
로깅 구성은 [domain/message]:[what-to-log][,truncate:[max-message-size]] 구조를 사용하여 선언됩니다.
domain/message는 기록할 내용을 참조합니다.Default는 모든 도메인과 메시지를 나타내는 값으로 사용할 수 있습니다.Browser,CSS,Page,Network와 같은 도메인일 수 있습니다.Network.responseReceived와 같은 메시지가 있는 도메인일 수 있습니다.- 여러 구성이 적용되는 경우 가장 구체적인 구성이 사용됩니다.
what-to-log는 기록할지 여부와 무엇을 기록할지를 참조합니다.message는 메시지가 수신되었음을 기록하되 메시지 내용은 기록하지 않습니다.messageAndBody는 메시지 내용과 함께 메시지를 기록합니다.truncate와 함께 사용하는 것을 권장합니다.suppress는 메시지를 기록하지 않습니다. 노이즈가 많은 도메인과 메시지를 침묵시키는 데 사용됩니다.
truncate는 출력된 메시지의 크기를 제한하기 위한 선택적 구성입니다.
예시 - 모든 DevTools 메시지 기록#
어디서 시작해야 할지 모를 때 모든 것을 기록하는 데 사용됩니다.
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_LOG_FILE_CONFIG: "chrom:trace"
DAST_LOG_DEVTOOLS_CONFIG: "Default:messageAndBody,truncate:2000"
예시 - HTTP 메시지 기록#
리소스가 올바르게 로드되지 않을 때 유용합니다. HTTP 메시지 이벤트가 기록되며 요청을 계속하거나 실패할지에 대한 결정도 기록됩니다. 브라우저 콘솔의 오류도 기록됩니다.
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_LOG_FILE_CONFIG: "chrom:trace"
DAST_LOG_DEVTOOLS_CONFIG: "Default:suppress;Fetch:messageAndBody,truncate:2000;Network:messageAndBody,truncate:2000;Log:messageAndBody,truncate:2000;Console:messageAndBody,truncate:2000"
job 콘솔 출력 재정의#
기본적으로 job 콘솔은 DAST 활동의 간결한 요약을 표시합니다.
전체 진단 로그를 job 콘솔로 출력하려면 DAST_FF_DIAGNOSTIC_JOB_OUTPUT과 DAST_LOG_CONFIG 변수를 모두 설정합니다:
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_FF_DIAGNOSTIC_JOB_OUTPUT: "true"
DAST_LOG_CONFIG: "crawl:debug" # 콘솔 로그 기본값은 INFO 레벨, AUTH 모듈은 DEBUG로
이슈 552171은 GitLab 19.0에서 이 옵션을 제거할 것을 제안합니다.
Chromium 로그#
드물게 Chromium이 충돌하는 경우 Chromium 프로세스 STDOUT 및 STDERR을 로그에 쓰는 것이 도움이 될 수 있습니다.
DAST_LOG_BROWSER_OUTPUT 환경 변수를 true로 설정하면 이 목적을 달성할 수 있습니다.
DAST는 많은 Chromium 프로세스를 시작하고 중지합니다. DAST는 각 프로세스 출력을 로그 모듈 LEASE와 로그 레벨 INFO로 모든 로그 대상으로 전송합니다.
예시:
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_LOG_BROWSER_OUTPUT: "true"
알려진 문제#
로그에 response body exceeds allowed size가 포함됨#
기본적으로 DAST는 HTTP 응답 본문이 10 MB 이하인 HTTP 요청을 처리합니다. 그렇지 않으면 DAST는 응답을 차단하여 스캔이 실패할 수 있습니다. 이 제약은 스캔 중 메모리 소비를 줄이기 위한 것입니다.
예시 로그는 다음과 같습니다. DAST가 크기가 제한을 초과하여 https://example.com/large.js에서 발견된 JavaScript 파일을 차단했습니다:
2022-12-05T06:28:43.093 WRN BROWS response body exceeds allowed size allowed_size_bytes=1000000 browser_id=752944257619431212 nav_id=ae23afe2acbce2c537657a9112926f1a of=1 request_id=interception-job-2.0 response_size_bytes=9333408 step=1 url=https://example.com/large.js
2022-12-05T06:28:58.104 WRN CONTA request failed, attempting to continue scan error=net::ERR_BLOCKED_BY_RESPONSE index=0 requestID=38.2 url=https://example.com/large.js
DAST_PAGE_MAX_RESPONSE_SIZE_MB 구성을 사용하여 변경할 수 있습니다. 예시:
dast:
variables:
DAST_PAGE_MAX_RESPONSE_SIZE_MB: "25"
크롤러가 예상 페이지에 도달하지 않음#
캐시 비활성화 시도#
DAST가 애플리케이션 페이지를 잘못 캐시하면 DAST가 애플리케이션을 제대로 크롤링할 수 없게 될 수 있습니다. 크롤러가 일부 페이지를 예기치 않게 찾지 못하는 경우 DAST_USE_CACHE: "false" 변수를 설정하여 도움이 되는지 확인하세요. 이로 인해 스캔 성능이 크게 저하될 수 있습니다. 절대적으로 필요한 경우에만 캐시를 비활성화하세요. 구독이 있는 경우 캐시가 웹사이트 크롤링을 방해하는 이유를 조사하기 위해 지원 티켓을 생성하세요.
대상 경로 직접 지정#
크롤러는 일반적으로 정의된 대상 URL에서 시작하여 사이트와 상호 작용하여 추가 페이지를 찾으려고 합니다. 하지만 크롤러가 시작할 경로를 직접 지정하는 두 가지 방법이 있습니다:
- sitemap.xml 사용: 사이트맵은 웹사이트의 페이지를 지정하는 잘 정의된 프로토콜입니다. DAST의 크롤러는
<target URL>/sitemap.xml에서 sitemap.xml 파일을 찾고 지정된 모든 URL을 크롤러의 시작점으로 사용합니다. 사이트맵 인덱스 파일은 지원되지 않습니다. DAST_TARGET_PATHS사용: 이 구성 변수를 사용하면 크롤러의 입력 경로를 지정할 수 있습니다. 예시:DAST_TARGET_PATHS: /,/page/1.html,/page/2.html
요청이 차단되지 않는지 확인#
기본적으로 DAST는 대상 URL 도메인에 대한 요청만 허용합니다. 웹사이트가 대상의 도메인이 아닌 다른 도메인에 요청하는 경우 DAST_SCOPE_ALLOW_HOSTS를 사용하여 해당 호스트를 지정합니다. 예시: "example.com"이 인증 토큰을 갱신하기 위해 "auth.example.com"에 인증 요청을 합니다. 해당 도메인이 허용되지 않아 요청이 차단되고 크롤러가 새 페이지를 찾지 못합니다.
최대 액션 수와 크롤러 시간 초과#
크롤러는 대상 사이트의 활동과 소요 시간에 대한 기본 제한이 있습니다:
- 기본적으로 크롤러는 10,000개의 액션을 처리합니다. 액션은 링크 선택이나 양식 작성일 수 있습니다. 크롤러가 이 제한을 초과하면 디버그 레벨 로그
not adding navigation as it exceeds max actions가 표시됩니다. - 기본적으로 크롤러는 최대 24시간 동안 실행됩니다. 이 시간 제한을 초과하면 트레이스 레벨 로그
crawl complete, timed out이 표시됩니다.
크롤러가 이러한 제한 중 하나에 도달하면 스캐너가 중지되고 대상 웹사이트를 완전히 커버할 수 없습니다. 따라서 이러한 제한을 초과하면 스캔 중에 문제가 있거나 최적화 기회가 있음을 나타낼 수 있습니다.
애플리케이션에 비슷한 구조이지만 다른 데이터를 가진 템플릿 기반 페이지가 있거나
URL 패턴(예: /products/item-123, /products/item-456, /products/item-789)을 발견하면
그룹화된 URL을 구성하여 보안 커버리지를 유지하면서 스캔 시간을 줄이세요.
그룹화된 URL은 많은 제품 페이지가 있는 이커머스 사이트, 콘텐츠 기반 사이트 또는 검색 인터페이스
(예: /search?q=term&page=1, /search?q=term&page=2)에 적합합니다.
스캔 시간 관리에 대한 자세한 정보는 스캔 시간 관리를 참조하세요.
다른 전략이 적합하지 않고 대상 사이트가 광범위한 경우 크롤러 시간 초과(DAST_CRAWL_TIMEOUT) 또는
최대 액션 수(DAST_CRAWL_MAX_ACTIONS)를 늘리세요.
