튜토리얼: 웹 애플리케이션 스캔을 위한 DAST 설정
GitLab v19.1Dynamic Application Security Testing(DAST)을 CI/CD 파이프라인에 통합하는 방법을 알아봅니다. 정적 분석은 소스 코드에서 취약점을 찾습니다. Tanuki Shop 애플리케이션 설정 이 튜토리얼의 Tanuki Shop 애플리케이션은 인증이 필요하지 않습니다.
Dynamic Application Security Testing(DAST)을 CI/CD 파이프라인에 통합하는 방법을 알아봅니다.
정적 분석은 소스 코드에서 취약점을 찾습니다. DAST는 애플리케이션이 실제 환경에서 실행되고 서비스 및 사용자 워크플로와 상호작용할 때만 나타나는 런타임 보안 이슈를 식별합니다. GitLab에 통합된 DAST 솔루션을 사용하면, 코드를 테스트 환경에 배포할 때마다 GitLab DAST가 이러한 이슈를 자동으로 검사하도록 설정할 수 있습니다.
이 튜토리얼에서 배울 내용:
이 튜토리얼의 Tanuki Shop 애플리케이션은 인증이 필요하지 않습니다. 애플리케이션에 로그인이 필요한 경우, DAST 인증을 참조하세요.
시작하기 전에#
-
GitLab Ultimate 구독.
-
프로젝트에 대한 Maintainer 권한.
Tanuki Shop 애플리케이션 설정#
먼저 Tanuki Shop을 포크합니다.
Tanuki Shop 리포지터리로 이동합니다.
오른쪽 상단 모서리에서 Fork를 선택합니다.
네임스페이스(개인 또는 그룹)를 선택하고 Fork project를 선택합니다.
포크된 리포지터리에는 애플리케이션 코드와 초기 CI/CD 구성을 포함하여 이 튜토리얼에 필요한 모든 파일이 포함되어 있습니다. 다음 단계에서 구성을 수정합니다.
Settings > General로 이동합니다.
Visibility, project features, permissions를 펼칩니다.
Container registry 토글이 켜져 있는지 확인합니다.
컨테이너 레지스트리가 작동하는지 확인합니다:
Deploy > Container registry로 이동합니다.
- 빈 레지스트리가 표시되어야 합니다. 오류가 표시되면 프로젝트 권한을 확인하세요.
컨테이너 레지스트리는 파이프라인에서 빌드된 Docker 이미지를 저장합니다. 이 단계가 실패하면 빌드 job이 나중에 실패합니다.
빌드 job 정의#
이제 애플리케이션이 포함된 Docker 이미지를 생성하고 컨테이너 레지스트리에 푸시하는 빌드 job을 구성합니다.
프로젝트에서 .gitlab-ci.yml 파일을 편집합니다.
기존 내용을 다음 CI/CD 구성으로 교체합니다:
stages:
- build
- dast
include:
- template: Security/DAST.gitlab-ci.yml
# Build: Create the Docker image and push to the container registry
build:
services:
- name: docker:dind
alias: dind
image: docker:20.10.16
stage: build
script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- docker pull $CI_REGISTRY_IMAGE:latest || true
- docker build --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:latest .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- docker push $CI_REGISTRY_IMAGE:latest
DAST job 정의#
빌드 job 구성이 완료되었으므로 이제 DAST job을 구성합니다.
이 구성은 services 기능을 사용하여 DAST job과 병렬로 애플리케이션 컨테이너를 실행합니다.
애플리케이션은 URL http://yourapp:3000에서 dast job이 접근할 수 있습니다.
DAST job을 구성하려면:
.gitlab-ci.yml 파일 하단에 다음을 추가합니다:
# DAST: Scan the application running in a Docker container
dast:
services:
- name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
alias: yourapp
variables:
DAST_TARGET_URL: http://yourapp:3000
패시브 스캔 및 액티브 스캔 구성#
DAST는 보안 커버리지와 스캔 시간의 균형을 맞추는 두 가지 스캔 모드를 지원합니다. 패시브 스캔은 빠른 피드백을 제공합니다. 액티브 스캔은 조작된 요청으로 애플리케이션을 테스트할 때만 나타나는 취약점을 발견하며, 코드가 프로덕션에 도달하기 전에 더 철저한 보안 검증을 제공합니다.
패시브 스캔(기본값, 약 2-5분):
-
잠재적으로 유해한 요청을 보내지 않고 애플리케이션 응답을 분석합니다.
-
HTTP 헤더, 쿠키, 응답 콘텐츠, SSL/TLS 구성을 검사합니다.
-
어떤 환경에서도 안전하게 실행할 수 있습니다.
-
CI/CD 파이프라인에서 빠른 피드백을 얻기에 적합합니다.
액티브 스캔(애플리케이션 크기에 따라 약 10-30분):
-
취약점을 트리거하도록 설계된 조작된 요청을 전송합니다.
-
인젝션 결함, 인증 이슈, 비즈니스 로직 취약점을 테스트합니다.
-
더 철저하지만 느립니다.
-
main으로 머지하기 전 기능 브랜치에 가장 적합합니다.
프로덕션 서버에 대해 DAST 스캔을 실행하지 마세요. 버튼 선택이나 양식 제출과 같이 사용자가 할 수 있는 모든 기능을 수행할 수 있을 뿐만 아니라, 버그를 트리거하여 프로덕션 데이터가 수정되거나 손실될 수 있습니다. DAST 스캔은 테스트 서버에서만 실행하세요.
패시브 스캔 및 액티브 스캔을 구성하려면:
.gitlab-ci.yml 파일 하단에 다음을 추가합니다:
rules:
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
variables:
DAST_FULL_SCAN: "false" # Passive scan only for main branch (~2-5 mins)
- if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH
variables:
DAST_FULL_SCAN: "true" # Active scan for feature branches (~10-30 mins)
설정 확인#
DAST가 실행 중인 애플리케이션에서 취약점을 성공적으로 발견할 수 있는지 확인합니다.
파이프라인 편집기에서 Commit changes를 선택하고 gitlab 브랜치에 커밋합니다.
파이프라인이 즉시 시작됩니다.
Build > Pipelines로 이동하여 최신 파이프라인이 성공적으로 완료되었는지 확인합니다.
예상 소요 시간:
빌드 Stage: 2-3분(Docker 이미지 빌드)
-
DAST Stage: 2-5분(패시브 스캔)
파이프라인이 성공적으로 완료된 후 Secure > Vulnerability report로 이동합니다.
취약점을 검토합니다. 각 취약점을 처리하는 방법에 대한 도움말은 취약점 수정 방법을 참조하세요.
Tanuki Shop 애플리케이션은 데모 목적으로 의도적으로 취약하게 만들어져 있습니다. 보안 정책, 개인 식별 정보(PII) 노출, 기타 일반적인 웹 취약점과 관련된 결과를 확인할 수 있습니다.
다음 단계#
이 튜토리얼을 완료한 후 다음을 수행할 수 있습니다:
-
특정 요구사항에 맞게 고급 DAST 설정을 구성합니다.
-
임시 테스트를 위해 온디맨드 DAST 스캔을 설정합니다.
-
DAST를 취약점 관리 워크플로와 통합합니다.
-
더 많은 예제를 보려면 DAST 데모 리포지터리를 탐색합니다.
문제 해결#
빌드 job이 인증 오류로 실패하는 경우#
인증 오류는 컨테이너 레지스트리 자격 증명을 사용할 수 없을 때 발생합니다.
문제를 해결하려면:
컨테이너 레지스트리가 활성화되어 있는지 확인합니다:
Settings > General로 이동합니다.
-
Visibility, project features, permissions를 펼칩니다.
-
Container registry 토글이 켜져 있는지 확인합니다.
프로젝트에 유효한 CI/CD 토큰이 있는지 확인합니다. GitLab은 자동으로 $CI_REGISTRY_USER와 $CI_REGISTRY_PASSWORD를 제공합니다.
DAST job은 완료되었지만 취약점이 발견되지 않는 경우#
이 이슈는 DAST가 애플리케이션에 접근할 수 없거나 애플리케이션이 취약하지 않을 때 발생합니다.
이 이슈를 해결하려면:
애플리케이션이 실행 중인지 확인합니다:
curl "http://yourapp:3000"
연결과 관련된 오류에 대해 DAST job 로그를 확인합니다.
DAST_TARGET_URL 변수가 올바르게 설정되어 있는지 확인합니다(http://yourapp:3000이어야 합니다).
Tanuki Shop 애플리케이션에는 취약점이 있어야 합니다. 취약점이 발견되지 않으면 올바른 포크된 리포지터리를 사용하고 있는지 확인하세요.