인증

완벽한 커버리지를 위해 DAST 분석기는 테스트되는 애플리케이션과 인증해야 합니다. 이를 위해 DAST CI/CD 작업에서는 인증 자격 증명 및 인증 방법을 구성해야 합니다.

DAST에서는 다음과 같은 인증이 필요합니다:

  • 현실 세계의 공격을 시뮬레이션하고 공격자가 악용할 수 있는 취약점을 확인합니다.
  • 사용자별 기능 및 사용자 인증 후만 볼 수 있는 사용자 지정 동작을 테스트합니다.

DAST 작업은 주로 브라우저에서 로그인 양식을 작성하고 제출함으로써 애플리케이션에 자체를 인증합니다. 로그인 양식을 제출한 후에 DAST 작업은 인증이 성공했는지 확인합니다. 인증이 성공하면 DAST 작업은 계속 진행되고 대상 애플리케이션을 크롤링할 때 자격 증명을 저장합니다. 그렇지 않으면 DAST 작업이 중지됩니다.

DAST에서 지원하는 인증 방법은 다음과 같습니다:

  • 단계별 로그인 양식
  • 다단계 로그인 양식
  • 구성된 대상 URL 외부의 URL에 대한 인증

인증 자격 증명을 선택할 때 다음 사항에 유의하세요:

  • 프로덕션 시스템, 프로덕션 서버에 유효한 자격 증명이 아닌 자격 증명을 사용하지 마십시오.
  • 인증된 스캔을 프로덕션 서버에 대해 실행하지 마십시오. 인증된 스캔은 수정 또는 삭제 데이터 제출, 양식 제출 및 링크 이동과 같은 인증된 사용자가 수행할 수 있는 어떤 기능을 수행할 수 있습니다. 인증된 스캔은 비프로덕션 시스템 또는 서버에 대해서만 실행하세요.
  • DAST가 전체 애플리케이션을 테스트할 수 있는 자격 증명을 제공하세요.
  • 자격 증명의 만료 날짜(있는 경우)를 기록하여 차후 참조에 사용하세요. 예를 들어, 1Password와 같은 패스워드 관리자를 사용하세요.

시작하기

참고: 분석기의 인증이 계속 작동하는지 주기적으로 확인해야 합니다. 시간이 지남에 따라 애플리케이션 변경으로 이 인증이 중단될 수 있습니다.

DAST 인증 스캔 실행:

  • 인증에 대한 사전 조건을 읽으세요.
  • 대상 웹사이트 업데이트하여 인증된 사용자의 랜딩 페이지로 이동하세요.
  • 로그인 양식에 사용자 이름, 암호 및 제출 버튼이 한 페이지에 있는 경우, CI/CD 변수를 사용하여 단계별 로그인 양식 인증을 구성하세요.
  • 로그인 양식에 사용자 이름 및 암호 필드가 다른 페이지에 있는 경우, CI/CD 변수를 사용하여 다단계 로그인 양식 인증을 구성하세요.
  • 스캔 중에 사용자가 로그아웃되지 않도록 확인하세요.

요구사항

  • 스캔 중에 사용할 사용자의 사용자 이름 및 암호를 갖고 있어야 합니다.
  • DAST가 애플리케이션을 인증할 수 있는지 확인하기 위해 알려진 제한 사항을 확인했는지 확인하세요.
  • 로그인 양식을 사용하는 경우, 사전 조건을 충족했는지 확인하세요.
  • 인증이 성공적인지 여부를 검증할 방법에 대해 생각했는지 확인하세요.

로그인 양식

  • 애플리케이션의 로그인 양식의 URL을 알고 있어야 합니다. 또는 인증 URL에서 로그인 양식으로 이동하는 방법을 알고 있어야 합니다(로그인 양식으로 이동 참조).
  • DAST가 각각의 값을 입력하는 데 사용하는 사용자 이름 및 암호 HTML 필드의 셀렉터를 알고 있어야 합니다.
  • 로그인 양식을 제출하는 데 사용되는 요소의 셀렉터를 알고 있어야 합니다.

사용 가능한 CI/CD 변수

