DAST 인증

Tier: Ultimate Offering: GitLab.com, Self-managed, GitLab Dedicated
caution

PRODUCTION 시스템, 프로덕션 서버 또는 프로덕션 데이터를 포함하는 자격 증명을 사용하지 마십시오.
caution
인증된 스캔을 프로덕션 서버에 실행하지 마십시오.
인증된 스캔은 인증된 사용자가 수행 가능한 모든 기능을 수행할 수 있으므로 데이터 수정 또는 삭제, 양식 제출 및 링크 이동이 가능합니다.
인증된 스캔은 비프로덕션 시스템 또는 서버에 대해서만 실행하십시오.

인증은 DAST 스캔 전에 사용자를 로그인하므로, 취약점을 찾을 때 가능한 응용 프로그램의 많은 부분을 테스트할 수 있습니다.

DAST는 브라우저를 사용하여 사용자를 인증하여 로그인 양식이 필요한 JavaScript 및 스타일링을 포함하는지 확인합니다. DAST는 사용자 이름과 비밀번호 필드를 찾아 해당 값으로 채웁니다. 로그인 양식이 제출되고 응답이 반환되면, 인증이 성공적으로 이루어졌는지를 확인하기 위해 일련의 확인이 수행됩니다. DAST는 대상 응용 프로그램을 크롤링할 때 재사용하기 위해 자격 증명을 저장합니다.

DAST가 인증에 실패하면 스캔이 중지되고 CI 작업이 실패합니다.

인증은 단일 단계 로그인 양식, 다단계 로그인 양식, 단일 사인온 및 구성된 대상 URL 외부의 URL에 대한 인증을 지원합니다.

시작하기

note

분석기의 인증이 여전히 작동하는지 정기적으로 확인해야 합니다. 애플리케이션 변경으로 인해 시간이 경과함에 따라 이러한 작업이 중단될 수 있습니다.

인증된 DAST 스캔을 실행하려면:

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

전제 조건

  • 스캔 중에 사용할 사용자의 사용자 이름과 비밀번호를 갖고 있어야 합니다.
  • DAST가 응용 프로그램에 인증할 수 있는지 확인하려면 알려진 제한 사항을 확인해야 합니다.
  • 양식 인증 또는 HTTP 인증을 사용하는지에 따라 필요한 전제 조건을 충족시켰는지 확인해야 합니다.
  • 인증이 성공적인지 검증하는 방법에 대해 고려해야 합니다.

양식 인증

HTTP 인증

대상 웹사이트 업데이트

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

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

예시:

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

dast:
  variables:
    DAST_WEBSITE: "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_USERNAME, DAST_PASSWORD라는 CI/CD 변수가 정의되어야 합니다. 고유한 로그인 URL이 없는 경우, DAST_AUTH_URLDAST_WEBSITE와 동일한 URL로 설정하세요.

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

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

DAST_USERNAMEDAST_PASSWORD를 YAML 작업 정의 파일에 정의하지 마십시오. 이는 보안 위험을 초래할 수 있습니다. 대신, 이를 GitLab UI를 사용하여 가려진 CI/CD 변수로 만드세요. 자세한 내용은 사용자 정의 CI/CD 변수를 참조하세요.

프록시 기반 분석기는 인증 메커니즘으로 기본 인증을 지원하지 않습니다. 권장 사항은 적절한 Authorization 헤더를 포함하는 값을 갖는 가려진 CI/CD 변수로 DAST_REQUEST_HEADERS를 설정하는 것입니다. 예: Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQK.

단계별 로그인 양식 구성

단계별 로그인 양식은 모든 로그인 양식 요소가 단일 페이지에 있는 형태입니다. 구성에는 DAST 작업을 위해 DAST_AUTH_URL, DAST_USERNAME, DAST_USERNAME_FIELD, DAST_PASSWORD, DAST_PASSWORD_FIELD, DAST_SUBMIT_FIELD라는 CI/CD 변수가 정의되어야 합니다.

