DAST 인증
인증은 DAST 스캔 전에 사용자를 로그인하여 취약점을 찾을 때 가능한 한 많은 응용 프로그램을 테스트하기 위한 것입니다.
DAST는 브라우저를 사용하여 사용자를 인증하여 로그인 양식에 필요한 JavaScript와 스타일링을 가져옵니다. DAST는 사용자 이름과 암호 필드를 찾아 해당 값으로 채웁니다. 로그인 양식이 제출되고 응답이 반환되면, 인증이 성공적인지 확인하는 일련의 확인 항목이 실행됩니다. DAST는 대상 응용 프로그램을 크롤링할 때 재사용하기 위해 자격 증명을 저장합니다.
DAST가 인증에 실패하면 스캔이 중지되고 CI 작업이 실패합니다.
인증은 단계별 로그인 양식, 다단계 로그인 양식, 단일 로그인 및 구성된 대상 URL 외부의 URL에 대한 인증을 지원합니다.
시작하기
DAST 인증 스캔을 실행하려면:
- 인증에 대한 사전 요구 사항을 확인하세요.
- 대상 웹 사이트를 업데이트하여 인증된 사용자의 랜딩 페이지로 설정하세요.
- 로그인 양식이 단일 페이지에 사용자 이름, 암호 및 제출 버튼이 있는 경우 CI/CD 변수를 사용하여 단계별 로그인 양식 인증을 구성합니다.
- 로그인 양식에 사용자 이름 및 암호 필드가 다른 페이지에 있는 경우 CI/CD 변수를 사용하여 다단계 로그인 양식 인증을 구성합니다.
- 스캔 중에 사용자가 로그아웃되지 않도록 확인합니다.
사전 요구 사항
- 스캔 중에 사용할 사용자의 사용자 이름과 암호가 있어야 합니다.
- DAST가 애플리케이션에 대해 인증할 수 있는지 확인하려면 알려진 제한 사항을 확인해야 합니다.
- 양식 인증 또는 HTTP 인증을 사용하는지에 따라 요구되는 사전 요구 사항을 확인해야 합니다.
- 인증이 성공적인지 확인하는 방법에 대해 생각해야 합니다.
양식 인증
- DAST 프록시 기반 분석기 또는 DAST 브라우저 기반 분석기를 사용하고 있는지 확인해야 합니다.
- 사용 중인 애플리케이션의 로그인 양식의 URL을 알고 있어야 합니다. 또는 인증 URL에서 로그인 양식으로 이동하는 방법을 알고 있어야 합니다 (로그인 양식으로 이동 참조).
- DAST가 해당 값으로 입력하는 사용자 이름 및 암호 HTML 필드의 셀렉터를 알고 있어야 합니다.
- 선택한 값을 입력하여 로그인 양식을 제출하는 요소 셀렉터를 알고 있어야 합니다.
HTTP 인증
- DAST 브라우저 기반 분석기를 사용해야만 합니다.
사용 가능한 CI/CD 변수
다음 CI/CD 변수를 사용하여 애플리케이션의 DAST 스캔에 필요한 인증 작업을 구성하세요.
CI/CD 변수 | 유형 | 설명 |
---|---|---|
DAST_AUTH_COOKIE_NAMES
| 문자열 | 인증에 사용되는 쿠키 이름의 쉼표로 구분된 목록을 설정하여 인증에 사용되는 쿠키를 지정합니다. |
DAST_AUTH_REPORT
| 불리언 | 인증 프로세스 중에 수행된 단계를 자세히 설명하는 보고서를 생성하려면 true 로 설정하세요. 생성된 보고서에 액세스하려면 gl-dast-debug-auth-report.html 을 CI 작업 artefact로 정의해야 합니다. 보고서 내용은 인증 실패를 디버깅하는 데 도움이 됩니다.
|
DAST_AUTH_TYPE 1
| 문자열 | 사용할 인증 유형입니다. 예: basic-digest
|
DAST_AUTH_URL
| URL | 대상 웹 사이트의 로그인 양식이 포함된 페이지의 URL입니다. DAST_USERNAME 및 DAST_PASSWORD 이 로그인 양식을 제출하도록합니다. 예: https://login.example.com
|
DAST_AUTH_SUCCESS_IF_NO_LOGIN_FORM
| 불리언 | 로그인 양식이 제출된 후 로그인 양식이 없음을 확인하여 인증이 성공적으로 수행되었는지 확인합니다. 이 성공적인 확인은 기본적으로 활성화됩니다. |
DAST_AUTH_SUCCESS_IF_ELEMENT_FOUND
| 셀렉터 | 로그인 양식이 제출된 후 인증이 성공적으로 수행되었는지 여부를 확인하는 데 사용되는 존재 여부를 나타내는 셀렉터입니다. 예: css:.user-photo
|
DAST_AUTH_SUCCESS_IF_AT_URL
| URL | 브라우저의 URL과 비교하여 로그인 양식이 제출된 후 인증이 성공적으로 수행되었는지 여부를 확인하는 데 사용되는 URL입니다. 예: "https://example.com/loggedin_page"
|
DAST_AUTH_BEFORE_LOGIN_ACTIONS
| 셀렉터 | 로그인 양식에 DAST_USERNAME 및 DAST_PASSWORD 를 입력하기 전에 클릭해야하는 요소를 나타내는 쉼표로 구분된 셀렉터 목록입니다. 예: "css:.navigation-menu,css:.login-menu-item"
|
DAST_SCOPE_EXCLUDE_URLS
| URL 목록 | 인증된 스캔 중에 건너뛸 URL 목록입니다. 쉼표로 구분됩니다. 정규식 구문을 사용하여 여러 URL을 일치시킬 수 있습니다. 예: .* 은 임의의 문자 시퀀스와 일치합니다.
|
DAST_AUTH_FIRST_SUBMIT_FIELD
| 셀렉터 | 다단계 로그인 프로세스의 사용자 이름 양식을 제출하는 데 클릭하는 요소를 설명하는 셀렉터입니다. 예: css:button[type='user-submit']
|
DAST_AUTH_PASSWORD
| 문자열 | 웹 사이트에서 인증할 암호입니다. 예: P@55w0rd!
|
DAST_AUTH_PASSWORD_FIELD
| 셀렉터 | 로그인 양식의 암호를 입력하는 데 사용되는 요소를 설명하는 셀렉터입니다. 예: id:password
|
DAST_AUTH_SUBMIT_FIELD
| 셀렉터 | 단일 페이지 로그인 양식 또는 다단계 로그인 양식의 암호 양식을 제출하는 데 클릭하는 요소를 설명하는 셀렉터입니다. 예: css:button[type='submit']
|
DAST_AUTH_USERNAME
| 문자열 | 웹 사이트에서 인증할 사용자 이름입니다. 예: admin
|
DAST_AUTH_USERNAME_FIELD
| 셀렉터 | 로그인 양식에 사용된 사용자 이름을 입력하는 데 사용되는 요소를 설명하는 셀렉터입니다. 예: name:username
|
DAST_AUTH_DISABLE_CLEAR_FIELDS
| 불리언 | 수동 로그인 시 사용자 이름 및 암호 필드를 지우는 것을 비활성화합니다. 기본적으로 false 로 설정됩니다.
|
DAST_AUTH_AFTER_LOGIN_ACTIONS
| 문자열 | 로그인 후 로그인 확인 전에 실행할 작업의 쉼표로 구분된 목록입니다. 현재 “클릭” 작업을 지원합니다. 예: click(on=id:change_to_bar_graph),click(on=css:input[name=username])
|
대상 웹 사이트 업데이트
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과 같은 기타 방식도 작동할 수 있지만, 현재 자동화된 테스트 커버리지의 부족으로 공식적으로 지원되지는 않습니다.
구성을 위해 CI/CD 변수 DAST_AUTH_TYPE
, DAST_AUTH_URL
, DAST_USERNAME
, DAST_PASSWORD
가 DAST 작업에 대해 정의되어 있어야 합니다. 고유한 로그인 URL이 없는 경우, DAST_AUTH_URL
을 DAST_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"
YAML 작업 정의 파일에서 DAST_USERNAME
및 DAST_PASSWORD
를 정의하지 마십시오. 이렇게 하면 보안 위험이 발생할 수 있습니다. 대신 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_PASSWORD_FIELD: "css:[name=password]"
DAST_SUBMIT_FIELD: "css:button[type=submit]"
YAML 작업 정의 파일에서 DAST_USERNAME
및 DAST_PASSWORD
를 정의하지 마십시오. 이렇게 하면 보안 위험이 발생할 수 있습니다. 대신 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]"
YAML 작업 정의 파일에서 DAST_USERNAME
및 DAST_PASSWORD
를 정의하지 마십시오. 이렇게 하면 보안 위험이 발생할 수 있습니다. 대신 GitLab UI를 사용하여 가려진 CI/CD 변수로 만드세요.
더 많은 정보는 프로젝트용 사용자 정의 CI/CD 변수를 참조하세요.
SSO(Single Sign-On) 구성
대부분의 경우 사용자가 응용 프로그램에 로그인할 수 있다면 DAST도 로그인할 수 있습니다. 싱글 사인온을 사용하는 응용 프로그램의 경우 DAST는 단계별 또는 다단계 로그인 양식 구성 가이드를 사용해 인증을 구성해야 합니다.
DAST는 사용자가 외부 식별 공급자 사이트로 리디렉션되어 로그인할 수 있는 인증 프로세스를 지원합니다. DAST의 인증에 대한 알려진 제한 사항을 확인하여 SSO 인증 프로세스가 지원되는지 확인하세요.
로그인 양식으로 이동하려면 클릭
DAST_AUTH_URL
에서 클릭할 요소의 경로를 제공하려면 DAST_BROWSER_PATH_TO_LOGIN_FORM
을 정의하세요. 이 방법은 로그인 양식이 팝업 창에 나타나는 애플리케이션 또는 고유 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을 크롤링하면 사용자가 로그아웃되어 스캔 나머지가 인증되지 않은 상태로 진행됩니다. 따라서 DAST_EXCLUDE_URLS
CI/CD 변수를 사용하여 로그아웃 URL을 제외하는 것이 권장됩니다. DAST는 제외된 URL에 접근하지 않으므로 사용자가 로그인 상태를 유지할 수 있습니다.
제공된 URL은 DAST_WEBSITE
의 기본 경로에 대한 절대 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
| GitLab 15.8에서 Deprecated됩니다. 기본값은 CSS 선택기를 사용하는 것입니다. |
Google Chrome에서 선택기 찾기
Chrome DevTools의 요소 선택 도구는 선택기를 찾는 효과적인 방법입니다.
- Chrome을 열고 예를 들어 사이트의 로그인 페이지인 페이지로 이동합니다.
- macOS의 경우 키보드 단축키
Command + Shift + c
, Windows의 경우Ctrl + Shift + c
를 사용하여 Chrome DevTools의Elements
탭을 엽니다. -
페이지에서 요소를 선택하여 선택하세요
도구를 선택합니다. - 선택하려는 페이지의 필드를 선택합니다.
- 도구가 활성화된 후 필드를 강조 표시합니다.
- 강조 표시된 후에는 요소의 세부 정보, 즉 선택기로 사용하기 적합한 속성을 볼 수 있습니다.
이 예에서 id="user_login"
는 좋은 후보로 보입니다. 이를 DAST 사용자 이름 필드의 선택기로 설정하여 DAST_USERNAME_FIELD: "id:user_login"
로 사용할 수 있습니다.
올바른 선택기 선택
신중한 선택기 선택은 애플리케이션 변경에 대응할 수 있는 스캔을 가능하게 합니다.
선택기를 선택하는 경우 다음 중 선호하는 순서대로 선택해야 합니다:
-
id
필드. 이러한 필드는 일반적으로 페이지에서 고유하며 드물게 변경됩니다. -
name
필드. 이러한 필드는 일반적으로 페이지에서 고유하며 드물게 변경됩니다. - 필드별로 구체적인
class
값, 예를 들어css:.username
선택기의username
클래스에 대한 것입니다. - 필드별 데이터 속성의 존재, 예를 들어
data-username
필드에서 어떤 값이 있는 경우"css:[data-username]"
선택기에 대한 것입니다. - 다중
class
계층 값, 예를 들어css:.login-form .username
선택기의username
클래스가 여러 개지만login-form
클래스가 있는 요소 안에 하나만 있는 경우에 대한 것입니다.
특정 필드를 찾기 위해 선택기를 사용하는 경우에는 다음을 피해야 합니다:
- 동적으로 생성된
id
,name
,속성
,class
또는값
. -
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"
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는 인증할 수 없습니다. 사용자 이름과 암호 두 가지 입력이 제공되어야 합니다.
- DAST는 IndexedDB의 콘텐츠를 크롤 단계로 전달하지 않습니다. 애플리케이션이 인증된 상태를 유지하기 위해 IndexedDB를 사용하는 경우, DAST가 애플리케이션을 크롤할 수 없을 것입니다.
문제 해결
자세한 정보는 문제 해결을 참조하십시오. ```