CI/CD 변수 유형 설명
DAST_AUTH_AFTER_LOGIN_ACTIONS string 로그인 후 로그인 확인 전에 실행할 작업의 쉼표로 구분된 목록입니다. 현재 “click” 작업만 지원됩니다. 예: click(on=id:change_to_bar_graph),click(on=css:input[name=username]).
DAST_AUTH_BEFORE_LOGIN_ACTIONS 셀렉터 DAST_AUTH_USERNAMEDAST_AUTH_PASSWORD를 로그인 양식에 입력하기 전에 클릭할 요소의 쉼표로 구분된 셀렉터 목록입니다. 예: "css:.navigation-menu,css:.login-menu-item".
DAST_AUTH_CLEAR_INPUT_FIELDS 불린 수동 로그인을 시도하기 전에 사용자 이름 및 암호 필드의 지우기를 비활성화합니다. 기본값으로 false로 설정합니다.
DAST_AUTH_COOKIE_NAMES string 인증에 사용되는 쿠키들을 지정하기 위해 쉼표로 구분된 쿠키 이름 목록으로 설정합니다.
DAST_AUTH_FIRST_SUBMIT_FIELD 셀렉터 여러 페이지 로그인 프로세스에서 사용자 이름 양식을 제출할 때 클릭하는 요소를 설명하는 셀렉터입니다. 예: css:button[type='user-submit'].
DAST_AUTH_PASSWORD_FIELD 셀렉터 로그인 양식에서 암호를 입력하는 데 사용되는 요소를 설명하는 셀렉터입니다. 예: id:password
DAST_AUTH_PASSWORD string 웹사이트의 인증을 위한 암호입니다. 예: P@55w0rd!.
DAST_AUTH_REPORT 불린 인증 프로세스 중에 취한 단계를 자세히 설명하는 보고서를 생성하려면 true로 설정합니다. 생성된 보고서에 접근할 수 있도록 CI 작업 아티팩트로 gl-dast-debug-auth-report.html을 정의해야 합니다. 보고서의 내용은 인증 실패를 디버깅할 때 도움이 됩니다.
DAST_AUTH_SUBMIT_FIELD 셀렉터 한 페이지 로그인 양식 또는 다단계 로그인 양식에 대한 로그인 양식을 제출하는데 클릭하는 요소를 설명하는 셀렉터입니다. 예: css:button[type='submit'].
DAST_AUTH_SUCCESS_IF_AT_URL URL 브라우저의 URL과 비교되는 인증 양식 제출 후에 인증이 성공했는지 확인하기 위한 URL입니다. 예: "https://example.com/loggedin_page".
DAST_AUTH_SUCCESS_IF_ELEMENT_FOUND 셀렉터 로그인 양식 제출 후에 존재하는지 여부를 확인하는 요소를 설명하는 셀렉터입니다. 예: css:.user-photo.
DAST_AUTH_SUCCESS_IF_NO_LOGIN_FORM 불린 로그인 양식 제출 후 로그인 양식이 없는 지 확인하여 인증이 성공했는지 확인합니다.
DAST_AUTH_TYPE string 사용할 인증 유형입니다. 예: basic-digest.
DAST_AUTH_URL URL 대상 웹사이트의 로그인 양식이 포함된 페이지의 URL입니다. DAST_AUTH_USERNAMEDAST_AUTH_PASSWORD가 제출되어 인증된 스캔을 생성하는 로그인 양식과 함께 제출됩니다. 예: https://login.example.com.
DAST_AUTH_USERNAME_FIELD 셀렉터 로그인 양식에서 사용자 이름을 입력하는 데 사용되는 요소를 설명하는 셀렉터입니다. 예: name:username.
DAST_AUTH_USERNAME string 웹사이트의 인증을 위한 사용자 이름입니다. 예: admin.
DAST_SCOPE_EXCLUDE_URLS URL 인증된 스캔 중에 건너뛸 URL입니다. 쉼표로 구분됩니다. 정규 표현식 구문을 사용하여 여러 URL을 일치시킬 수 있습니다. 예: .*는 임의의 문자열을 일치시킵니다.

대상 웹 사이트 업데이트

CI/CD 변수 DAST_TARGET_URL을 사용하여 정의된 대상 웹 사이트는 DAST가 응용 프로그램을 크롤링하기 시작하는 URL입니다.

인증 스캔을 위한 최상의 크롤 결과를 얻으려면, 대상 웹 사이트는 사용자가 인증을 거친 후에만 접근할 수 있는 URL이어야 합니다. 이는 종종 사용자가 로그인한 후에 착륙하는 페이지의 URL입니다.

예:

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

dast:
  variables:
    DAST_TARGET_URL: "https://example.com/dashboard/welcome"
    DAST_AUTH_URL: "https://example.com/login"

HTTP 인증 구성