작업 정의 YAML에서 필드의 URL 및 선택기를 설정해야 합니다. 예:

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

dast:
  variables:
    DAST_WEBSITE: "https://example.com"
    DAST_AUTH_URL: "https://example.com/login"
    DAST_USERNAME_FIELD: "css:[name=username]"
    DAST_PASSWORD_FIELD: "css:[name=password]"
    DAST_SUBMIT_FIELD: "css:button[type=submit]"

DAST_USERNAMEDAST_PASSWORD를 YAML 작업 정의 파일에 정의하지 마십시오. 이는 보안 위험을 초래할 수 있습니다. 대신, 이를 GitLab UI를 사용하여 가려진 CI/CD 변수로 만드세요. 자세한 내용은 사용자 정의 CI/CD 변수를 참조하세요.

다단계 로그인 양식 구성

다단계 로그인 양식은 두 페이지를 가지고 있습니다. 첫 번째 페이지에는 사용자 이름을 입력하는 양식과 다음 버튼이 있습니다. 사용자 이름이 유효한 경우, 연이어 나오는 페이지의 두 번째 양식에는 비밀번호와 양식 제출 버튼이 있습니다.

구성에는 DAST 작업을 위해 다음과 같은 CI/CD 변수가 정의되어야 합니다:

  • DAST_AUTH_URL
  • DAST_USERNAME
  • DAST_USERNAME_FIELD
  • DAST_FIRST_SUBMIT_FIELD
  • DAST_PASSWORD
  • DAST_PASSWORD_FIELD
  • DAST_SUBMIT_FIELD.

작업 정의 YAML에서 필드의 URL 및 선택기를 설정해야 합니다. 예:

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

dast:
  variables:
    DAST_WEBSITE: "https://example.com"
    DAST_AUTH_URL: "https://example.com/login"
    DAST_USERNAME_FIELD: "css:[name=username]"
    DAST_FIRST_SUBMIT_FIELD: "css:button[name=next]"
    DAST_PASSWORD_FIELD: "css:[name=password]"
    DAST_SUBMIT_FIELD: "css:button[type=submit]"

DAST_USERNAMEDAST_PASSWORD를 YAML 작업 정의 파일에 정의하지 마십시오. 이는 보안 위험을 초래할 수 있습니다. 대신, 이를 GitLab UI를 사용하여 가려진 CI/CD 변수로 만드세요. 자세한 내용은 사용자 정의 CI/CD 변수를 참조하세요.

Single Sign-On (SSO) 구성

대부분의 경우, 사용자가 응용 프로그램에 로그인할 수 있는 경우 DAST도 로그인할 수 있습니다. 그리고 응용 프로그램이 Single Sign-on을 사용하는 경우에도 마찬가지입니다. SSO 솔루션을 사용하는 응용 프로그램은 단계별 또는 다단계 로그인 양식 구성 가이드를 사용해야 합니다.

DAST는 사용자가 외부 ID 공급자의 사이트로 리디렉션되어 로그인하는 인증 프로세스를 지원합니다. DAST 인증의 알려진 제한 사항을 확인하여 SSO 인증 프로세스가 지원되는지 여부를 결정하세요.

로그인 양식으로 이동하려면 클릭

DAST_BROWSER_PATH_TO_LOGIN_FORM을 정의하여 DAST_AUTH_URL로부터 클릭할 엘리먼트 경로를 제공하여 DAST가 로그인 양식에 액세스할 수 있도록 합니다. 이 방법은 로그인 양식이 팝업 창에 표시되거나 로그인 양식이 고유 URL을 가지지 않는 응용 프로그램에 적합합니다.

예시:

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

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

사용자 이름과 비밀번호 제출 후 추가 조치 수행

