문제 해결
다음 문제 해결 시나리오들은 고객 지원 사례에서 수집되었습니다. 여기에 언급되지 않은 문제가 발생하거나 여기 있는 정보가 문제를 해결하지 못하는 경우, 고객 지원 티켓을 생성하세요. 자세한 내용은 GitLab 지원 페이지를 참조하세요.
뭔가 잘못될 때
DAST 스캔에 문제가 발생하면 특정 오류 메시지를 가지고 있다면 알려진 문제를 확인하세요.
그렇지 않은 경우, 다음 질문에 대답하여 문제를 발견하려고 노력하세요:
- 기대되는 결과는 무엇인가요?
- 결과는 사람에 의해 달성 가능한가요?
- DAST가 작동하지 않을 수 있는 이유가 있나요?
- 어떻게 애플리케이션이 작동하나요?
- DAST가 무엇을 하는 중인가요?
기대되는 결과는 무엇인가요?
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가 있는 경우. 스캔 대상 애플리케이션의 테스트 환경에서 이를 해제하세요.
- 대상 애플리케이션에 대한 액세스 권한이 없는 경우. DAST 구성에서 사용되는 URL을 통해 GitLab Runner가 애플리케이션에 액세스할 수 있도록 확인하세요.
어떻게 애플리케이션이 작동하나요?
애플리케이션이 어떻게 작동하는지 이해하는 것은 DAST 스캔이 작동하지 않는 이유를 파악하는 데 중요합니다. 예를 들어, 다음 상황들은 추가 구성 설정이 필요할 수 있습니다.
- 요소를 숨기는 팝업 모달이 있나요?
- 로드된 페이지가 일정 시간 이후에 극적으로 변경되나요?
- 애플리케이션의 로딩이 특히 느리거나 빠른가요?
- 대상 애플리케이션의 로딩 중에 끈적거리는가요?
- 애플리케이션이 클라이언트의 위치에 따라 다르게 작동하나요?
- 애플리케이션이 싱글 페이지 애플리케이션인가요?
- 애플리케이션이 HTML 양식을 제출하거나 JavaScript 및 AJAX를 사용하나요?
- 애플리케이션이 웹소켓을 사용하나요?
- 애플리케이션이 특정 웹 프레임워크를 사용하나요?
- 버튼을 선택하면 양식 제출 전에 JavaScript가 실행되나요? 실행 속도는 어떤가요?
- DAST가 준비된 요소나 페이지 전에 요소를 선택하거나 검색할 수 있나요?
DAST가 무엇을 하는 중인가요?
로그는 DAST가 무엇을 하는지 이해하는 데 가장 좋은 방법입니다:
- 브라우저 기반 분석기 로깅, 분석기가 하는 작업을 이해하는 데 유용합니다.
- Chromium DevTools 로깅, DAST와 Chromium 간의 통신을 검사하는 데 유용합니다.
- Chromium 로그, Chromium이 예기치 않게 충돌할 때 오류를 기록하는 데 유용합니다.
브라우저 기반 분석기 로깅
분석기 로그는 스캔 문제를 진단하는 데 가장 유용한 도구 중 하나입니다. 분석기의 다른 부분은 각기 다른 수준으로 로깅될 수 있습니다.
로그 메시지 형식
로그 메시지는 [시간] [로그 레벨] [로그 모듈] [메시지] [추가 속성]
형식을 가지고 있습니다.
예를 들어, 다음 로그 항목은 레벨이 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]"
로그 목적지
로그는 파일로 전송될 수도 있고 콘솔(컨테이너 상에서의 CI/CD 작업 로그)로 전송될 수도 있습니다. 각 목적지를 포함하여 다른 로그를 수용하도록 환경 변수 DAST_LOG_CONFIG
(콘솔 로그에 대해)와 DAST_LOG_FILE_CONFIG
(파일 로그에 대해)를 구성할 수 있습니다.
예:
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_BROWSER_SCAN: "true"
DAST_LOG_CONFIG: "auth:debug" # 콘솔 로그는 기본적으로 INFO 수준이며, AUTH 모듈을 DEBUG 수준으로 로깅함
DAST_LOG_FILE_CONFIG: "loglevel:debug,cache:warn" # 파일 로그는 기본적으로 DEBUG 수준이며, CACHE 모듈을 WARN 수준으로 로깅함
기본적으로 파일 로그는 gl-dast-scan.log
라는 작업 artifact입니다. 이 경로를 구성하려면 CI/CD 변수 DAST_LOG_FILE_PATH
를 수정하세요.
로그 수준
구성할 수 있는 로그 수준은 다음과 같습니다:
로그 모듈 | 구성 요약 | 상세 |
---|---|---|
TRACE
| 특정 기능의 내부 작업에 자주 사용됨 | |
DEBUG
| 기능의 내부 작업을 설명함. 진단 목적으로 사용됨 | |
INFO
| 스캔의 고수준 흐름과 결과를 설명함 | 지정하지 않은 경우 기본 레벨은 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
| 범위 관리와 관련된 메시지를 기록하는 데 사용됨. |
예제 - 크롤된 경로 로깅
크롤 단계에서 발견된 네비게이션 경로를 기록하려면 CRAWL
로그 모듈을 DEBUG
로 설정합니다. 이것은 DAST가 대상 응용 프로그램을 올바르게 크롤하고 있는지 이해하는 데 유용합니다.
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_LOG_CONFIG: "crawl:debug"
예를 들어, 다음 출력은 https://example.com
의 페이지 크롤 중 발견된 4개의 앵커 링크를 보여줍니다.
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 서버에 업로드되어 작업 로그에서 볼 수 있을 수 있습니다.
DAST 브라우저 기반 스캐너는 Chrome DevTools Protocol을 사용하여 Chromium 브라우저를 오케스트레이트합니다. DevTools 메시지를 기록하면 브라우저의 작업 내용을 명확하게 파악하는 데 도움이 됩니다. 예를 들어, 버튼을 선택하는 것이 작동하지 않는 경우, DevTools 메시지에서 CORS 오류가 원인임을 보여줄 수 있습니다. DevTools 메시지를 포함하는 로그는 매우 커질 수 있습니다. 이러한 이유로 짧은 지속 기간을 갖는 작업에만 활성화해야 합니다.
모든 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
는 로깅 구성의 세미콜론으로 구분된 목록을 허용합니다.
로깅 구성은 [도메인/메시지]:[무엇을 기록할지][,truncate:[최대 메시지 크기]]
구조를 사용하여 선언됩니다.
-
도메인/메시지
는 무엇을 로깅하는지를 참조합니다.-
기본(Default)
은 모든 도메인과 메시지를 나타내는 값으로 사용할 수 있습니다. - 도메인일 수 있으며, 예를 들어
Browser
,CSS
,Page
,Network
가 있습니다. - 메시지가 포함된 도메인일 수 있으며, 예를 들어
Network.responseReceived
가 있습니다. - 여러 구성이 적용되는 경우 가장 구체적인 구성이 사용됩니다.
-
-
무엇을 기록할지
는 로깅을 할지 여부와 내용을 참조합니다.-
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"
Chromium 로그
크로미움이 충돌하는 드문 경우에 크로미움 프로세스의 STDOUT
와 STDERR
를 기록하는 것이 도움이 될 수 있습니다. 환경 변수 DAST_LOG_BROWSER_OUTPUT
를 true
로 설정하면 이 목적을 달성할 수 있습니다.
DAST는 많은 크로미움 프로세스를 시작하고 중지합니다. DAST는 각 프로세스 출력을 모든 로그 대상으로 보내며, 로그 모듈 LEASE
와 로그 레벨 INFO
로 설정합니다.
예를 들어:
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_LOG_BROWSER_OUTPUT: "true"
알려진 문제
로그에 response body exceeds allowed size
포함
기본적으로 DAST는 HTTP 응답 본문이 10MB 이하인 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
구성을 사용하여 변경할 수 있습니다. 예를 들어,
include:
- template: DAST.gitlab-ci.yml
dast:
variables:
DAST_PAGE_MAX_RESPONSE_SIZE_MB: "25"
크롤러가 예상한 페이지에 도달하지 못함
DAST가 응용 프로그램 페이지를 잘못 캐시하면 DAST가 응용 프로그램을 제대로 크롤하지 못할 수 있습니다. 크롤러가 예상대로 페이지를 찾지 못하는 경우, DAST_USE_CACHE: "false"
변수를 설정하여 도움이 되는지 확인해보세요. 캐시를 비활성화하는 것은 스캔의 성능을 크게 저하시킬 수 있음에 유의하시기 바랍니다. 반드시 필요할 때에만 캐시를 비활성화하도록 하세요. 구독권이 있는 경우, 지원 티켓을 생성하여 캐시가 웹사이트 크롤링을 방해하는 이유를 조사하도록 하세요.