기본 인증과 같은 HTTP 인증 방식을 사용하려면 DAST_AUTH_TYPE 값을 basic-digest로 설정할 수 있습니다. 네고시에이트(Negotiate) 또는 NTLM과 같은 다른 방식도 작동할 수 있지만 현재 자동화된 테스트 커버리지가 부족하기 때문에 공식적으로 지원되지는 않습니다.

구성에는 DAST 작업을 위해 DAST_AUTH_TYPE, DAST_AUTH_URL, DAST_AUTH_USERNAME, DAST_AUTH_PASSWORD CI/CD 변수를 정의해야 합니다. 고유한 로그인 URL이 없는 경우 DAST_AUTH_URLDAST_TARGET_URL과 동일한 URL로 설정하세요.

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

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_TYPE: "basic-digest"
    DAST_AUTH_URL: "https://example.com"

YAML 작업 정의 파일에 DAST_AUTH_USERNAMEDAST_AUTH_PASSWORD을 정의하지 마십시오. 이렇게 하면 보안 위험이 초래될 수 있습니다. 대신, GitLab UI를 사용하여 마스킹된 CI/CD 변수로 만드세요. 자세한 내용은 사용자 정의 CI/CD 변수를 참조하십시오.

단일 단계 로그인 양식 구성

단일 단계 로그인 양식은 모든 로그인 양식 요소가 단일 페이지에 있는 양식입니다. 구성에는 DAST 작업을 위해 DAST_AUTH_URL, DAST_AUTH_USERNAME, DAST_AUTH_USERNAME_FIELD, DAST_AUTH_PASSWORD, DAST_AUTH_PASSWORD_FIELDDAST_AUTH_SUBMIT_FIELD CI/CD 변수를 정의해야 합니다.

예를 들어, 작업 정의 YAML에서 필드의 URL과 선택기를 설정해야 합니다.

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

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_URL: "https://example.com/login"
    DAST_AUTH_USERNAME_FIELD: "css:[name=username]"
    DAST_AUTH_PASSWORD_FIELD: "css:[name=password]"
    DAST_AUTH_SUBMIT_FIELD: "css:button[type=submit]"

YAML 작업 정의 파일에 DAST_AUTH_USERNAMEDAST_AUTH_PASSWORD을 정의하지 마십시오. 이렇게 하면 보안 위험이 초래될 수 있습니다. 대신, GitLab UI를 사용하여 마스킹된 CI/CD 변수로 만드세요. 자세한 내용은 사용자 정의 CI/CD 변수를 참조하십시오.

다단계 로그인 양식 구성

다단계 로그인 양식은 두 개의 페이지가 있습니다. 첫 번째 페이지에는 사용자 이름과 다음 제출 버튼이 있는 양식이 있습니다. 사용자 이름이 유효한 경우, 다음 페이지의 두 번째 양식에 비밀번호와 양식 제출 버튼이 있습니다. DAST 작업을 위해 다음과 같은 CI/CD 변수를 정의해야 합니다.

  • DAST_AUTH_URL
  • DAST_AUTH_USERNAME
  • DAST_AUTH_USERNAME_FIELD
  • DAST_AUTH_FIRST_SUBMIT_FIELD
  • DAST_AUTH_PASSWORD
  • DAST_AUTH_PASSWORD_FIELD
  • DAST_AUTH_SUBMIT_FIELD

예를 들어, 작업 정의 YAML에서 필드의 URL과 선택기를 설정해야 합니다.

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

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_URL: "https://example.com/login"
    DAST_AUTH_USERNAME_FIELD: "css:[name=username]"
    DAST_AUTH_FIRST_SUBMIT_FIELD: "css:button[name=next]"
    DAST_AUTH_PASSWORD_FIELD: "css:[name=password]"
    DAST_AUTH_SUBMIT_FIELD: "css:button[type=submit]"

YAML 작업 정의 파일에 DAST_AUTH_USERNAMEDAST_AUTH_PASSWORD을 정의하지 마십시오. 이렇게 하면 보안 위험이 초래될 수 있습니다. 대신, GitLab UI를 사용하여 마스킹된 CI/CD 변수로 만드세요. 자세한 내용은 사용자 정의 CI/CD 변수를 참조하십시오.

단일 로그인 (SSO) 구성

사용자가 응용 프로그램에 로그인할 수 있는 경우 대부분의 경우 DAST도 로그인할 수 있습니다. 싱글 사인온(Single Sign-on)을 사용하는 응용 프로그램인 경우 DAST는 단일 단계 또는 다단계 로그인 양식 구성 가이드를 사용하여 인증을 구성해야 합니다.

