분석기 설정 사용자 정의
인증
인증은 인증 토큰을 헤더나 쿠키로 제공하여 처리됩니다. 인증 흐름을 수행하거나 토큰을 계산하는 스크립트를 제공할 수 있습니다.
HTTP 기본 인증
HTTP 기본 인증은 HTTP 프로토콜에 내장된 인증 방법으로 전송 계층 보안(TLS)과 함께 사용됩니다.
패스워드에 대한 CI/CD 변수(예: TEST_API_PASSWORD
)를 만들고 마스킹할 것을 권장합니다. GitLab 프로젝트 페이지의 설정 > CI/CD에서 Variables 섹션에서 CI/CD 변수를 만들 수 있습니다. 마스킹된 변수에 대한 제한 사항으로 패스워드를 추가하기 전에 Base64로 인코딩해야 합니다.
마지막으로, .gitlab-ci.yml
파일에 두 개의 CI/CD 변수를 추가하세요.
-
DAST_API_HTTP_USERNAME
: 인증을 위한 사용자 이름. -
DAST_API_HTTP_PASSWORD_BASE64
: 인증을 위한 Base64로 인코딩된 패스워드.
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_PROFILE: Quick
DAST_API_HAR: test-api-recording.har
DAST_API_TARGET_URL: http://test-deployment/
DAST_API_HTTP_USERNAME: testuser
DAST_API_HTTP_PASSWORD_BASE64: $TEST_API_PASSWORD
Raw 패스워드
패스워드를 Base64로 인코딩하고 싶지 않은 경우(또는 GitLab 15.3 또는 이전 버전을 사용하는 경우) DAST_API_HTTP_PASSWORD_BASE64
대신에 원시 패스워드 DAST_API_HTTP_PASSWORD
를 제공할 수 있습니다.
Bearer 토큰
Bearer 토큰은 OAuth2 및 JSON 웹 토큰(JWT)을 포함한 여러 인증 메커니즘에서 사용됩니다. Bearer 토큰은 Authorization
HTTP 헤더를 사용하여 전송됩니다. DAST API에서 Bearer 토큰을 사용하려면 다음 중 하나가 필요합니다.
- 만료되지 않는 토큰.
- 테스트의 길이에 맞게 지속되는 토큰 생성 방법.
- DAST API에서 토큰을 생성하기 위해 호출할 수 있는 Python 스크립트.
만료되지 않는 토큰
Bearer 토큰이 만료되지 않는 경우, DAST_API_OVERRIDES_ENV
변수를 사용하여 제공하세요. 이 변수의 내용은 DAST API의 발신 HTTP 요청에 추가할 헤더 및 쿠키를 제공하는 JSON 스니펫입니다. DAST_API_OVERRIDES_ENV
에 Bearer 토큰을 제공하려면 다음 단계를 따르세요.
-
예를 들어
TEST_API_BEARERAUTH
와 같이 변수를 생성하고 해당 값으로{"headers":{"Authorization":"Bearer dXNlcm5hbWU6cGFzc3dvcmQ="}}
(토큰으로 대체)을 설정하세요. GitLab 프로젝트 페이지의 설정 > CI/CD에서 CI/CD 변수를 만들 수 있습니다.TEST_API_BEARERAUTH
의 형식 때문에 변수를 마스킹할 수 없습니다. 토큰 값을 마스킹하려면 두 번째 변수를 생성하고 해당 값을 정의한 후TEST_API_BEARERAUTH
에{"headers":{"Authorization":"Bearer $MASKED_VARIABLE"}}
값을 정의하세요. -
.gitlab-ci.yml
파일에서DAST_API_OVERRIDES_ENV
를 방금 생성한 변수로 설정하세요.stages: - dast include: - template: DAST-API.gitlab-ci.yml variables: DAST_API_PROFILE: Quick DAST_API_OPENAPI: test-api-specification.json DAST_API_TARGET_URL: http://test-deployment/ DAST_API_OVERRIDES_ENV: $TEST_API_BEARERAUTH
-
인증이 작동하는지 확인하려면 DAST API 테스트를 실행하고 작업 로그와 테스트 API의 애플리케이션 로그를 확인하세요.
테스트 실행 중 생성된 토큰
Bearer 토큰이 생성되어 테스트 중에 만료되지 않는 경우, DAST API에 토큰을 포함하는 파일을 제공할 수 있습니다. 이 파일은 이전 단계 및 작업 또는 DAST API 작업의 일부가 생성할 수 있습니다.
DAST API는 다음 구조의 JSON 파일을 받을 것을 기대합니다.
{
"headers" : {
"Authorization" : "Bearer dXNlcm5hbWU6cGFzc3dvcmQ="
}
}
이 파일은 이전 단계에서 생성되어 DAST_API_OVERRIDES_FILE
CI/CD 변수를 통해 DAST API에 제공됩니다.
.gitlab-ci.yml
파일에서 DAST_API_OVERRIDES_FILE
을 설정하세요.
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_PROFILE: Quick
DAST_API_OPENAPI: test-api-specification.json
DAST_API_TARGET_URL: http://test-deployment/
DAST_API_OVERRIDES_FILE: dast-api-overrides.json
인증이 작동하는지 확인하려면 DAST API 테스트를 실행하고 작업 로그 및 테스트 API의 애플리케이션 로그를 확인하세요.
토큰이 짧은 유효 기간을 가지는 경우
Bearer 토큰이 생성되어 테스트 완료 전에 만료되는 경우, DAST API 스캐너가 주어진 간격에 실행할 수 있는 프로그램이나 스크립트를 제공할 수 있습니다. 제공된 스크립트는 Python 3과 Bash가 설치된 Alpine Linux 컨테이너에서 실행됩니다. Python 스크립트가 추가 패키지를 필요로 하는 경우에는 이를 런타임에서 감지하고 패키지를 설치해야 합니다.
스크립트는 특정 형식의 Bearer 토큰을 포함하는 JSON 파일을 작성해야 합니다.
{
"headers" : {
"Authorization" : "Bearer dXNlcm5hbWU6cGFzc3dvcmQ="
}
}
올바른 동작에 대한 세 가지 CI/CD 변수를 제공해야 합니다.
-
DAST_API_OVERRIDES_FILE
: 제공된 명령이 생성하는 JSON 파일. -
DAST_API_OVERRIDES_CMD
: JSON 파일을 생성하는 명령. -
DAST_API_OVERRIDES_INTERVAL
: 명령을 실행하는 간격(초 단위).
예를 들어:
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_PROFILE: Quick
DAST_API_OPENAPI: test-api-specification.json
DAST_API_TARGET_URL: http://test-deployment/
DAST_API_OVERRIDES_FILE: dast-api-overrides.json
DAST_API_OVERRIDES_CMD: renew_token.py
DAST_API_OVERRIDES_INTERVAL: 300
인증이 작동하는지 확인하려면 DAST API 테스트를 실행하고 작업 로그와 테스트 API의 애플리케이션 로그를 확인하세요. 더 많은 정보는 overrides section을 참조하세요.
오버라이드
DAST API는 요청에서 특정 항목을 추가하거나 재정의하는 방법을 제공합니다. 예를 들면:
- 헤더
- 쿠키
- 쿼리 문자열
- 폼 데이터
- JSON 노드
- XML 노드
이를 사용하여 의미 있는 버전 헤더, 인증 등을 주입할 수 있습니다. 인증 섹션에는 해당 목적으로 오버라이드를 사용하는 예시가 포함되어 있습니다.
오버라이드는 각각의 오버라이드 유형을 JSON 객체로 표현하는 JSON 문서를 사용합니다:
{
"headers": {
"header1": "value",
"header2": "value"
},
"cookies": {
"cookie1": "value",
"cookie2": "value"
},
"query": {
"query-string1": "value",
"query-string2": "value"
},
"body-form": {
"form-param1": "value",
"form-param2": "value"
},
"body-json": {
"json-path1": "value",
"json-path2": "value"
},
"body-xml" : {
"xpath1": "value",
"xpath2": "value"
}
}
단일 헤더 설정 예시:
{
"headers": {
"Authorization": "Bearer dXNlcm5hbWU6cGFzc3dvcmQ="
}
}
헤더와 쿠키를 모두 설정하는 예시:
{
"headers": {
"Authorization": "Bearer dXNlcm5hbWU6cGFzc3dvcmQ="
},
"cookies": {
"flags": "677"
}
}
body-form
오버라이드 설정을 위한 사용 예시:
{
"body-form": {
"username": "john.doe"
}
}
요청 본문이 폼 데이터 콘텐츠만 있는 경우 오버라이드 엔진은body-form
을 사용합니다.
body-json
오버라이드 설정을 위한 사용 예시:
{
"body-json": {
"$.credentials.access-token": "iddqd!42.$"
}
}
객체 body-json
의 각 JSON 속성 이름은 JSON Path 표현식으로 설정됩니다. JSON Path 표현식 $.credentials.access-token
은 iddqd!42.$
값으로 재정의할 노드를 식별합니다. 오버라이드 엔진은 요청 본문이 JSON 콘텐츠만 있는 경우 body-json
을 사용합니다.
예를 들어, 본문이 다음과 같이 설정된 경우:
{
"credentials" : {
"username" :"john.doe",
"access-token" : "non-valid-password"
}
}
다음과 같이 변경됩니다:
{
"credentials" : {
"username" :"john.doe",
"access-token" : "iddqd!42.$"
}
}
body-xml
오버라이드 설정을 위한 사용 예시입니다. 첫 번째 항목은 XML 속성을, 두 번째 항목은 XML 요소를 재정의합니다:
{
"body-xml" : {
"/credentials/@isEnabled": "true",
"/credentials/access-token/text()" : "iddqd!42.$"
}
}
객체 body-xml
의 각 JSON 속성 이름은 XPath v2 식으로 설정됩니다. XPath 식 /credentials/@isEnabled
은 값을 true
로 재정의할 속성 노드를 식별하고, XPath 식 /credentials/access-token/text()
은 값을 iddqd!42.$
로 재정의할 요소 노드를 식별합니다. 오버라이드 엔진은 요청 본문이 XML 콘텐츠만 있는 경우 body-xml
을 사용합니다.
예를 들어, 본문이 다음과 같이 설정된 경우:
<credentials isEnabled="false">
<username>john.doe</username>
<access-token>non-valid-password</access-token>
</credentials>
다음과 같이 변경됩니다:
<credentials isEnabled="true">
<username>john.doe</username>
<access-token>iddqd!42.$</access-token>
</credentials>
이 JSON 문서를 파일이나 환경 변수로 제공할 수 있습니다. 또한 만료되는 값을 지원하기 위해 일정 간격으로 실행되는 명령을 제공할 수 있습니다.
파일 사용
오버라이드 JSON을 파일로 제공하려면 DAST_API_OVERRIDES_FILE
CI/CD 변수를 설정합니다. 경로는 작업의 현재 작업 디렉터리를 기준으로 상대적입니다.
다음은 .gitlab-ci.yml
의 예시입니다:
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_PROFILE: Quick
DAST_API_OPENAPI: test-api-specification.json
DAST_API_TARGET_URL: http://test-deployment/
DAST_API_OVERRIDES_FILE: dast-api-overrides.json
CI/CD 변수 사용
오버라이드 JSON을 CI/CD 변수로 제공하려면 DAST_API_OVERRIDES_ENV
변수를 사용합니다.
이를 통해 마스킹 및 보호할 수 있는 변수로 JSON을 배치할 수 있습니다.
다음의 .gitlab-ci.yml
예시에서 DAST_API_OVERRIDES_ENV
변수가 직접 JSON으로 설정되어 있습니다:
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_PROFILE: Quick
DAST_API_OPENAPI: test-api-specification.json
DAST_API_TARGET_URL: http://test-deployment/
DAST_API_OVERRIDES_ENV: '{"headers":{"X-API-Version":"2"}}'
다음의 .gitlab-ci.yml
예시에서 SECRET_OVERRIDES
변수가 JSON을 제공합니다. 이는
UI에서 정의된 그룹 또는 인스턴스 수준의 CI/CD 변수입니다:
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_PROFILE: Quick
DAST_API_OPENAPI: test-api-specification.json
DAST_API_TARGET_URL: http://test-deployment/
DAST_API_OVERRIDES_ENV: $SECRET_OVERRIDES
명령어 사용
만약 값이 생성되거나 만료되면, DAST API 스캐너에게 지정된 간격으로 실행할 프로그램 또는 스크립트를 제공할 수 있습니다. 제공된 명령은 Python 3과 Bash가 설치된 Alpine Linux 컨테이너에서 실행됩니다.
DAST_API_OVERRIDES_CMD 환경 변수를 설정하여 실행을 원하는 프로그램 또는 스크립트로 지정해야 합니다. 제공된 명령은 이전에 정의된 대로 오버라이드 JSON 파일을 생성합니다.
NodeJS나 Ruby와 같은 다른 스크립팅 런타임을 설치하거나 오버라이드 명령을 위한 종속 항목을 설치해야 할 수도 있습니다. 이 경우, DAST_API_PRE_SCRIPT를 설정하여 해당 전제 조건을 제공하는 스크립트의 파일 경로를 권장합니다. DAST_API_PRE_SCRIPT가 제공하는 스크립트는 분석기가 시작되기 전 한 번 실행됩니다.
Alpine Linux 패키지 관리 페이지에서 Alpine Linux 패키지를 설치하는 데 대한 정보를 확인하세요.
다음과 같이 올바르게 작동하는 세 가지 CI/CD 변수를 제공해야 합니다.
- DAST_API_OVERRIDES_FILE: 제공된 명령에 의해 생성된 파일.
- DAST_API_OVERRIDES_CMD: 오버라이드 JSON 파일을 주기적으로 생성하는 오버라이드 명령.
- DAST_API_OVERRIDES_INTERVAL: 명령을 실행하는 간격(초).
선택 사항:
- DAST_API_PRE_SCRIPT: 스캔이 시작하기 전 스크립팅 런타임이나 종속 항목을 설치하는 스크립트.
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_PROFILE: Quick
DAST_API_OPENAPI: test-api-specification.json
DAST_API_TARGET_URL: http://test-deployment/
DAST_API_OVERRIDES_FILE: dast-api-overrides.json
DAST_API_OVERRIDES_CMD: renew_token.py
DAST_API_OVERRIDES_INTERVAL: 300
오버라이드 디버깅
기본적으로 오버라이드 명령의 출력은 숨겨집니다. 오버라이드 명령이 0이 아닌 종료 코드를 반환하면 해당 명령이 작업 출력의 일부로 표시됩니다. 선택 사항으로, DAST_API_OVERRIDES_CMD_VERBOSE
변수를 설정하여 오버라이드 명령 출력을 생성되는 대로 표시할 수 있습니다. 이것은 오버라이드 스크립트를 테스트할 때 유용하지만 테스트 속도를 늦추므로 비활성화하는 것이 좋습니다.
또한 스크립트에서 작업이 완료되거나 실패할 때 수집되는 로그 파일에 메시지를 작성할 수도 있습니다. 로그 파일은 특정 위치에 만들어야 하며 특정한 명명 규칙을 따라야 합니다.
오버라이드 스크립트에 기본적인 로깅을 추가하면 작업이 표준적으로 실행되는 동안 스크립트가 예기치 않게 실패하는 경우에 유용합니다. 로그 파일은 작업의 artifact로 자동으로 포함되므로 작업이 완료된 후에 다운로드할 수 있습니다.
우리의 예제를 따라, 환경 변수 DAST_API_OVERRIDES_CMD
에 renew_token.py
를 제공했습니다. 스크립트에서 두 가지 사항을 주목하세요:
- 로그 파일은 환경 변수
CI_PROJECT_DIR
에 저장됩니다. - 로그 파일 이름은
gl-*.log
패턴과 일치해야 합니다.
#!/usr/bin/env python
# 오버라이드 명령의 예제
# 오버라이드 명령은 사용할 새 값으로 오버라이드 JSON 파일을 업데이트할 수 있습니다. 이는 테스트 중에 만료될 수 있는 인증 토큰을 업데이트하는 좋은 방법입니다.
import logging
import json
import os
import requests
import backoff
# [1] 환경 변수 CI_PROJECT_DIR에서 로그 파일 저장
working_directory = os.environ.get('CI_PROJECT_DIR')
overrides_file_name = os.environ.get('DAST_API_OVERRIDES_FILE', 'dast-api-overrides.json')
overrides_file_path = os.path.join(working_directory, overrides_file_name)
# [2] 파일 이름은 다음 패턴과 일치해야 함: gl-*.log
log_file_path = os.path.join(working_directory, 'gl-user-overrides.log')
# 로거 설정
logging.basicConfig(filename=log_file_path, level=logging.DEBUG)
# 일시적 오류 발생 시 재시도하기 위해 `backoff` 데코레이터 사용
@backoff.on_exception(backoff.expo,
(requests.exceptions.Timeout,
requests.exceptions.ConnectionError),
max_time=30)
def get_auth_response():
authorization_url = 'https://authorization.service/api/get_api_token'
return requests.get(
f'{authorization_url}',
auth=(os.environ.get('AUTH_USER'), os.environ.get('AUTH_PWD'))
)
# 우리의 예제에서 액세스 토큰은 지정된 엔드포인트에서 검색됩니다.
try:
# http 요청 수행, 응답 샘플:
# { "Token" : "abcdefghijklmn" }
response = get_auth_response()
# 요청이 성공했는지 확인. `requests.exceptions.HTTPError`를 발생시킬 수 있음
response.raise_for_status()
# JSON 데이터 가져오기
response_body = response.json()
# 필요한 경우 특정 예외를 처리할 수 있음
# requests.ConnectionError : 네트워크 연결 오류가 발생했습니다
# requests.HTTPError : HTTP 요청이 실패했습니다. [Response.raise_for_status()]
# requests.ConnectTimeout : 요청 시간이 지정한 연결 시간을 초과했습니다
# requests.ReadTimeout : 서버가 할당된 시간 내에 데이터를 보내지 않았습니다.
# requests.TooManyRedirects : 요청이 구성된 최대 리디렉션 수를 초과했습니다
# requests.exceptions.RequestException : Requests와 관련된 모든 예외
except json.JSONDecodeError as json_decode_error:
# JSON 응답 디코딩 관련 오류 기록
logging.error(f'오류, JSON 응답 디코딩 중 실패. 오류 메시지: {json_decode_error}')
raise
except requests.exceptions.RequestException as requests_error:
# `Requests`와 관련된 예외 기록
logging.error(f'오류, HTTP 요청 수행 중 실패. 오류 메시지: {requests_error}')
raise
except Exception as e:
# 기타 오류 기록
logging.error(f'오류, 알 수 없는 오류로 액세스 토큰 검색 실패. 오류 메시지: {e}')
raise
# 오버라이드 파일 콘텐츠를 보유하는 객체 계산
# 요청에서 가져온 데이터 사용
overrides_data = {
"headers": {
"Authorization": f"Token {response_body['Token']}"
}
}
# 파일 오버라이드 계산에 대한 로그 항목
logging.info("오버라이드 파일 생성 중: %s" % overrides_file_path)
# 파일 덮어씌우려 시도
try:
if os.path.exists(overrides_file_path):
os.unlink(overrides_file_path)
# 파일 업데이트됨을 알리는 사전 업데이트한 사전으로 파일 덮어씌우기
with open(overrides_file_path, "wb+") as fd:
fd.write(json.dumps(overrides_data).encode('utf-8'))
except Exception as e:
# 기타 오류 기록
logging.error(f'오류, 파일 {overrides_file_path} 덮어쓸 때 알 수 없는 오류 발생. 오류 메시지: {e}')
raise
# 오버라이드가 성공적으로 완료되었음을 기록
logging.info("오버라이드 파일이 업데이트되었습니다")
# 끝
오버라이드 명령 예제에서 Python 스크립트는 backoff
라이브러리에 의존합니다. Python 스크립트를 실행하기 전에 라이브러리가 설치되어 있는지 확인하려면 DAST_API_PRE_SCRIPT
를 귀하는 새로운 user-pre-scan-set-up.sh
스크립트로 설정해야 합니다.
#!/bin/bash
# user-pre-scan-set-up.sh
# python 종속 항목이 설치되었는지 확인
echo "**** python 종속 항목 설치 ****"
python3 -m ensurepip
pip3 install --no-cache --upgrade \
pip \
backoff
echo "**** python 종속 항목이 설치되었습니다 ****"
# 끝
구성을 업데이트하여 DAST_API_PRE_SCRIPT
를 새로운 user-pre-scan-set-up.sh
스크립트로 설정해야 합니다. 예를 들어:
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_PROFILE: Quick
DAST_API_OPENAPI: test-api-specification.json
DAST_API_TARGET_URL: http://test-deployment/
DAST_API_PRE_SCRIPT: user-pre-scan-set-up.sh
DAST_API_OVERRIDES_FILE: dast-api-overrides.json
DAST_API_OVERRIDES_CMD: renew_token.py
DAST_API_OVERRIDES_INTERVAL: 300
이전 예제에서 user-pre-scan-set-up.sh
스크립트를 사용하여 오버라이드 명령에서 사용할 런타임이나 응용 프로그램을 설치할 수 있습니다.
요청 헤더
요청 헤더 기능을 사용하면 스캔 세션 동안 헤더의 고정값을 지정할 수 있습니다. 예를 들어, 구성 변수 DAST_API_REQUEST_HEADERS
를 사용하여 Cache-Control
헤더에 고정값을 설정할 수 있습니다. 필요한 헤더에 Authorization
헤더와 같은 민감한 값이 포함된 경우에는 마스크된 변수 기능과 함께 변수 DAST_API_REQUEST_HEADERS_BASE64
를 사용하세요.
스캔이 진행 중일 때 Authorization
헤더나 다른 헤더를 업데이트해야 하는 경우에는 overrides 기능을 고려해보세요.
변수 DAST_API_REQUEST_HEADERS
를 사용하면 쉼표로 구분된 헤더 디렉터리을 지정할 수 있습니다. 이러한 헤더는 스캐너가 수행하는 각 요청에 포함됩니다. 디렉터리의 각 헤더 항목은 이름 다음에 콜론(:
)이 오고 그 다음에 값이 옵니다. 키나 값 앞의 공백은 무시됩니다. 예를 들어, Cache-Control
이름을 가진 헤더에 값 max-age=604800
를 선언하려면 헤더 항목은 Cache-Control: max-age=604800
입니다. 두 개의 헤더, Cache-Control: max-age=604800
와 Age: 100
을 사용하려면 DAST_API_REQUEST_HEADERS
변수를 Cache-Control: max-age=604800, Age: 100
로 설정하세요.
다양한 헤더가 제공되는 변수 DAST_API_REQUEST_HEADERS
에 포함된 순서는 결과에 영향을 미치지 않습니다. Cache-Control: max-age=604800, Age: 100
으로 설정하든, Age: 100, Cache-Control: max-age=604800
으로 설정하든 동일한 결과를 얻습니다.
Base64
DAST_API_REQUEST_HEADERS_BASE64
변수는 DAST_API_REQUEST_HEADERS
와 동일한 헤더 디렉터리을 허용하지만, 변수의 전체 값은 반드시 Base64로 인코딩되어 있어야 합니다. 예를 들어, DAST_API_REQUEST_HEADERS_BASE64
변수를 Authorization: QmVhcmVyIFRPS0VO, Cache-control: bm8tY2FjaGU=
로 설정하려면 디렉터리을 해당 Base64 등가물로 변환한 후 사용해야 합니다: QXV0aG9yaXphdGlvbjogUW1WaGNtVnlJRlJQUzBWTywgQ2FjaGUtY29udHJvbDogYm04dFkyRmphR1U9
. 이는 마스크된 변수에 비밀 헤더 값이 저장될 때 유용합니다.
예시: 일반 텍스트를 사용하여 각 요청에 헤더 디렉터리 추가
다음 .gitlab-ci.yml
예시에서 DAST_API_REQUEST_HEADERS
구성 변수는 요청 헤더에 설명된 두 개의 헤더 값을 제공하도록 설정됩니다.
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_PROFILE: Quick
DAST_API_OPENAPI: test-api-specification.json
DAST_API_TARGET_URL: http://test-deployment/
DAST_API_REQUEST_HEADERS: 'Cache-control: no-cache, Save-Data: on'
예시: 마스크된 CI/CD 변수 사용
다음 .gitlab-ci.yml
예시는 마스크된 변수 SECRET_REQUEST_HEADERS_BASE64
가 그룹 또는 UI에서 정의된 인스턴스 레벨 CI/CD 변수로 가정합니다. SECRET_REQUEST_HEADERS_BASE64
의 값은 X-ACME-Secret: s3cr3t!, X-ACME-Token: 705d16f5e3fb
의 Base64 인코딩된 텍스트 버전인 WC1BQ01FLVNlY3JldDogc31jcnt0ISwgWC1BQ01FLVRva2VuOiA3MDVkMTZmNWUzZmI=
로 설정됩니다. 그런 다음 다음과 같이 사용할 수 있습니다:
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_PROFILE: Quick
DAST_API_OPENAPI: test-api-specification.json
DAST_API_TARGET_URL: http://test-deployment/
DAST_API_REQUEST_HEADERS_BASE64: $SECRET_REQUEST_HEADERS_BASE64
마스크된 변수에 비밀 헤더 값을 저장할 때에는 DAST_API_REQUEST_HEADERS_BASE64
를 고려해보세요. 이는 문자 집합 제한이 있는 마스크된 변수에 비밀 헤더 값을 저장할 때 유용합니다.
경로 제외
API를 테스트할 때 특정 경로를 제외하는 것이 유용할 수 있습니다. 예를 들어, 인증 서비스나 API의 이전 버전을 테스트에서 제외할 수 있습니다. 경로를 제외하려면 .gitlab-ci.yml
파일에서 DAST_API_EXCLUDE_PATHS
CI/CD 변수를 사용하세요. 여러 경로를 제외하려면 ;
문자를 사용하여 항목을 분리하세요. 제공된 경로에서는 단일 문자 와일드카드 ?
와 다중 문자 와일드카드 *
를 사용할 수 있습니다.
경로가 제외되었는지 확인하려면 작업 결과에서 테스트된 작업(Operations)
및 제외된 작업(Excluded Operations)
부분을 검토하세요. 테스트된 작업
에 제외된 경로가 표시되지 않아야 합니다.
예시
이 예는 /auth
리소스를 제외합니다. 이것은 하위 리소스(/auth/child
)는 제외하지 않습니다.
variables:
DAST_API_EXCLUDE_PATHS: /auth
/auth
와 하위 리소스(/auth/child
)를 제외하려면 와일드카드를 사용합니다.
variables:
DAST_API_EXCLUDE_PATHS: /auth*
여러 경로를 제외하려면 ;
문자를 사용합니다. 이 예에서는 /auth*
및 /v1/*
를 제외합니다.
variables:
DAST_API_EXCLUDE_PATHS: /auth*;/v1/*
경로 내의 하나 이상의 중첩된 수준을 제외하려면 **
를 사용합니다. 이 예에서는 API 엔드포인트를 테스트하고 있습니다. 우리는 planet
, moon
, star
, 및 satellite
객체의 mass
, brightness
, 및 coordinates
데이터를 요청하는 /api/v1/
및 /api/v2/
을 테스트하고 있습니다. 검색할 수 있는 예제 경로에는 다음과 같은 것들이 있습니다:
/api/v2/planet/coordinates
/api/v1/star/mass
/api/v2/satellite/brightness
이 예에서는 brightness
엔드포인트만 테스트합니다:
variables:
DAST_API_EXCLUDE_PATHS: /api/**/mass;/api/**/coordinates
매개변수 제외
- GitLab 14.10에서 도입되었습니다.
API를 테스트하는 동안 매개변수(쿼리 문자열, 헤더 또는 본문 요소)를 테스트에서 제외하고 싶을 수 있습니다. 이는 매개변수가 항상 실패를 일으키거나 테스트를 늦추는 경우 또는 다른 이유로 필요할 수 있습니다. 매개변수를 제외하려면 다음 변수 중 하나를 설정할 수 있습니다: DAST_API_EXCLUDE_PARAMETER_ENV
또는 DAST_API_EXCLUDE_PARAMETER_FILE
.
DAST_API_EXCLUDE_PARAMETER_ENV
는 매개변수를 제외하는 JSON 문자열을 제공합니다. 이것은 JSON이 짧고 자주 변경되지 않을 때 좋은 옵션입니다. 또 다른 옵션은 DAST_API_EXCLUDE_PARAMETER_FILE
변수입니다. 이 변수는 리포지터리에 체크인할 수 있고, 다른 작업에서 artifact로 생성하거나 DAST_API_PRE_SCRIPT
를 사용하여 미리 스크립트를 사용하여 런타임에 생성할 수 있는 파일 경로로 설정됩니다.
JSON 문서를 사용한 매개변수 제외
JSON 문서에는 JSON 객체가 포함되어 있으며, 이 객체는 제외할 매개변수를 식별하기 위해 특정 속성을 사용합니다. 스캔 프로세스 중에 특정 매개변수를 제외하려면 다음과 같은 속성을 제공할 수 있습니다:
-
headers
: 특정 헤더를 제외하려면 이 속성을 사용합니다. 이 속성의 값은 제외할 헤더 이름의 배열입니다. 이름은 대소 문자를 구분하지 않습니다. -
cookies
: 특정 쿠키를 제외하려면 이 속성을 사용합니다. 이 속성의 값은 제외할 쿠키 이름의 배열입니다. 이름은 대소 문자를 구분합니다. -
query
: 쿼리 문자열에서 특정 필드를 제외하려면 이 속성을 사용합니다. 이 속성의 값은 제외할 쿼리 문자열의 필드 이름의 배열입니다. 이름은 대소 문자를 구분합니다. -
body-form
:application/x-www-form-urlencoded
미디어 유형을 사용하는 요청의 본문에서 특정 필드를 제외하려면 이 속성을 사용합니다. 이 속성의 값은 본문에서 제외할 필드 이름의 배열입니다. 이름은 대소 문자를 구분합니다. -
body-json
:application/json
미디어 유형을 사용하는 요청의 JSON 노드를 제외하려면 이 속성을 사용합니다. 이 속성의 값은 각 항목이 JSON Path 표현식인 배열입니다. -
body-xml
:application/xml
미디어 유형을 사용하는 요청의 XML 노드를 제외하려면 이 속성을 사용합니다. 이 속성의 값은 각 항목이 XPath v2 표현식인 배열입니다.
따라서, 다음 JSON 문서는 매개변수를 제외할 때 예상되는 구조의 예제입니다.
{
"headers": [
"header1",
"header2"
],
"cookies": [
"cookie1",
"cookie2"
],
"query": [
"query-string1",
"query-string2"
],
"body-form": [
"form-param1",
"form-param2"
],
"body-json": [
"json-path-expression-1",
"json-path-expression-2"
],
"body-xml" : [
"xpath-expression-1",
"xpath-expression-2"
]
}
예시
하나의 헤더 제외
Upgrade-Insecure-Requests
헤더를 제외하려면 header
속성의 값을 헤더 이름을 포함한 배열로 설정합니다: [ "Upgrade-Insecure-Requests" ]
. 예를 들어, JSON 문서는 다음과 같습니다:
{
"headers": [ "Upgrade-Insecure-Requests" ]
}
헤더 이름은 대소 문자를 구분하지 않으므로, UPGRADE-INSECURE-REQUESTS
헤더 이름은 Upgrade-Insecure-Requests
와 동일합니다.
헤더와 두 개의 쿠키 제외
Authorization
헤더와 PHPSESSID
, csrftoken
쿠키를 제외하려면 headers
속성의 값을 헤더 이름으로 하는 배열 [ "Authorization" ]
과 cookies
속성의 값의 쿠키 이름으로 하는 배열 [ "PHPSESSID", "csrftoken" ]
로 설정합니다. 예를 들어, JSON 문서는 다음과 같습니다:
{
"headers": [ "Authorization" ],
"cookies": [ "PHPSESSID", "csrftoken" ]
}
body-form
매개변수 제외
application/x-www-form-urlencoded
콘텐츠 유형을 사용하는 요청에서 password
필드를 제외하려면 body-form
속성의 값으로 필드 이름을 포함한 배열 [ "password" ]
을 설정합니다. 예를 들어, JSON 문서는 다음과 같습니다:
{
"body-form": [ "password" ]
}
매개변수를 제외하는 데 body-form
을 사용합니다. 이 경우 요청이 콘텐츠 유형 application/x-www-form-urlencoded
를 사용합니다.
JSON Path를 사용하여 특정 JSON 노드 제외
루트 객체에서 schema
속성을 제외하려면 body-json
속성의 값으로 [ "$.schema" ]
JSON Path 표현식을 포함한 배열을 설정합니다.
JSON Path 표현식은 JSON 노드를 식별하기 위해 특수 구문을 사용합니다: $
는 JSON 문서의 루트를 가리킵니다. .
은 현재 객체를 가리킵니다 (우리의 경우 루트 객체). schema
는 속성 이름을 가리킵니다. 따라서, JSON 경로 표현식 $.schema
는 루트 객체의 schema
속성을 가리킵니다.
예를 들어, JSON 문서는 다음과 같습니다:
{
"body-json": [ "$.schema" ]
}
매개변수를 제외하는 데 body-json
을 사용합니다. 요청이 콘텐츠 유형 application/json
을 사용하는 경우입니다. body-json
의 각 항목은 JSON Path 표현식이어야 합니다. JSON Path에는 $
, *
, .
같은 문자가 특별한 의미를 갖습니다.
JSON 경로를 사용하여 여러 JSON 노드 제외하기
루트 수준의 사용자
배열의 각 항목에서 password
속성을 제외하려면 body-json
속성의 값을 JSON Path 표현식을 사용하는 배열로 설정하세요. [ "$.users[*].paswword" ]
JSON Path 표현식은 $
로 루트 노드를 가리키고 .
을 사용하여 현재 노드를 가리킵니다. 그런 다음 users
를 사용하여 속성을 가리키고, 대신 숫자를 색인으로 제공하는 대신 *
를 사용하여 모든 색인을 지정합니다. 색인 참조 후에는 이제 선택한 배열의 모든 색인을 나타내는 .
이 나오고, password
라는 속성 이름이 앞에 옵니다.
예를 들어, JSON 문서는 다음과 같습니다:
{
"body-json": [ "$.users[*].paswword" ]
}
요청이 콘텐츠 유형 application/json
을 사용하는 경우 제외 매개변수는 요청할 때 body-json
을 사용합니다. body-json
의 각 항목은 JSON Path 표현식이어야 합니다. JSON Path에는 $
, *
, .
, 등이 특별한 의미를 가집니다.
XML 속성 제외하기
루트 요소 credentials
에 있는 isEnabled
이라는 속성을 제외하려면 body-xml
속성의 값을 XPath 표현식을 사용하는 배열로 설정하세요. [ "/credentials/@isEnabled" ]
XPath 표현식 /credentials/@isEnabled
은 /
로 XML 문서의 루트를 나타내며, 일치하는 요소의 이름을 나타내는 credentials
가 뒤 따릅니다. 이전 XML 요소의 노드를 가리키기 위해 /
를 사용하고, isEnable
이름은 속성임을 나타내기 위해 @
문자를 사용합니다.
예를 들어, JSON 문서는 다음과 같습니다:
{
"body-xml": [
"/credentials/@isEnabled"
]
}
요청이 콘텐츠 유형 application/xml
을 사용하는 경우 제외 매개변수는 요청할 때 body-xml
을 사용합니다. body-xml
의 각 항목은 XPath v2 표현식이어야 합니다. XPath 표현식에는 @
, /
, :
, [
, ]
등의 문자가 특별한 의미를 가집니다.
XML 텍스트 요소 제외하기
루트 노드 credentials
에 포함된 username
요소의 텍스트를 제외하려면 body-xml
속성의 값을 XPath 표현식을 사용하는 배열로 설정하세요. [/credentials/username/text()" ]
.
XPath 표현식 /credentials/username/text()
에서 첫 번째 문자 /
는 XML 노드를 가리킵니다. 그리고 그 다음에 XML 요소의 이름 credentials
가 나옵니다. 유사하게 /
문자는 현재 요소를 나타내고, 새 XML 요소의 이름 username
이 나옵니다. 마지막 부분에서는 현재 요소를 가리키고, 현재 요소의 텍스트를 식별하는 text()
라는 XPath 함수를 사용합니다.
예를 들어, JSON 문서는 다음과 같습니다:
{
"body-xml": [
"/credentials/username/text()"
]
}
요청이 콘텐츠 유형 application/xml
을 사용하는 경우 제외 매개변수는 요청할 때 body-xml
을 사용합니다. body-xml
의 각 항목은 XPath v2 표현식이어야 합니다. XPath 표현식에는 @
, /
, :
, [
, ]
등의 문자가 특별한 의미를 가집니다.
XML 요소 제외하기
루트 노드 credentials
에 포함된 username
요소를 제외하려면 body-xml
속성의 값을 XPath 표현식을 사용하는 배열로 설정하세요. [/credentials/username" ]
.
XPath 표현식 /credentials/username
에서 첫 번째 문자 /
는 XML 문서의 루트를 가리키고, 그 다음에는 XML 요소의 이름 credentials
가 나옵니다. 마찬가지로, /
문자는 현재 요소를 나타내고, 새 XML 요소의 이름 username
이 나옵니다.
예를 들어, JSON 문서는 다음과 같습니다:
{
"body-xml": [
"/credentials/username"
]
}
요청이 콘텐츠 유형 application/xml
을 사용하는 경우 제외 매개변수는 요청할 때 body-xml
을 사용합니다. body-xml
의 각 항목은 XPath v2 표현식이어야 합니다. XPath 표현식에는 @
, /
, :
, [
, ]
등의 문자가 특별한 의미를 가집니다.
네임스페이스가 포함된 XML 노드 제외하기
credentials
루트 노드에 포함된 s
네임스페이스에서 정의된 login
XML 엘리먼트를 제외하려면, body-xml
속성의 값을 XPath 표현식을 사용하는 배열로 설정하세요. [ "/credentials/s:login" ]
.
XPath 표현식 /credentials/s:login
에서 첫 번째 문자 /
는 XML 문서의 루트를 가리키고, 그 다음에는 XML 엘리먼트의 이름 credentials
가 나옵니다. 마찬가지로, /
문자는 현재 엘리먼트를 나타내고, 새 XML 엘리먼트의 이름 s:login
이 나옵니다. 이름에 :
문자가 들어가는 것을 유의하세요. 이 문자는 네임스페이스와 노드 이름을 구분합니다.
네임스페이스 이름은 XML 문서의 일부인 XML 요청의 바디에 정의되어 있어야 합니다. 네임스페이스는 사양 문서 HAR, OpenAPI 또는 Postman Collection 파일에서 확인할 수 있습니다.
{
"body-xml": [
"/credentials/s:login"
]
}
요청이 콘텐츠 유형 application/xml
을 사용하는 경우 제외 매개변수는 요청할 때 body-xml
을 사용합니다. body-xml
의 각 항목은 XPath v2 표현식이어야 합니다. XPath 표현식에는 @
, /
, :
, [
, ]
등의 문자가 특별한 의미를 가집니다.
JSON 문자열 사용하기
제외 JSON 문서를 제공하려면 변수 DAST_API_EXCLUDE_PARAMETER_ENV
를 JSON 문자열로 설정하세요. 다음 예제에서 .gitlab-ci.yml
에서 DAST_API_EXCLUDE_PARAMETER_ENV
변수는 JSON 문자열로 설정됩니다.
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_PROFILE: Quick
DAST_API_OPENAPI: test-api-specification.json
DAST_API_TARGET_URL: http://test-deployment/
DAST_API_EXCLUDE_PARAMETER_ENV: '{ "headers": [ "Upgrade-Insecure-Requests" ] }'
파일 사용하기
제외 JSON 문서를 제공하려면 변수 DAST_API_EXCLUDE_PARAMETER_FILE
에 JSON 파일 경로를 설정하십시오. 파일 경로는 작업의 현재 작업 디렉터리를 기준으로 상대적입니다. 다음 예제의 .gitlab-ci.yml
내용에서 DAST_API_EXCLUDE_PARAMETER_FILE
변수는 JSON 파일 경로로 설정됩니다.
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_PROFILE: Quick
DAST_API_OPENAPI: test-api-specification.json
DAST_API_TARGET_URL: http://test-deployment/
DAST_API_EXCLUDE_PARAMETER_FILE: dast-api-exclude-parameters.json
dast-api-exclude-parameters.json
은 제외 매개변수 문서의 구조를 따르는 JSON 문서입니다.
URL 제외
경로로 제외하는 대신 URL의 다른 컴포넌트 중 하나를 사용하여 DAST_API_EXCLUDE_URLS
CI/CD 변수를 사용하여 필터링할 수 있습니다. 이 변수는 .gitlab-ci.yml
파일에 설정할 수 있습니다. 이 변수에는 쉼표(,)로 구분된 여러 값을 저장할 수 있습니다. 각 값은 정규 표현식입니다. 각 항목은 정규 표현식이므로 .*
와 같은 항목은 모든 것에 일치하는 정규 표현식이므로 모든 URL이 제외됩니다.
작업 출력에서 DAST_API_EXCLUDE_URLS
에서 제공된 정규 표현식과 일치하는 URL을 확인할 수 있습니다. 일치 작업은 제외된 작업 섹션에 나열됩니다. 제외된 작업에 나열된 작업은 테스트된 작업 섹션에 나열되지 않아야 합니다. 예를 들어 다음 작업 출력의 일부는 다음과 같습니다.
2021-05-27 21:51:08 [INF] DAST API: --[ 테스트된 작업 ]-------------------------
2021-05-27 21:51:08 [INF] DAST API: 201 POST http://target:7777/api/users CREATED
2021-05-27 21:51:08 [INF] DAST API: ------------------------------------------------
2021-05-27 21:51:08 [INF] DAST API: --[ 제외된 작업 ]-----------------------
2021-05-27 21:51:08 [INF] DAST API: GET http://target:7777/api/messages
2021-05-27 21:51:08 [INF] DAST API: POST http://target:7777/api/messages
2021-05-27 21:51:08 [INF] DAST API: ------------------------------------------------
예제
URL 및 하위 리소스 제외
다음 예제는 URL http://target/api/auth
및 해당 하위 리소스를 제외합니다.
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_TARGET_URL: http://target/
DAST_API_OPENAPI: test-api-specification.json
DAST_API_EXCLUDE_URLS: http://target/api/auth
두 개의 URL 제외 및 하위 리소스 허용
URL http://target/api/buy
및 http://target/api/sell
을 제외하지만 하위 리소스를 스캔할 수 있도록 하려면, 예를 들어 http://target/api/buy/toy
또는 http://target/api/sell/chair
과 같은 경우. http://target/api/buy/$,http://target/api/sell/$
값을 사용할 수 있습니다. 이 값은 각각 쉼표(,)로 구분된 두 개의 정규 표현식을 사용하고 있으므로 http://target/api/buy$
및 http://target/api/sell$
을 포함하고 있습니다. 각 정규 표현식에서 후행하는 $
문자는 일치하는 URL이 끝나는 지점을 가리킵니다.
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_TARGET_URL: http://target/
DAST_API_OPENAPI: test-api-specification.json
DAST_API_EXCLUDE_URLS: http://target/api/buy/$,http://target/api/sell/$
두 개의 URL 및 하위 리소스 제외
URL http://target/api/buy
및 http://target/api/sell
및 해당 하위 리소스를 제외하려면 다음과 같이 여러 URL을 제공해야 합니다. 여러 URL을 제공하려면 ,
문자를 사용합니다.
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_TARGET_URL: http://target/
DAST_API_OPENAPI: test-api-specification.json
DAST_API_EXCLUDE_URLS: http://target/api/buy,http://target/api/sell
정규 표현식을 사용하여 URL 제외
정확하게 https://target/api/v1/user/create
및 https://target/api/v2/user/create
또는 다른 버전 (v3
,v4
등)을 제외하려면 https://target/api/v.*/user/create$
를 사용할 수 있습니다. 이전의 정규 표현식에서 .
은 임의의 문자를 나타내고 *
은 0회 이상을 나타내며, 추가로 $
는 URL이 여기에서 끝나야 함을 나타냅니다.
stages:
- dast
include:
- template: DAST-API.gitlab-ci.yml
variables:
DAST_API_TARGET_URL: http://target/
DAST_API_OPENAPI: test-api-specification.json
DAST_API_EXCLUDE_URLS: https://target/api/v.*/user/create$