튜토리얼: 웹 애플리케이션 스캔을 위한 DAST 설정
GitLab v19.4요약
동적 애플리케이션 보안 테스트(DAST)를 CI/CD 파이프라인에 통합하는 방법을 알아봅니다. 정적 분석은 소스 코드에서 취약점을 찾습니다. 이 튜토리얼에서는 다음 내용을 다룹니다. 이 튜토리얼의 Tanuki Shop 애플리케이션은 인증이 필요하지 않습니다.
동적 애플리케이션 보안 테스트(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로 이동합니다.
- 비어 있는 레지스트리가 보여야 합니다. 오류가 표시되면 프로젝트 권한을 확인합니다.
[!note] 컨테이너 레지스트리는 파이프라인에서 빌드한 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과 함께 실행합니다.
dast job은 http://yourapp:3000 URL로 애플리케이션에 접근합니다.
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는 버튼 선택이나 폼 제출처럼 사용자가 할 수 있는 모든 동작을 수행할 뿐 아니라 버그를 유발해 프로덕션 데이터가 변경되거나 손실될 수도 있습니다. 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로 이동해 최신 파이프라인이 성공적으로 완료되었는지 확인합니다.
예상 소요 시간:
- Build 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 애플리케이션에는 취약점이 있어야 합니다. 아무것도 발견되지 않으면 올바른 포크 리포지터리를 사용 중인지 확인합니다.