DAST는 사용자가 외부 신원 공급자 사이트로 리디렉션되어 로그인할 수 있는 인증 프로세스를 지원합니다. SSO 인증 프로세스가 지원되는지 여부를 확인하려면 DAST 인증의 알려진 제한 사항을 확인하십시오.

로그인 양식으로 이동하는 클릭

DAST_AUTH_URL에서 로그인 양식에 액세스할 수 있도록 DAST_AUTH_BEFORE_LOGIN_ACTIONS를 정의하세요. 이 방법은 로그인 양식이 고유 URL이 없는 팝업(모달) 창에 로그인 양식이 표시되거나 로그인 양식에 고유 URL이 없는 경우에 적합합니다.

예를 들어:

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

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_URL: "https://example.com/login"
    DAST_AUTH_BEFORE_LOGIN_ACTIONS: "css:.navigation-menu,css:.login-menu-item"

로그아웃 URL 제외

인증된 스캔을 실행하는 동안 DAST가 로그아웃 URL을 크롤하면 사용자가 로그아웃되어 스캔이 나머지 부분이 인증되지 않은 상태로 남게 됩니다. 그러므로 DAST_SCOPE_EXCLUDE_URLS CI/CD 변수를 사용하여 로그아웃 URL을 제외하는 것이 좋습니다. DAST는 제외된 URL에 액세스하지 않으므로 사용자가 로그인 상태를 유지할 수 있습니다.

제공된 URL은 기본 경로를 기준으로 한 URL 경로의 절대 URL이거나 정규 표현식일 수 있습니다. 예:

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

dast:
  variables:
    DAST_TARGET_URL: "https://example.com/welcome/home"
    DAST_SCOPE_EXCLUDE_URLS: "https://example.com/logout,/user/.*/logout"

엘리먼트의 셀렉터 찾기

셀렉터는 CI/CD 변수에서 브라우저 페이지에 표시된 요소의 위치를 지정하는 데 사용됩니다. 셀렉터는 타입:검색 문자열 형식을 가지고 있습니다. DAST는 타입에 따라 검색 문자열을 기반으로 셀렉터를 검색합니다.

셀렉터 타입 예제 설명
css css:.password-field 제공된 CSS 셀렉터를 가진 HTML 엘리먼트를 검색합니다. 성능상의 이유로 셀렉터는 가능한 한 구체적이어야 합니다.
id id:element 제공된 엘리먼트 ID를 가진 HTML 엘리먼트를 검색합니다.
name name:element 제공된 엘리먼트 명을 가진 HTML 엘리먼트를 검색합니다.
xpath xpath://input[@id="my-button"]/a 제공된 XPath를 가진 HTML 엘리먼트를 검색합니다. XPath 검색은 다른 검색보다 성능이 낮을 것으로 예상됩니다.
제공되지 않음 a.click-me 기본적으로 CSS 셀렉터를 사용하여 검색합니다. cautionGitLab 15.8에서 사용 중단됨. 셀렉터 타입을 명시적으로 선언으로 변경되었습니다.

Google Chrome에서 셀렉터 찾기

Chrome DevTools 엘리먼트 셀렉터 도구는 셀렉터를 찾는 효율적인 방법입니다.

  1. Chrome을 열고, 예를 들어 사이트의 로그인 페이지와 같은 페이지에서 셀렉터를 찾고자 하는 페이지로 이동합니다.
  2. macOS에서는 키보드 단축키 Command + Shift + c, Windows 또는 Linux에서는 Ctrl + Shift + c로 Chrome DevTools의 Elements 탭을 엽니다.
  3. 페이지에서 Select an element in the page to select it 도구를 선택합니다. search-elements
  4. 찾고자 하는 페이지의 필드를 선택합니다.
  5. 도구가 활성화된 후에는 엘리먼트의 세부 정보를 확인할 수 있습니다. highlight
  6. 강조 표시된 후에는 셀렉터로 사용할 수 있는 엘리먼트의 세부 정보를 확인할 수 있습니다.

이 예에서 id="user_login"이 좋은 후보로 보입니다. 이를 DAST_AUTH_USERNAME_FIELD: "id:user_login"으로 설정하여 DAST 사용자 이름 필드로 사용할 수 있습니다.

올바른 셀렉터 선택

신중한 셀렉터 선택은 응용 프로그램 변경에 견고한 스캔을 이끕니다.

