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 변수
애플리케이션의 DAST 스캔을 위해 필요한 인증 작업을 구성할 수 있는 다음 CI/CD 변수를 사용하십시오.
CI/CD 변수 | 유형 | 설명 |
---|---|---|
DAST_AUTH_COOKIES
| 문자열 | 인증에 사용되는 쿠키의 쉼표로 구분된 디렉터리을 설정하여 지정합니다. |
DAST_AUTH_REPORT
| 부울 | 인증 프로세스 동안 취해진 단계에 대한 보고서를 생성하려면 true 로 설정하십시오. 생성된 보고서에 액세스하려면 gl-dast-debug-auth-report.html 을 CI 작업 artifact로 정의해야 합니다. 보고서 내용은 인증 실패를 디버깅할 때 도움이 됩니다.
|
DAST_AUTH_TYPE 1
| 문자열 | 사용할 인증 타입입니다. 예: basic-digest .
|
DAST_AUTH_URL
| URL | 대상 웹사이트에 로그인 양식이 있는 페이지의 URL입니다. DAST_USERNAME 및 DAST_PASSWORD 는 로그인 양식을 제출하여 인증된 스캔을 만들기 위해 함께 제출됩니다. 예: https://login.example.com .
|
DAST_AUTH_VERIFICATION_LOGIN_FORM
| 부울 | 로그인 양식이 제출된 후 로그인 양식이 없음을 확인하여 인증이 성공적인지 확인합니다. |
DAST_AUTH_VERIFICATION_SELECTOR
| 선택기 | 로그인 양식이 제출된 후 인증이 성공했는지 여부를 결정하는 데 사용되는 존재 여부를 설명하는 선택기입니다. 예: css:.user-photo .
|
DAST_AUTH_VERIFICATION_URL
| URL | 로그인 양식이 제출된 후 브라우저의 URL과 비교되는 URL입니다. 이 예제:"https://example.com/loggedin_page" .
|
DAST_BROWSER_PATH_TO_LOGIN_FORM
| 선택기 |
DAST_USERNAME 및 DAST_PASSWORD 를 입력하기 전에 클릭할 요소를 나타내는 선택기의 쉼표로 구분된 디렉터리입니다. 예: "css:.navigation-menu,css:.login-menu-item" .
|
DAST_EXCLUDE_URLS
| URLs | 인증된 스캔 중에 건너뛸 URL 디렉터리입니다. 쉼표로 구분됩니다. 정규식 구문을 사용하여 여러 URL을 일치시킬 수 있습니다. 예: .* 은 임의의 문자 시퀀스와 일치합니다.
|
DAST_FIRST_SUBMIT_FIELD
| 선택기 | 다단계 로그인 프로세스의 사용자 이름 양식을 제출하는 데 클릭하는 요소를 설명하는 선택기입니다. 예: css:button[type='user-submit'] .
|
DAST_PASSWORD
| 문자열 | 웹 사이트에 인증하려는 비밀번호입니다. 예: P@55w0rd!
|
DAST_PASSWORD_FIELD
| 선택기 | 로그인 양식에서 암호를 입력하는 데 사용되는 요소를 설명하는 선택기입니다. 예: id:password
|
DAST_SUBMIT_FIELD
| 선택기 | 단일 페이지 로그인 양식 또는 다단계 로그인 양식의 로그인 양식을 제출하는 데 클릭한 요소를 설명하는 선택기입니다. 예: css:button[type='submit'] .
|
DAST_USERNAME
| 문자열 | 웹 사이트에 인증하려는 사용자 이름입니다. 예: admin
|
DAST_USERNAME_FIELD
| 선택기 | 로그인 양식에서 사용자 이름을 입력하는 데 사용되는 요소를 설명하는 선택기입니다. 예: name:username
|
DAST_AUTH_DISABLE_CLEAR_FIELDS
| 부울 | 매뉴얼 로그인 시 사용자 이름 및 비밀번호 필드를 지우는 것을 비활성화합니다. 기본적으로 false 로 설정됩니다.
|
DAST_AFTER_LOGIN_ACTIONS
| 문자열 | 로그인 후 로그인 확인 전에 실행할 동작들의 쉼표로 구분된 디렉터리입니다. 현재 “click” 작업을 지원합니다. 예: 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과 같은 다른 체계도 작동할 수 있지만 현재 자동화된 테스트 커버리지가 부족하므로 공식적으로 지원되지는 않습니다.
구성에는 DAST 작업을 위해 DAST_AUTH_TYPE
, DAST_AUTH_URL
, DAST_USERNAME
, DAST_PASSWORD
CI/CD 변수가 정의되어야 합니다. 고유한 로그인 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 변수를 참조하십시오.
기반 분석기는 인증 메커니즘으로 기본 인증을 지원하지 않습니다. 해결책으로는 DAST_REQUEST_HEADERS
를 마스킹된 CI/CD 변수로 설정하여 적절한 Authorization
헤더를 포함한 값을 사용할 수 있습니다. 예를 들어 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]"
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 변수를 참조하십시오.
단일 로그인(Single Sign-On, SSO) 구성
사용자가 애플리케이션에 로그인할 수 있는 경우 대부분의 경우 DAST도 로그인할 수 있습니다. SSO를 사용하는 애플리케이션의 경우 DAST 로그인 양식 구성 가이드를 통해 인증 프로세스를 구성해야 합니다. 단일 단계 또는 다단계 로그인 양식 구성 가이드를 사용하는 SSO 솔루션을 사용하는 애플리케이션을 구성해야 합니다.
DAST는 사용자가 외부 식별 공급자의 사이트로 리디렉션되어 로그인하는 인증 프로세스를 지원합니다. SSO 인증 프로세스가 지원되는지 여부를 결정하는 DAST 인증의 알려진 한계를 확인하세요.
로그인 양식으로 이동하려면 클릭
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을 크롤하면 사용자가 로그아웃되어 스캔의 나머지 부분이 비인증 상태로 진행됩니다.
따라서 로그아웃 URL을 DAST_EXCLUDE_URLS
CI/CD 변수를 사용하여 제외하는 것이 좋습니다. DAST는 제외된 URL에 액세스하지 않으므로 사용자가 계속 로그인된 상태를 유지할 수 있습니다.
제공된 URL은 기본 경로를 기준으로 하는 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 변수에서 사용됩니다.
셀렉터는 type
:search string
형식을 가지고 있습니다. 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 셀렉터를 사용하여 검색하는 것으로 기본값으로 설정됩니다. GitLab 15.8에서 Deprecated 되었으며 명시적으로 셀렉터 유형을 선언하여 대체되었습니다. |
Google Chrome에서 셀렉터 찾기
Chrome 개발도구의 요소 선택 도구는 셀렉터를 찾는 데 효과적인 방법입니다.
- Chrome을 열고 셀렉터를 찾고자 하는 페이지(예: 사이트의 로그인 페이지)로 이동합니다.
- Chrome 개발도구에서
Elements
탭을 열려면 macOS의 키보드 단축키Command + Shift + c
또는 Windows의Ctrl + Shift + c
를 사용합니다. -
페이지에서 요소를 선택해 선택
도구를 선택합니다. - 셀렉터를 알고자 하는 페이지에서 해당 필드를 선택합니다.
- 도구가 활성화된 후에는 세부 정보를 볼 필드를 강조 표시합니다.
- 강조 표시한 후에는 셀렉터로 사용할 수 있는 요소의 세부 정보를 볼 수 있습니다.
이 예에서는 id="user_login"
이 좋은 후보로 보입니다. 이를 DAST_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-10
및dark-grey
와 같은 일반적인 클래스 이름. - 다른 셀렉터 검색보다 성능이 떨어지는 XPath 검색.
-
css:*
및xpath://*
로 시작하는 범위가 정해지지 않은 검색.
인증이 성공적으로 확인하는 방법
DAST가 로그인 양식을 제출한 후에는 인증이 성공적인지를 확인하기 위한 검증 과정이 진행됩니다. 인증이 실패하면 스캔은 오류로 중단됩니다.
로그인 양식을 제출한 후, 인증이 실패하는 경우는 다음과 같습니다:
- 로그인 제출 HTTP 응답이
400
또는500
시리즈 상태 코드를 가집니다. - 어떤 검증 확인이 실패합니다.
- 인증 토큰이 인증 프로세스 중에 충분히 무작위 값을 갖고 설정되지 않는 경우.
검증 확인
검증 확인은 인증이 완료된 후 브라우저의 상태에 대해 확인하기 위한 확인을 실행합니다. DAST는 검증 확인이 구성되어 있지 않으면 로그인 양식이 없음을 테스트합니다.
URL을 기반으로 확인
브라우저 탭에 표시된 URL이 로그인 양식이 성공적으로 제출된 후에 표시되는 URL로 DAST_AUTH_VERIFICATION_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는 채워야 하는 항목이 두 개 이상 필요한 응용 프로그램에는 인증할 수 없습니다. 사용자 이름과 비밀번호 두 가지 입력이 필요합니다.
문제 해결
자세한 내용은 문제 해결을 확인하세요.