DAST_AFTER_LOGIN_ACTIONS을 정의하여 사용자 이름과 비밀번호 양식을 제출한 후 로그인 프로세스를 완료하는 데 필요한 일련의 조치를 제공하세요. 예를 들어, 이를 사용하여 제출 버튼을 누른 후 나타나는 모달 대화 상자(예: “로그인 유지?” 프롬프트)를 닫을 수 있습니다.

DAST는 로그인 후 조치가 실행된 후에만 인증이 성공했는지 확인하고 인증 토큰을 기록합니다.

예시:

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

dast:
  variables:
    DAST_WEBSITE: "https://example.com"
    DAST_AUTH_URL: "https://example.com/login"
    DAST_AFTER_LOGIN_ACTIONS: "click(on=id:modal-yes)"

로그아웃 URL 제외

DAST가 인증된 스캔을 실행하는 동안 로그아웃 URL을 크롤링하면 사용자가 로그아웃되어 스캔의 나머지가 인증되지 않은 상태로 진행됩니다.
따라서 CI/CD 변수 DAST_EXCLUDE_URLS를 사용하여 로그아웃 URL을 제외하는 것이 권장됩니다. DAST는 제외된 URL에 액세스하지 않으므로 사용자가 로그인한 상태를 유지합니다.

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

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

dast:
  variables:
    DAST_WEBSITE: "https://example.com/welcome/home"
    DAST_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에서 Deprecated되었으며 명시적으로 셀렉터 타입을 선언하여 대체되었습니다.

Google Chrome으로 셀렉터 찾기

Chrome DevTools의 요소 셀렉터 도구는 셀렉터를 찾는 효과적인 방법입니다.

  1. Chrome을 열고 셀렉터를 찾고자 하는 페이지(예: 사이트의 로그인 페이지)로 이동합니다.
  2. macOS의 키보드 단축키 Command + Shift + c 또는 Windows의 Ctrl + Shift + c로 Chrome DevTools의 Elements 탭을 엽니다.
  3. 페이지에서 요소를 선택하여 선택하십시오 도구를 선택합니다. search-elements
  4. 셀렉터를 알고 싶은 페이지의 필드를 선택합니다.
  5. 도구가 활성화되면 셀렉터에 대한 세부 정보를 확인할 필드를 강조 표시합니다. highlight
  6. 강조 표시된 후 요소의 세부 정보를 확인할 수 있으며, 이는 셀렉터 유형에 대한 좋은 후보가 될 속성을 포함합니다.

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

올바른 셀렉터 선택

실용적인 셀렉터 선택은 응용 프로그램 변경에 강한 스캔을 유도합니다.

우선적으로 선택해야 하는 셀렉터는 다음과 같습니다:

  • id 필드. 일반적으로 페이지에서 고유하며 거의 변하지 않습니다.
  • name 필드. 일반적으로 페이지에서 고유하며 거의 변하지 않습니다.
  • 필드별로 고유한 데이터 어트리뷰트의 존재, 예를 들어 data-username 필드에 어떤 값이 있는 경우 "css:[data-username]"와 같은 셀렉터.
  • 여러 class 계층 값, 예를 들어 classlogin-form인 요소 내의 하나뿐인 중첩된 username 클래스의 셀렉터인 "css:.login-form .username".

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

  • 동적으로 생성된 id, name, 어트리뷰트, class, 또는 value와 같은 어떠한 것.
  • column-10이나 dark-grey와 같은 일반적인 클래스명.
  • 다른 셀렉터 검색보다 퍼포먼스가 떨어지는 XPath 검색.
  • css:*xpath://*로 시작하는 비범위 제한 검색.

인증이 성공적으로 확인하기

DAST가 로그인 폼을 제출한 후, 인증이 성공적인지 확인하는 프로세스가 진행됩니다.
인증이 실패하면 스캔이 오류로 중지됩니다.