순서대로 선택해야 하는 셀렉터는 다음과 같습니다:

  • id 필드입니다. 이러한 필드는 일반적으로 페이지에서 고유하며 거의 변경되지 않습니다.
  • name 필드입니다. 이러한 필드는 일반적으로 페이지에서 고유하며 거의 변경되지 않습니다.
  • 필드별로 설정된 class 값, 예를 들어 username 클래스에 대한 셀렉터 "css:.username"와 같은 것입니다.
  • 필드별 데이터 어트리뷰트의 존재, 예를 들어 data-username 필드가 사용자 이름 필드에 어떤 값을 갖고 있는 경우 셀렉터 "css:[data-username]"와 같은 것입니다.
  • class 계층 구조 값이 여러 개인 경우, 예를 들어 username 클래스를 가진 여러 엘리먼트 중에서 login-form 클래스를 가진 엘리먼트 안에 중첩된 하나만 있는 경우 "css:.login-form .username"와 같은 것입니다.

특정 필드를 찾기 위해 셀렉터를 사용할 때 다음을 피해야 합니다:

  • 동적으로 생성된 id, name, 어트리뷰트, class 또는 value 중 어느 것도.
  • column-10dark-grey와 같은 일반적인 클래스 이름.
  • 다른 셀렉터 검색보다 성능이 낮은 XPath 검색.
  • css:*xpath://*로 시작하는 범위가 없는 검색.

인증이 성공적으로 확인되는지 확인하기

DAST가 로그인 양식을 제출한 후, 확인 프로세스가 진행되어 인증이 성공적인지 여부를 결정합니다. 인증에 실패한 경우 스캔이 오류로 중지됩니다.

로그인 양식을 제출한 후, 다음과 같은 경우에 인증이 실패로 판단됩니다:

  • 로그인 제출 HTTP 응답이 400 또는 500 시리즈 상태 코드를 가질 때.
  • 어떠한 확인 체크가 실패할 때.
  • 인증 프로세스 중에 충분히 무작위한 값으로 설정된 인증 토큰이 없을 때.

확인 체크

확인 체크는 인증이 완료된 후 브라우저의 상태에 대해 체크를 수행하여 인증이 성공적인지 여부를 결정합니다.

확인 체크가 설정되어 있지 않은 경우 DAST는 로그인 양식이 없음을 확인합니다.

URL을 기반으로 확인

DAST_AUTH_SUCCESS_IF_AT_URL을 인증이 성공적으로 제출된 후 브라우저 탭에 표시된 URL로 정의합니다.

DAST는 인증 후 브라우저의 URL을 확인 URL과 비교합니다. 만약 둘이 다르다면 인증이 실패로 판단됩니다.

예시:

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

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_SUCCESS_IF_AT_URL: "https://example.com/user/welcome"

엘리먼트의 존재를 기반으로 확인

DAST_AUTH_SUCCESS_IF_ELEMENT_FOUND셀렉터로 정의하여 인증이 성공적으로 제출된 후 표시된 페이지에서 하나 이상의 엘리먼트를 찾습니다. 엘리먼트가 발견되지 않은 경우 인증이 실패로 판단됩니다. 로그인 실패 시 표시된 페이지에서 셀렉터를 검색하면 엘리먼트가 반환되지 않아야 합니다.

예시:

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

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_SUCCESS_IF_ELEMENT_FOUND: "css:.welcome-user"

로그인 양식이 존재하지 않음을 기반으로 확인

DAST_AUTH_SUCCESS_IF_NO_LOGIN_FORM"true"로 정의하여 DAST가 로그인 양식을 제출한 후에 페이지에서 로그인 양식을 검색하도록 지시합니다. 로그인 후에도 로그인 양식이 여전히 존재하는 경우 인증이 실패로 판단됩니다.

예시:

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

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_SUCCESS_IF_NO_LOGIN_FORM: "true"

인증 토큰

DAST는 인증 프로세스 중에 설정된 인증 토큰을 기록합니다. DAST는 쿠키, 로컬 스토리지, 세션 스토리지 값의 스냅샷을 가져와 인증 프로세스 전후에 설정된 차이를 사용하여 어떤 것이 인증 프로세스에서 생성되었는지 판단합니다.

DAST는 충분히 “무작위”한 값으로 설정된 쿠키, 로컬 스토리지 및 세션 스토리지 값을 인증 토큰으로 보고 있습니다. 예를 들어, sessionID=HVxzpS8GzMlPAc2e39uyIVzwACIuGe0H는 인증 토큰으로 간주되지만, ab_testing_group=A1는 그렇지 않습니다.

