요구 사항
- 지원되는 API 유형 중 하나를 사용하는 웹 API:
- REST API
- SOAP
- GraphQL
- 폼 본문, JSON 또는 XML
- 다음 중 하나의 API 사양:
-
GitLab Runner 사용 가능, Linux/amd64에서
docker
executor 사용 - 대상 애플리케이션이 배포되어 있어야 함. 자세한 내용은 배포 옵션을 참조할 것
-
CI/CD 파이프라인 정의에
fuzz
단계 추가. 예를 들어, 배포 단계 다음에 추가되어야 함:stages: - build - test - deploy - fuzz
권장 사항
- 분석기의 최신 버전을 실행하기 위해 러너를 항상 풀 정책으로 구성할 것
-
기본적으로 API Fuzzing은 파이프라인에서 이전 작업에서 정의된 모든 artifact를 다운로드함. 만약 API Fuzzing 작업이
environment_url.txt
를 사용하여 테스트 중인 URL 또는 이전 작업에서 생성된 다른 파일에 의존하지 않는다면 artifact를 다운로드하지 않는 것이 좋음. artifact를 다운로드하지 않으려면 분석기 CI/CD 작업을 확장하여 종속성을 지정할 것. 예를 들어 DAST 프록시 기반 분석기의 경우 다음을.gitlab-ci.yml
파일에 추가할 것:apifuzzer_fuzz: dependencies: []
애플리케이션 배포 옵션
API Fuzzing은 스캔할 수 있는 배포된 애플리케이션이 필요함.
대상 애플리케이션의 복잡성에 따라 API Fuzzing 템플릿을 배포하고 구성하는 몇 가지 옵션이 있음.
리뷰 앱
리뷰 앱은 API Fuzzing 대상 애플리케이션을 배포하는 가장 복잡한 방법임. 이 프로세스를 지원하기 위해 Google Kubernetes Engine (GKE)를 사용하여 리뷰 앱 배포를 생성함. 이 예제는 리뷰 앱 - GKE 프로젝트에서 찾을 수 있으며, DAST를 위한 리뷰 앱 구성에 대한 자세한 지침이 README.md에 나와 있음.
Docker 서비스
애플리케이션이 Docker 컨테이너를 사용하는 경우 API Fuzzing으로 배포하고 스캔하는 또 다른 옵션이 있음. Docker 빌드 작업이 완료되고 이미지가 컨테이너 레지스트리에 추가된 후, 이미지를 서비스로 사용할 수 있음.
.gitlab-ci.yml
에 서비스 정의를 추가하여 DAST 분석기를 사용하여 서비스를 스캔할 수 있음.
작업에 services
섹션을 추가할 때 alias
에서 배포된 애플리케이션의 URL을 사용하도록 정의함. 다음 예제에서 dast
작업 정의의 alias: yourapp
부분은 배포된 애플리케이션의 URL을 호스트 이름으로 정의함(https://yourapp/
).
stages:
- build
- fuzz
include:
- template: API-Fuzzing.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
apifuzzer_fuzz:
services: # 서비스를 사용하여 앱 컨테이너를 DAST 작업에 링크
- name: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
alias: yourapp
variables:
FUZZAPI_TARGET_URL: https://yourapp
대부분의 애플리케이션은 데이터베이스나 캐싱 서비스와 같은 여러 서비스에 의존함. 서비스 필드에 정의된 서비스는 기본적으로 서로 통신할 수 없음. 서비스 간 통신을 허용하려면 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