로그인 폼을 제출한 후, 다음의 경우 인증이 실패로 판명됩니다:

  • 로그인 제출 HTTP 응답 코드에 400 또는 500 시리즈 상태 코드가 포함되어 있습니다.
  • 어떤 확인 체크도 실패합니다.
  • 인증 토큰에 충분히 무작위 값이 설정되어 있지 않습니다.

확인 체크

확인 체크는 인증이 완료되면 브라우저 상태에 대한 체크를 실행하여 추가적으로 인증이 성공했는지 확인합니다.

확인 체크가 구성되어 있지 않은 경우, DAST는 로그인 폼이 없음을 확인하기 위해 확인 체크를 실행합니다.

URL을 기반으로 확인

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

DAST는 인증 후 브라우저에서의 URL과 확인 URL을 비교합니다. 이들이 동일하지 않으면, 인증이 실패로 판명됩니다.

예시:

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

dast:
  variables:
    DAST_WEBSITE: "https://example.com"
    DAST_AUTH_VERIFICATION_URL: "https://example.com/user/welcome"

요소의 존재를 기반으로 확인

DAST_AUTH_VERIFICATION_SELECTOR를 로그인 폼이 성공적으로 제출된 후 페이지에 표시된 요소를 찾는 셀렉터로 정의합니다. 만약 어떤 요소도 발견되지 않으면, 인증이 실패로 판명됩니다.
로그인 실패 시 해당 페이지에서 셀렉터를 검색하면 어떤 요소도 나타나지 않아야 합니다.

예시:

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

dast:
  variables:
    DAST_WEBSITE: "https://example.com"
    DAST_AUTH_VERIFICATION_SELECTOR: "css:.welcome-user"

로그인 양식이 없음을 기반으로 확인

DAST_AUTH_VERIFICATION_LOGIN_FORM"true"로 정의하여 DAST가 로그인 양식이 성공적으로 제출된 후에 페이지에서 로그인 양식을 검색해야 함을 나타냅니다. 로그인 후에도 로그인 양식이 여전히 존재한다면, 인증이 실패한 것입니다.

예시:

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

dast:
  variables:
    DAST_WEBSITE: "https://example.com"
    DAST_AUTH_VERIFICATION_LOGIN_FORM: "true"

인증 토큰

DAST는 인증 프로세스 중에 설정된 인증 토큰을 기록합니다. DAST는 새로운 브라우저를 열 때 생성된 인증 토큰을 로드하여 사용자가 스캔 도중에도 로그인 상태를 유지할 수 있도록 합니다.

인증 토큰을 기록하기 위해 DAST는 인증 프로세스 이전에 응용 프로그램에 의해 설정된 쿠키, 로컬 리포지터리 및 세션 리포지터리 값을 스냅샷으로 찍습니다. DAST는 인증 후에도 똑같이 수행하고, 이 차이를 사용하여 어떤 것이 인증 프로세스로부터 생성되었는지를 결정합니다.

DAST는 충분히 “랜덤”한 값을 갖는 쿠키, 로컬 리포지터리 및 세션 리포지터리 값을 인증 토큰으로 간주합니다. 예를 들어 sessionID=HVxzpS8GzMlPAc2e39uyIVzwACIuGe0H는 인증 토큰으로 간주되지만 ab_testing_group=A1는 그렇지 않습니다.

CI/CD 변수 DAST_AUTH_COOKIES는 DAST가 사용하는 무작위성 검사를 우회하는 인증 쿠키의 이름을 지정하는 데 사용할 수 있습니다. 이로써 인증 프로세스를 더 견고하게 만들 뿐만 아니라, 인증 토큰을 검사하는 취약점 점검의 정확도도 향상시킬 수 있습니다.

예시:

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

dast:
  variables:
    DAST_WEBSITE: "https://example.com"
    DAST_AUTH_COOKIES: "sessionID,refreshToken"

알려진 제한 사항

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

문제 해결

더 많은 정보는 문제 해결을 참조하세요.