CI/CD 변수인 DAST_AUTH_COOKIE_NAMES를 사용하여 DAST가 사용하는 인증 쿠키의 이름을 지정할 수 있습니다. 이를 통해 인증 프로세스가 보다 견고해지며, 인증 토큰을 검사하는 취약성 검사의 정확도를 높일 수 있습니다.

예시:

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

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_COOKIE_NAMES: "sessionID,refreshToken"

알려진 제한 사항

  • DAST는 인증 흐름에 CAPTCHA가 포함된 경우 우회할 수 없습니다. 애플리케이션 테스트 환경에서 이를 끄십시오.
  • DAST는 SMS, 생체 인증 또는 인증 앱을 사용한 일회용 비밀번호 (OTP)와 같은 이중 인증을 처리할 수 없습니다. 이를 애플리케이션 테스트 환경에서 끄십시오.
  • DAST는 로그인 중 인증 토큰을 설정하지 않는 애플리케이션에는 인증할 수 없습니다.
  • DAST는 두 개 이상의 입력이 필요한 애플리케이션에는 인증할 수 없습니다. 사용자 이름과 암호 두 가지 입력을 제공해야 합니다.

문제 해결

로그는 DAST가 인증 프로세스 중에 무엇을 수행하고 기대하는지에 대한 통찰력을 제공합니다. 더 자세한 정보는 인증 보고서를 구성하세요. 특정한 오류 메시지나 상황에 대한 자세한 정보는 알려진 문제를 참조하세요.

사용자 인증을 위해 브라우저 기반 분석기가 사용됩니다. 고급 문제 해결은 브라우저 기반 문제 해결을 참조하세요.

로그 읽기

DAST CI/CD 작업의 콘솔 출력은 AUTH 로그 모듈을 사용하여 인증 프로세스에 대한 정보를 보여줍니다. 예를 들어, 다음 로그에서 여러 단계로 이루어진 로그인 양식에 대한 인증 실패가 나와 있습니다. 로그인 후에는 홈페이지가 표시되어야 하지만, 여전히 로그인 양식이 표시되고 있어서 인증에 실패했습니다.

2022-11-16T13:43:02.000 INF AUTH  인증을 시도하는 중
2022-11-16T13:43:02.000 INF AUTH  로그인 페이지 로드 중 LoginURL=https://example.com/login
2022-11-16T13:43:10.000 INF AUTH  다단계 인증이 감지됨
2022-11-16T13:43:15.000 INF AUTH  사용자 제출 확인 중 true_when="HTTP status code < 400"
2022-11-16T13:43:15.000 INF AUTH  조건 충족, 로그인 HTTP 메시지 없음 want="HTTP status code < 400"
2022-11-16T13:43:20.000 INF AUTH  로그인 시도가 성공했는지 확인 중 true_when="HTTP status code < 400 and has authentication token and no login form found (no element found when searching using selector css:[id=email] or css:[id=password] or css:[id=submit])"
2022-11-24T14:43:20.000 INF AUTH  조건 충족, HTTP 로그인 요청이 200 상태 코드로 반환됨 url=https://example.com/user/login?error=invalid%20credentials want="HTTP status code < 400"
2022-11-16T13:43:21.000 INF AUTH  조건 불만족, 로그인 양식이 발견되었음 want="no login form found (no element found when searching using selector css:[id=email] or css:[id=password] or css:[id=submit])"
2022-11-16T13:43:21.000 INF AUTH  로그인 시도 실패 error="authentication failed: failed to authenticate user"

인증 보고서 구성

경고: 인증 보고서에는 로그인을 수행하는 데 사용된 자격 증명과 같은 민감한 정보가 포함될 수 있습니다.

인증 보고서는 CI/CD 작업 artifact로 저장되어 인증 실패의 원인을 이해하는 데 도움이 될 수 있습니다.

보고서에는 로그인 프로세스 중에 수행된 단계, HTTP 요청 및 응답, 문서 객체 모델(DOM), 스크린샷이 포함됩니다.

dast-auth-report

다음과 같은 인증 디버그 보고서가 내보내지는 예제 구성은 다음과 같을 수 있습니다:

dast:
  variables:
    DAST_TARGET_URL: "https://example.com"
    DAST_AUTH_REPORT: "true"

알려진 문제

로그인 양식을 찾을 수 없음

