DAST 인증

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

경고: 프로덕션 시스템, 프로덕션 서버 또는 프로덕션 데이터를 포함하는 자격 증명을 사용하지 마십시오.

경고: 인증된 스캔을 프로덕션 서버에 실행하지 마십시오. 인증된 스캔은 인증된 사용자가 수행할 수 있는 모든 기능을 수행할 수 있으며, 데이터 수정, 삭제, 폼 제출 및 링크 이동을 포함합니다. 인증된 스캔은 비프로덕션 시스템이나 서버에 대해서만 실행하십시오.

인증은 DAST 스캔 전에 사용자를 로그인하여 취약점을 찾을 때 가능한 한 애플리케이션의 많은 부분을 테스트합니다.

DAST는 브라우저를 사용하여 사용자를 인증하여 로그인 양식에 필요한 JavaScript와 스타일을 갖추게 합니다. DAST는 사용자 이름과 암호 필드를 찾아 해당 값으로 채웁니다. 로그인 양식을 제출하고 응답이 돌아오면 인증이 성공적으로 이루어졌는지 확인하기 위해 일련의 확인 절차를 거칩니다. 인증에 성공하면 DAST는 타깃 애플리케이션을 크롤링할 때 재사용할 자격 증명을 저장합니다.

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

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

시작하기

참고: 시간이 지남에 따라 응용 프로그램의 변경으로 분석기 인증이 계속 작동하는지 정기적으로 확인해야 합니다.

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

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

선행 조건

로그인 양식

HTTP 인증

대상 웹사이트 업데이트

CI/CD 변수 DAST_WEBSITE를 사용하여 정의된 대상 웹사이트는 DAST가 애플리케이션 크롤링을 시작하는 URL입니다.

인증된 스캔의 최상의 크롤 결과를 얻으려면 대상 웹사이트는 사용자가 인증을 거친 후에만 접근 가능한 URL이어야 합니다. 이는 사용자가 로그인한 후에 착륙하는 페이지의 URL일 때가 많습니다.

예시: ```yaml include: - template: DAST.gitlab-ci.yml

dast: variables: DAST_WEBSITE: “https://example.com/dashboard/welcome” DAST_AUTH_URL: “https://example.com/login” ```

HTTP 인증을 위한 구성

Basic Authentication과 같은 HTTP 인증 체계를 사용하려면 DAST_AUTH_TYPE 값을 basic-digest로 설정할 수 있습니다. Negotiate 또는 NTLM과 같은 다른 체계도 작동할 수 있지만, 현재 자동화된 테스트 커버리지가 없으므로 공식적으로 지원되지 않습니다.

구성에는 DAST 작업을 위해 CI/CD 변수 DAST_AUTH_TYPE, DAST_AUTH_URL, DAST_USERNAME, DAST_PASSWORD의 정의가 필요합니다. 고유한 로그인 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"

보안 문제가 발생할 수 있으므로 YAML 작업 정의 파일에서 DAST_USERNAMEDAST_PASSWORD를 정의하지 마십시오. 대신, GitLab UI를 사용하여 마스크 처리된 CI/CD 변수로 만드세요. 자세한 내용은 맞춤 CI/CD 변수를 참조하세요.

프록시 기반 분석기는 인증 메커니즘으로 기본 인증을 지원하지 않습니다. 해결책으로는 적절한 Authorization 헤더를 포함하는 값을 가진 마스크 처리된 CI/CD 변수로 DAST_REQUEST_HEADERS를 설정하는 것일 수 있습니다. 예를 들어, Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQK와 같이 설정할 수 있습니다.

단계별 로그인 양식 구성

단계별 로그인 양식은 모든 로그인 양식 요소가 단일 페이지에 있는 양식입니다. Job 정의 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_USERNAMEDAST_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_USERNAMEDAST_PASSWORD를 정의하지 마십시오. 대신, GitLab UI를 사용하여 마스크 처리된 CI/CD 변수로 만드세요. 자세한 내용은 맞춤 CI/CD 변수를 참조하세요.

싱글 사인온 (SSO) 구성

만약 사용자가 응용 프로그램에 로그인할 수 있다면 대부분의 경우 DAST도 로그인할 수 있습니다. 싱글 사인온을 사용하는 경우에도 DAST는 로그인할 수 있습니다. SSO 솔루션을 사용하는 응용 프로그램은 단일 단계 또는 다중 단계 로그인 폼 구성 가이드를 사용하여 DAST 인증을 구성해야 합니다.

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

로그인 폼으로 이동하려면 클릭하세요

DAST_BROWSER_PATH_TO_LOGIN_FORM을 정의하여 DAST_AUTH_URL에서 클릭할 요소 경로를 제공하여 DAST가 로그인 폼에 액세스할 수 있도록합니다. 이 방법은 로그인 폼이 팝업 (모달) 창에 표시되거나 로그인 폼이 고유한 URL이 없는 경우에 적합합니다.

예시: ```yaml 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는 로그인 후 작업이 실행된 후 인증이 성공적인지 확인하고 인증 토큰을 기록합니다.

예시: ```yaml 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을 제외하는 것이 권장됩니다. 제외된 URL에 DAST가 액세스하지 않아 사용자가 로그인 상태를 유지할 수 있습니다.

제공된 URL은 기본 URL 또는 DAST_WEBSITE의 기본 경로에 상대적인 URL 경로의 정규 표현식일 수 있습니다. 예시: ```yaml 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. 크롬을 열고, 예를 들어 사이트의 로그인 페이지에 대한 페이지로 이동합니다.
  2. macOS의 경우 키보드 단축키 Command + Shift + c, Windows의 경우 Ctrl + Shift + c를 사용하여 Chrome DevTools의 요소 탭을 엽니다.
  3. 페이지에서 선택기를 찾기 위해 페이지의 요소를 선택하여 선택 도구를 선택하세요. search-elements
  4. 선택하고 싶은 필드를 선택합니다.
  5. 도구가 활성화된 후 원하는 필드를 강조 표시하세요. highlight
  6. 강조 표시된 후 요소의 세부 정보를 확인할 수 있습니다. 이 정보에는 선택기로 사용할 수 있는 속성이 포함됩니다.

예를 들어, id="user_login"이 좋은 후보처럼 보입니다. 이를 DAST의 사용자 이름 필드로 사용할 수 있습니다. DAST_USERNAME_FIELD: "id:user_login"으로 설정하세요.

올바른 셀렉터 선택

조준적인 셀렉터 선택은 애플리케이션이 변경되더라도 견고한 스캔을 이끌어냅니다.

선호순으로, 다음을 셀렉터로 선택해야 합니다:

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

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

  • 동적으로 생성된 id, name, 어트리뷰트, class 또는 value와 같은 항목.
  • column-10dark-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는 두 개 이상의 입력이 필요한 애플리케이션에는 인증할 수 없습니다. 사용자 이름과 비밀번호와 같이 두 가지 입력이 제공되어야 합니다.

문제 해결

자세한 정보는 문제 해결을 확인하세요.