동적 애플리케이션 보안 테스트 (DAST)
GitLab 17.0에서 DAST 버전 5로 대체되었습니다. 이 변경은 중대한 변경 사항입니다.
프록시 기반 분석기에서 DAST 버전 5로의 마이그레이션 방법에 대한 지침은
프록시 기반 마이그레이션 가이드를 참조하세요.
DAST 버전 4 브라우저 기반 분석기에서 DAST 버전 5로의 마이그레이션 방법에 대한 지침은
브라우저 기반 마이그레이션 가이드를 참조하세요.
동적 애플리케이션 보안 테스트(DAST)는 웹 애플리케이션과 API에서
취약점을 찾아내기 위해 자동화된 침투 테스트를 실행합니다.
DAST는 해커의 접근 방식을 자동화하고 크로스 사이트 스크립팅(XSS),
SQL 인젝션(SQLi), 크로스 사이트 요청 위조(CSRF)와 같은
중대한 위협에 대한 실제 공격을 시뮬레이션하여 다른 보안 도구가
탐지할 수 없는 취약점과 잘못된 구성 사항을 드러냅니다.
DAST는 완전히 언어에 구애받지 않으며, 애플리케이션을 외부에서
내부로 검사합니다. 테스트 환경에서 실행 중인 애플리케이션과
함께, DAST 스캔은 CI/CD 파이프라인에서 자동화되거나,
일정에 따라 자동화되거나, 온디맨드 스캔을 사용하여 독립적으로 실행될 수 있습니다.
소프트웨어 개발 생명주기 동안 DAST를 사용하면 팀이 애플리케이션이
프로덕션에 배포되기 전에 취약점을 발견할 수 있습니다.
DAST는 소프트웨어 보안의 기초 구성 요소이며 SAST, 종속성 및 라이선스 스캐닝,
비밀 감지와 함께 사용하여 애플리케이션의 포괄적인 보안 평가를 제공해야 합니다.
GitLab의 브라우저 기반 DAST와 DAST API는 현대 웹 애플리케이션 및 API를 위한
폭넓은 보안 범위를 제공하는 독점 런타임 도구입니다.
개요를 보려면 동적 애플리케이션 보안 테스트(DAST)를 참조하세요.
GitLab DAST
GitLab은 테스트 중인 애플리케이션의 종류에 따라 유용할 수 있는
다음 DAST 분석기를 제공합니다.
웹사이트 스캔을 위해 다음 중 하나를 사용하세요:
- 전통적인 애플리케이션에서 간단한 HTML을 제공하는
DAST 프록시 기반 분석기
프록시 기반 분석기는 자동으로 실행되거나 온디맨드로 실행될 수 있습니다. - JavaScript를 많이 사용하는 애플리케이션을 스캔하기 위한
DAST 브라우저 기반 분석기. 이는 단일 페이지 웹 애플리케이션을 포함합니다.
API 스캔을 위해 사용하세요:
- 웹 API를 스캔하기 위한
API 보안 테스트 분석기.
GraphQL, REST 및 SOAP와 같은 웹 API 기술이 지원됩니다.
분석기는 애플리케이션 보안 확보에서 설명한
아키텍처 패턴을 따릅니다. 각 분석기는 CI 템플릿을 사용하여
파이프라인에서 구성할 수 있으며 Docker 컨테이너 내에서 스캔을 실행합니다.
스캔 결과는
DAST 보고서 아티팩트로 출력되며,
GitLab은 소스와 대상 브랜치의
스캔 결과 차이를 기반으로 발견된 취약점을 결정합니다.
시작하기
전제 조건
- arm64 아키텍처에 대한 지원이 GitLab 17.0에서 도입 되었습니다.
-
GitLab Runner가 사용 가능하며,
Linux/amd64 또는 Linux/arm64에서docker
executor가 필요합니다. -
대상 애플리케이션이 배포되어 있어야 합니다. 자세한 내용은 배포 옵션을 참조하세요.
-
CI/CD 파이프라인 정의에
dast
단계가 추가되어야 합니다. 이는 다음과 같은 배포 단계 후에 추가되어야 합니다:stages: - build - test - deploy - dast
권장사항
-
각 실행마다 동일한 웹 서버에 배포하도록 파이프라인이 구성되어 있는지 주의하세요. 서버가 업데이트되는 동안 DAST 스캔을 실행하면 부정확하고 비결정론적인 결과가 발생할 수 있습니다.
-
최신 버전의 분석기를 실행하기 위해 러너가 항상 가져오기 정책을 사용하도록 구성하세요.
-
기본적으로 DAST는 파이프라인의 이전 작업에서 정의된 모든 아티팩트를 다운로드합니다.
DAST 작업이 테스트할 URL을 정의하기 위해
environment_url.txt
에 의존하거나 이전 작업에서 생성된 다른 파일에 의존하지 않는 경우, 아티팩트를 다운로드하지 않는 것을 권장합니다.아티팩트를 다운로드하지 않으려면 분석기 CI/CD 작업을 확장하여 의존성이 없음을 지정하세요. 예를 들어, DAST 프록시 기반 분석기에서 다음 내용을
.gitlab-ci.yml
파일에 추가하세요:dast: dependencies: []
분석기 구성
분석기별 구성 지침은 DAST 프록시 기반 분석기, DAST 브라우저 기반 분석기 또는 API 보안 테스트 분석기를 참조하세요.
스캔 결과 보기
감지된 취약점은 병합 요청, 파이프라인 보안 탭 및 취약점 보고서에 나타납니다.
-
감지된 모든 취약점을 보려면:
-
프로젝트에서 보안 및 컴플라이언스를 선택한 다음 취약점 보고서를 선택합니다.
-
파이프라인에서 보안 탭을 선택합니다.
-
병합 요청에서 보안 스캔 위젯으로 이동한 후 전체 보고서 탭을 선택합니다.
-
-
DAST 취약점 설명을 선택하세요. 다음 필드는 DAST 분석기가 조사 및 수정의 근본 원인을 지원하기 위해 생성할 수 있는 예시입니다. 각 분석기는 서로 다른 필드를 출력할 수 있습니다.
필드 설명 설명 취약점에 대한 설명. 증거 취약점을 확인한 데이터의 증거. 요청 또는 응답의 일부를 포함하는 경우가 많으며, 이를 사용하여 발견된 내용이 취약점임을 확인하는 데 도움이 될 수 있습니다. 식별자 취약점의 식별자. 링크 감지된 취약점에 대한 추가 세부정보 링크. 방법 취약점을 감지하는 데 사용된 HTTP 방법. 프로젝트 취약점이 감지된 네임스페이스 및 프로젝트. 요청 헤더 요청의 헤더. 응답 헤더 애플리케이션으로부터 받은 응답의 헤더. 응답 상태 애플리케이션으로부터 받은 응답 상태. 스캐너 유형 취약점 보고서의 유형. 심각도 취약점의 심각도. 솔루션 취약점에 대한 권장 솔루션의 세부정보. URL 취약점이 감지된 URL.
참고: 파이프라인은 SAST 및 DAST 스캔을 포함한 여러 작업으로 구성될 수 있습니다. 어떤 작업이든 이유를 불문하고 완료되지 않으면 보안 대시보드에서 DAST 스캐너 출력을 표시하지 않습니다. 예를 들어, DAST 작업이 완료되었지만 SAST 작업이 실패한 경우 보안 대시보드에서 DAST 결과를 표시하지 않습니다. 실패 시 분석기는 종료 코드를 출력합니다.
스캔된 URL 목록
DAST 스캔이 완료되면 병합 요청 페이지에 스캔된 URL의 수가 나타납니다.
스캔된 URL 목록을 포함하는 웹 콘솔 출력을 보려면 세부 정보 보기를 선택하세요.
애플리케이션 배포 옵션
DAST는 스캔할 수 있는 배포된 애플리케이션이 필요합니다.
대상 애플리케이션의 복잡성에 따라 DAST 템플릿을 배포하고 구성하는 방법에는 몇 가지 옵션이 있습니다. 구성된 예제 애플리케이션 세트는 DAST 시연 프로젝트와 함께 제공됩니다.
리뷰 앱
리뷰 앱은 DAST 대상 애플리케이션을 배포하는 가장 복잡한 방법입니다. 이 과정에서 도움을 드리기 위해 Google Kubernetes Engine (GKE)을 사용하여 리뷰 앱 배포를 만들었습니다. 이 예제는 리뷰 앱 - GKE 프로젝트에서 확인할 수 있으며, DAST용 리뷰 앱을 구성하는 방법에 대한 자세한 지침은 README.md에서 확인할 수 있습니다.
Docker 서비스
애플리케이션에서 Docker 컨테이너를 사용하는 경우 DAST로 배포하고 스캔할 수 있는 또 다른 옵션이 있습니다.
Docker 빌드 작업이 완료되고 이미지가 컨테이너 레지스트리에 추가되면, 이미지를 서비스로 사용할 수 있습니다.
.gitlab-ci.yml
에서 서비스 정의를 사용하여 DAST 분석기로 서비스를 스캔할 수 있습니다.
작업에 services
섹션을 추가할 때 alias
는 서비스에 액세스하는 데 사용할 수 있는 호스트 이름을 정의하는 데 사용됩니다. 다음 예에서 dast
작업 정의의 alias: yourapp
부분은 배포된 애플리케이션의 URL이 yourapp
을 호스트 이름으로 사용함을 의미합니다 (https://yourapp/
).
stages:
- build
- dast
include:
- template: DAST.gitlab-ci.yml
# GitLab 컨테이너 레지스트리에 컨테이너 배포
deploy:
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:
services: # DAST 작업에 애플리케이션 컨테이너를 연결하기 위해 서비스 사용
- name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
alias: yourapp
variables:
DAST_WEBSITE: https://yourapp
DAST_FULL_SCAN_ENABLED: "true" # 전체 스캔 수행
DAST_BROWSER_SCAN: "true" # 브라우저 기반 GitLab DAST 크롤러 사용
대부분의 애플리케이션은 데이터베이스나 캐싱 서비스와 같은 여러 서비스에 의존합니다. 기본적으로 서비스 필드에 정의된 서비스는 서로 통신할 수 없습니다. 서비스 간 통신을 허용하려면 FF_NETWORK_PER_BUILD
기능 플래그를 활성화하세요.
variables:
FF_NETWORK_PER_BUILD: "true" # 모든 서비스가 동일한 네트워크에서 통신할 수 있도록 빌드당 네트워크 활성화
services: # DAST 작업에 컨테이너를 연결하기 위해 서비스 사용
- name: mongo:latest
alias: mongo
- name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
alias: yourapp