DAST는 로그인 페이지를 로드할 때 로그인 양식을 찾지 못하여 실패했습니다. 이는 주로 인증 URL을 로드하지 못했기 때문에 발생합니다. 로그는 다음과 같이 치명적인 오류를 보고합니다:

2022-12-07T12:44:02.838 INF AUTH  로그인 페이지 로드 중 LoginURL=[authentication URL]
2022-12-07T12:44:11.119 FTL MAIN  인증 실패: 로그인 양식을 찾을 수 없음

제안:

  • HTTP 응답을 검사하기 위해 인증 보고서를 생성합니다.
  • 대상 애플리케이션의 인증이 배포되어 실행 중인지 확인합니다.
  • DAST_AUTH_URL이 정확한지 확인합니다.
  • GitLab Runner가 DAST_AUTH_URL에 액세스할 수 있는지 확인합니다.
  • 사용 중이라면, DAST_AUTH_BEFORE_LOGIN_ACTIONS가 유효한지 확인합니다.

스캔이 인증된 페이지를 순회하지 않음

DAST가 인증 토큰을 잘못 캡처함으로써 스캔이 인증된 페이지를 순회하지 못할 수 있습니다. 쿠키 및 스토리지 인증 토큰의 이름이 로그에 기록됩니다. 예를 들어:

2022-11-24T14:42:31.492 INF AUTH  인증 토큰 쿠키 이름=["sessionID"]
2022-11-24T14:42:31.492 INF AUTH  인증 토큰 스토리지 이벤트 키=["token"]

제안:

  • 인증 보고서를 생성하고 Login submit에서 스크린샷을 확인하여 로그인이 예상대로 작동하는지 확인합니다.
  • 기록된 인증 토큰이 애플리케이션에서 사용하는 토큰인지 확인합니다.
  • 쿠키를 사용하여 인증 토큰을 저장하는 경우, DAST_AUTH_COOKIE_NAMES를 사용하여 인증 토큰 쿠키의 이름을 설정합니다.

선택자로 요소를 찾을 수 없음

DAST가 사용자 이름, 비밀번호, 첫 번째 제출 버튼 또는 제출 버튼 요소를 찾지 못했습니다. 로그는 다음과 같이 치명적인 오류를 보고합니다:

2022-12-07T13:14:11.545 FTL MAIN  인증 실패: 선택자로 요소를 찾을 수 없음: css:#username

제안:

  • 인증 보고서를 생성하여 로그인 페이지의 스크린샷을 사용하여 페이지가 올바르게 로드되었는지 확인합니다.
  • DAST_AUTH_USERNAME_FIELD, DAST_AUTH_PASSWORD_FIELD, DAST_AUTH_FIRST_SUBMIT_FIELD, DAST_AUTH_SUBMIT_FIELD에 구성된 selectors가 올바른지 확인합니다.

사용자 인증에 실패함

DAST가 로그인 확인 검사에 실패하여 사용자를 인증하지 못했습니다. 로그는 다음과 같이 치명적인 오류를 보고합니다:

2022-12-07T06:39:49.483 INF AUTH  로그인 시도가 성공했는지 확인 중 true_when="HTTP status code < 400 and has authentication token and no login form found (no element found when searching using selector css:[name=username] or css:[name=password] or css:button[type=\"submit\"])"
2022-12-07T06:39:49.484 INF AUTH  조건 충족, HTTP 로그인 요청이 303 상태 코드로 반환됨 url=http://auth-manual:8090/login want="HTTP status code < 400"
2022-12-07T06:39:49.513 INF AUTH  조건 불만족, 로그인 양식이 발견되었음 want="no login form found (no element found when searching using selector css:[name=username] or css:[name=password] or css:button[type=\"submit\"])"
2022-12-07T06:39:49.589 INF AUTH  로그인 시도 실패 error="authentication failed: failed to authenticate user"
2022-12-07T06:39:53.626 FTL MAIN  인증 실패: 사용자의 인증에 실패함

제안:

  • 로그에서 요구사항 충족하지 않음을 찾습니다. 적절한 오류에 응답합니다.
2022-12-07T06:39:49.513 INF AUTH  필요 요건이 충족되지 않았으며, 로그인 양식을 찾았습니다 want="css:[name=username] 또는 css:[name=password] 또는 css:button[type=\"submit\"] 선택기를 사용하여 검색할 때 요소를 찾지 못함 (로그인 양식을 찾지 못함)"

