문제 해결

다음 문제 해결 시나리오는 고객 지원 사례에서 수집되었습니다. 여기에서 다루지 않은 문제를 경험하거나 여기의 정보가 문제를 해결하지 못하는 경우 지원 티켓을 생성하세요. 더 자세한 내용은 GitLab 지원 페이지를 참조하세요.

문제가 발생했을 때

DAST 스캔에서 문제가 발생했을 때, 특정 오류 메시지가 있는 경우 알려진 문제를 확인하세요.

그렇지 않다면, 다음 질문에 답하여 문제를 파악해보세요:

예상되는 결과는 무엇인가요?

DAST 스캔과 관련하여 문제를 겪는 많은 사용자들은 스캐너가 수행해야 한다고 생각하는 것에 대한 대략적인 아이디어를 가지고 있습니다. 예를 들어, 특정 페이지를 스캔하지 않거나 페이지의 버튼을 선택하지 않습니다.

가능한 한 문제를 격리하여 해결책을 찾는 데 도움이 되도록 하세요. 예를 들어, DAST가 특정 페이지를 스캔하지 않는 경우, DAST는 해당 페이지를 어디서 찾았어야 했나요? 그곳에 도달하기 위해 어떤 경로를 사용했나요? DAST가 선택해야 했지만 선택하지 않은 참조 페이지의 요소가 있었나요?

결과가 사람이 달성할 수 있는 것인가요?

DAST는 사람이 애플리케이션을 수동으로 탐색할 수 없는 경우 애플리케이션을 스캔할 수 없습니다.

예상하는 결과를 알고, 머신에서 브라우저를 사용하여 수동으로 재현해보세요. 예를 들어:

  • 새로운 시크릿/개인 브라우저 창을 엽니다.
  • 개발자 도구를 엽니다. 오류 메시지를 위해 콘솔을 주의 깊게 살펴보세요.
    • Chrome: 보기 -> 개발자 -> 개발자 도구.
    • Firefox: 도구 -> 브라우저 도구 -> 웹 개발자 도구.
  • 인증하는 경우:
    • DAST_AUTH_URL로 이동합니다.
    • DAST_AUTH_USERNAME_FIELDDAST_AUTH_USERNAME을 입력합니다.
    • DAST_AUTH_PASSWORD_FIELDDAST_AUTH_PASSWORD를 입력합니다.
    • DAST_AUTH_SUBMIT_FIELD를 선택합니다.
  • 링크를 선택하고 양식을 채웁니다. 올바르게 스캔되지 않는 페이지로 이동합니다.
  • 애플리케이션이 어떻게 작동하는지 관찰합니다. 자동 스캐너에 문제가 될 수 있는 것이 있는지 주의하세요.

DAST가 작동하지 않을 이유가 있나요?

DAST는 다음과 같은 경우에 올바르게 스캔할 수 없습니다:

  • CAPTCHA가 있습니다. 스캔되는 애플리케이션의 테스트 환경에서 이를 끄세요.
  • 대상 애플리케이션에 접근할 수 없습니다. GitLab Runner가 DAST 구성에서 사용하는 URL을 통해 애플리케이션에 접근할 수 있는지 확인하세요.

귀하의 애플리케이션은 어떻게 작동하나요?

애플리케이션이 어떻게 작동하는지를 이해하는 것은 DAST 스캔이 작동하지 않는 이유를 파악하는 데 중요합니다. 예를 들어, 다음과 같은 상황에서는 추가 구성 설정이 필요할 수 있습니다.

  • 요소를 숨기는 팝업 모달이 있나요?
  • 로드된 페이지가 일정 시간 후에 dramatically하게 변하나요?
  • 애플리케이션의 로드 속도가 특히 느리거나 빠르나요?
  • 대상 애플리케이션이 로드되는 동안 덜덜거리나요?
  • 애플리케이션이 클라이언트의 위치에 따라 다르게 작동하나요?
  • 애플리케이션이 단일 페이지 애플리케이션인가요?
  • 애플리케이션이 HTML 양식을 제출하나요, 아니면 JavaScript와 AJAX를 사용하나요?
  • 애플리케이션이 웹소켓을 사용하나요?
  • 애플리케이션이 특정 웹 프레임워크를 사용하나요?
  • 버튼 선택이 양식 제출을 계속하기 전에 JavaScript를 실행하나요? 빠르거나 느리나요?
  • DAST가 요소나 페이지가 준비되기 전에 요소를 선택하거나 검색할 가능성이 있나요?

DAST가 하는 일은 무엇인가요?

로그는 DAST가 무엇을 하고 있는지 이해하는 가장 좋은 방법입니다:

브라우저 기반 분석기 로깅

분석기 로그는 스캔 문제를 진단하는 데 가장 유용한 도구 중 하나입니다. 분석기의 다양한 부분은 서로 다른 수준에서 로깅될 수 있습니다.

로그 메시지 형식

로그 메시지는 [time] [log level] [log module] [message] [additional properties] 형식을 가집니다.

예를 들어, 다음 로그 항목은 INFO 수준이며, CRAWL 로그 모듈의 일부로, 메시지는 Crawled path와 추가 속성 nav_idpath를 포함합니다.

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라는 작업 아티팩트입니다.

이 경로를 구성하려면 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 스코프 관리와 관련된 메시지를 로깅하는 데 사용됩니다.

예시 - 크롤링된 경로 로그

로그 모듈 CRAWLDEBUG로 설정하여 스캔의 크롤링 단계에서 발견된 탐색 경로를 기록합니다. 이는 DAST가 대상 애플리케이션을 올바르게 크롤링하고 있는지 이해하는 데 유용합니다.

include:
  - template: DAST.gitlab-ci.yml

dast:
  variables:
    DAST_LOG_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

크롬 개발자 도구 로깅

경고:

개발자 도구 메시지를 로깅하는 것은 보안 위험입니다. 출력에는 사용자 이름, 비밀번호 및 인증 토큰과 같은 비밀이 포함되어 있습니다.

출력은 GitLab 서버에 업로드되며, 작업 로그에서 볼 수 있습니다.

DAST 브라우저 기반 스캐너는 Chrome DevTools Protocol을 사용하여 크롬 브라우저를 조정합니다.

개발자 도구 메시지를 로깅하면 브라우저가 수행하는 작업에 대한 투명성을 제공하는 데 도움이 됩니다. 예를 들어, 버튼 선택이 작동하지 않는 경우, 개발자 도구 메시지가 원인이 브라우저 콘솔 로그의 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는 세미콜론으로 구분된 로깅 구성 목록을 허용합니다.

로깅 구성은 [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"

Chromium 로그

Chromium이 충돌하는 드문 경우, Chromium 프로세스의 STDOUTSTDERR를 로그로 기록하는 것이 도움이 될 수 있습니다. 환경 변수 DAST_LOG_BROWSER_OUTPUTtrue로 설정하면 이 목적을 달성합니다.

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 응답 본문이 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" 변수를 설정하여 도움이 되는지 확인하세요.

이 설정은 스캔의 성능을 상당히 저하할 수 있습니다.

필요할 때만 캐시를 비활성화해야 합니다.

구독이 있는 경우, 지원 티켓 생성하기를 통해 캐시가 웹사이트의 크롤링을 방해하는 이유를 조사하세요.