제안된 조치:

  • 사용된 사용자 이름 및 비밀번호/인증 자격 증명이 정확한지 확인하세요.
  • 인증 보고서를 생성하고 로그인 제출에 대한 요청이 올바른지 확인하세요.
  • ‘로그인 제출’의 인증 보고서 요청 및 응답이 비어 있는 경우가 있습니다. 이는 웹소켓이나 AJAX를 사용하여 로그인 양식을 제출할 때와 같이 전체 페이지 다시로드를 유발하는 요청이 없는 경우 발생합니다.
  • 사용자 인증 후 표시된 페이지에 실제로 로그인 양식 선택기와 일치하는 요소가 있는 경우 DAST_AUTH_SUCCESS_IF_AT_URL 또는 DAST_AUTH_SUCCESS_IF_ELEMENT_FOUND를 구성하여 로그인 시도를 확인할 대체 방법을 사용하세요.

필요 요건 충족되지 않음, 선택기가 결과를 반환하지 않음

DAST는 사용자 로그인 후 표시된 페이지에서 DAST_AUTH_SUCCESS_IF_ELEMENT_FOUND에서 제공된 선택기와 일치하는 요소를 찾을 수 없습니다.

2022-12-07T06:39:33.239 INF AUTH  필요 요건이 충족되지 않았으며, 선택기를 사용하여 DOM을 검색하면 결과를 반환하지 않았습니다 want="has element css:[name=welcome]"

제안된 조치:

  • 인증 보고서를 생성하고 로그인 제출에서 기대되는 페이지가 표시되는지 확인하는 스크린샷을 확인하세요.
  • DAST_AUTH_SUCCESS_IF_ELEMENT_FOUND 선택기가 올바른지 확인하세요.

필요 요건이 충족되지 않음, 브라우저가 URL에 없음

DAST는 사용자 로그인 후 표시된 페이지의 URL이 DAST_AUTH_SUCCESS_IF_AT_URL에 따라 예상과 다른 것을 감지했습니다.

2022-12-07T11:28:00.241 INF AUTH  필요 요건이 충족되지 않았으며, 브라우저가 원하는 url https://example.com/user/dashboard에 있지 않음 browser_url="https://example.com/home" want="is at url https://example.com/user/dashboard"

제안된 조치:

  • 인증 보고서를 생성하고 로그인 제출에서 기대되는 페이지가 표시되는지 확인하는 스크린샷을 확인하세요.
  • DAST_AUTH_SUCCESS_IF_AT_URL이 올바른지 확인하세요.

필요 요건이 충족되지 않음, HTTP 로그인 요청 상태 코드

로그인 양식을로드하거나 양식을 제출할 때 HTTP 응답이 400(클라이언트 오류) 또는 500(서버 오류)의 상태 코드를 갖습니다.

2022-12-07T06:39:53.626 INF AUTH  필요 요건이 충족되지 않았으며, HTTP 로그인 요청이 상태 코드 502를 반환했습니다 url="https://example.com/user/login" want="HTTP status code < 400"
  • 사용된 사용자 이름 및 비밀번호/인증 자격 증명이 정확한지 확인하세요.
  • 인증 보고서를 생성하고 로그인 제출요청이 올바른지 확인하세요.
  • 대상 애플리케이션이 예상대로 작동하는지 확인하세요.

필요 요건이 충족되지 않음, 인증 토큰 없음

DAST는 인증 프로세스 중에 생성된 인증 토큰을 감지하지 못했습니다.

2022-12-07T11:25:29.010 INF AUTH  인증 토큰 쿠키 이름=[]
2022-12-07T11:25:29.010 INF AUTH  인증 토큰 저장 이벤트 키=[]
2022-12-07T11:25:29.010 INF AUTH  필요 요건이 충족되지 않았으며, 기본 인증, 쿠키 또는 저장소 이벤트 인증 토큰이 감지되지 않음 want="has authentication token"

제안된 조치:

  • 인증 보고서를 생성하고 로그인 제출에서 로그인이 예상대로 작동하는지 확인하는 스크린샷을 확인하세요.
  • 브라우저의 개발 도구를 사용하여 로그인 중에 생성된 쿠키 및 로컬/세션 저장소 객체를 조사하세요. 충분히 무작위 값을 갖는 인증 토큰이 생성되었는지 확인하세요.
  • 인증 토큰을 저장하기 위해 쿠키를 사용하는 경우 DAST_AUTH_COOKIE_NAMES을 사용하여 인증 토큰 쿠키의 이름을 설정하세요. ```