InfoGrab DocsInfoGrab Docs

튜토리얼: 웹 애플리케이션 스캔을 위한 DAST 설정

요약

동적 애플리케이션 보안 테스트(DAST)를 CI/CD 파이프라인에 통합하는 방법을 알아봅니다. 정적 분석은 소스 코드에서 취약점을 찾습니다. 이 튜토리얼에서는 다음 내용을 다룹니다. 이 튜토리얼의 Tanuki Shop 애플리케이션은 인증이 필요하지 않습니다.

동적 애플리케이션 보안 테스트(DAST)를 CI/CD 파이프라인에 통합하는 방법을 알아봅니다.

정적 분석은 소스 코드에서 취약점을 찾습니다. DAST는 애플리케이션이 실제 환경에서 실행되며 서비스 및 사용자 워크플로와 상호 작용할 때만 드러나는 런타임 보안 문제를 찾아냅니다. GitLab에 통합된 DAST 솔루션을 사용하면 테스트 환경에 코드를 배포할 때마다 이러한 문제를 자동으로 점검하도록 GitLab DAST를 설정할 수 있습니다.

이 튜토리얼에서는 다음 내용을 다룹니다.

  1. Tanuki Shop 애플리케이션 설정
  2. 빌드 job 정의
  3. DAST job 정의
  4. 패시브 스캔 및 액티브 스캔 구성
  5. 설정 확인
Note

이 튜토리얼의 Tanuki Shop 애플리케이션은 인증이 필요하지 않습니다. 애플리케이션에 로그인이 필요하다면 DAST 인증을 참고합니다.

시작하기 전에#

  • GitLab Ultimate 구독.
  • 프로젝트의 Maintainer 권한.

Tanuki Shop 애플리케이션 설정#

먼저 Tanuki Shop을 포크합니다.

  1. Tanuki Shop 리포지터리로 이동합니다.

  2. 오른쪽 상단에서 Fork를 선택합니다.

  3. 네임스페이스(개인 또는 그룹)를 선택한 다음 Fork project를 선택합니다.

    포크한 리포지터리에는 애플리케이션 코드와 초기 CI/CD 구성 등 이 튜토리얼에 필요한 모든 파일이 들어 있습니다. 이 구성을 다음 단계에서 수정합니다.

  4. Settings > General로 이동합니다.

  5. Visibility, project features, permissions를 확장합니다.

  6. Container registry 토글이 켜져 있는지 확인합니다.

  7. 컨테이너 레지스트리가 동작하는지 확인합니다.

    1. Deploy > Container registry로 이동합니다.
    2. 비어 있는 레지스트리가 보여야 합니다. 오류가 표시되면 프로젝트 권한을 확인합니다.

    [!note] 컨테이너 레지스트리는 파이프라인에서 빌드한 Docker 이미지를 저장합니다. 이 단계가 실패하면 이후 빌드 job도 실패합니다.

빌드 job 정의#

이제 애플리케이션이 포함된 Docker 이미지를 만들어 컨테이너 레지스트리에 푸시하도록 빌드 job을 구성합니다.

  1. 프로젝트에서 .gitlab-ci.yml 파일을 편집합니다.

  2. 기존 내용을 다음 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에 머지하기 전 기능 브랜치에 적합합니다
Note

프로덕션 서버를 대상으로 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가 실행 중인 애플리케이션에서 취약점을 제대로 찾아내는지 확인합니다.

  1. 파이프라인 편집기에서 Commit changes를 선택하고 gitlab 브랜치에 커밋합니다.

    파이프라인이 곧바로 시작됩니다.

  2. Build > Pipelines로 이동해 최신 파이프라인이 성공적으로 완료되었는지 확인합니다.

    예상 소요 시간:

    • Build stage: 2~3분(Docker 이미지 빌드)
    • DAST stage: 2~5분(패시브 스캔)
  3. 파이프라인이 성공적으로 완료되면 Secure > Vulnerability report로 이동합니다.

  4. 취약점을 검토합니다. 각 취약점을 어떻게 처리할지에 대한 안내는 취약점 해결 방법을 참고합니다.

Note

Tanuki Shop 애플리케이션은 시연을 위해 의도적으로 취약하게 만들어졌습니다. 보안 정책, 개인 식별 정보(PII) 노출, 그 밖의 일반적인 웹 취약점과 관련된 결과가 표시됩니다.

다음 단계#

이 튜토리얼을 마친 뒤에는 다음을 수행할 수 있습니다.

문제 해결#

빌드 job이 인증 오류로 실패하는 경우#

컨테이너 레지스트리 자격 증명을 사용할 수 없을 때 인증 오류가 발생합니다.

이 문제를 해결하려면 다음 단계를 따릅니다.

  1. 컨테이너 레지스트리가 활성화되어 있는지 확인합니다.

    1. Settings > General로 이동합니다.
    2. Visibility, project features, permissions를 확장합니다.
    3. Container registry 토글이 켜져 있는지 확인합니다.
  2. 프로젝트에 유효한 CI/CD 토큰이 있는지 확인합니다. GitLab은 $CI_REGISTRY_USER와 $CI_REGISTRY_PASSWORD를 자동으로 제공합니다.

DAST job은 완료되었지만 취약점이 발견되지 않는 경우#

이 문제는 DAST가 애플리케이션에 접근하지 못했거나 애플리케이션에 취약점이 없을 때 발생합니다.

이 문제를 해결하려면 다음 단계를 따릅니다.

  1. 애플리케이션이 실행 중인지 확인합니다.

    curl "http://yourapp:3000"
    
  2. DAST job 로그에서 연결 관련 오류를 확인합니다.

  3. DAST_TARGET_URL 변수가 올바르게 설정되었는지 확인합니다(http://yourapp:3000 이어야 합니다).

  4. Tanuki Shop 애플리케이션에는 취약점이 있어야 합니다. 아무것도 발견되지 않으면 올바른 포크 리포지터리를 사용 중인지 확인합니다.

관련 주제#

튜토리얼: 웹 애플리케이션 스캔을 위한 DAST 설정

GitLab v19.4
원문 보기

요약

동적 애플리케이션 보안 테스트(DAST)를 CI/CD 파이프라인에 통합하는 방법을 알아봅니다. 정적 분석은 소스 코드에서 취약점을 찾습니다. 이 튜토리얼에서는 다음 내용을 다룹니다. 이 튜토리얼의 Tanuki Shop 애플리케이션은 인증이 필요하지 않습니다.

동적 애플리케이션 보안 테스트(DAST)를 CI/CD 파이프라인에 통합하는 방법을 알아봅니다.

정적 분석은 소스 코드에서 취약점을 찾습니다. DAST는 애플리케이션이 실제 환경에서 실행되며 서비스 및 사용자 워크플로와 상호 작용할 때만 드러나는 런타임 보안 문제를 찾아냅니다. GitLab에 통합된 DAST 솔루션을 사용하면 테스트 환경에 코드를 배포할 때마다 이러한 문제를 자동으로 점검하도록 GitLab DAST를 설정할 수 있습니다.

이 튜토리얼에서는 다음 내용을 다룹니다.

  1. Tanuki Shop 애플리케이션 설정
  2. 빌드 job 정의
  3. DAST job 정의
  4. 패시브 스캔 및 액티브 스캔 구성
  5. 설정 확인
Note

이 튜토리얼의 Tanuki Shop 애플리케이션은 인증이 필요하지 않습니다. 애플리케이션에 로그인이 필요하다면 DAST 인증을 참고합니다.

시작하기 전에#

  • GitLab Ultimate 구독.
  • 프로젝트의 Maintainer 권한.

Tanuki Shop 애플리케이션 설정#

먼저 Tanuki Shop을 포크합니다.

  1. Tanuki Shop 리포지터리로 이동합니다.

  2. 오른쪽 상단에서 Fork를 선택합니다.

  3. 네임스페이스(개인 또는 그룹)를 선택한 다음 Fork project를 선택합니다.

    포크한 리포지터리에는 애플리케이션 코드와 초기 CI/CD 구성 등 이 튜토리얼에 필요한 모든 파일이 들어 있습니다. 이 구성을 다음 단계에서 수정합니다.

  4. Settings > General로 이동합니다.

  5. Visibility, project features, permissions를 확장합니다.

  6. Container registry 토글이 켜져 있는지 확인합니다.

  7. 컨테이너 레지스트리가 동작하는지 확인합니다.

    1. Deploy > Container registry로 이동합니다.
    2. 비어 있는 레지스트리가 보여야 합니다. 오류가 표시되면 프로젝트 권한을 확인합니다.

    [!note] 컨테이너 레지스트리는 파이프라인에서 빌드한 Docker 이미지를 저장합니다. 이 단계가 실패하면 이후 빌드 job도 실패합니다.

빌드 job 정의#

이제 애플리케이션이 포함된 Docker 이미지를 만들어 컨테이너 레지스트리에 푸시하도록 빌드 job을 구성합니다.

  1. 프로젝트에서 .gitlab-ci.yml 파일을 편집합니다.

  2. 기존 내용을 다음 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에 머지하기 전 기능 브랜치에 적합합니다
Note

프로덕션 서버를 대상으로 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가 실행 중인 애플리케이션에서 취약점을 제대로 찾아내는지 확인합니다.

  1. 파이프라인 편집기에서 Commit changes를 선택하고 gitlab 브랜치에 커밋합니다.

    파이프라인이 곧바로 시작됩니다.

  2. Build > Pipelines로 이동해 최신 파이프라인이 성공적으로 완료되었는지 확인합니다.

    예상 소요 시간:

    • Build stage: 2~3분(Docker 이미지 빌드)
    • DAST stage: 2~5분(패시브 스캔)
  3. 파이프라인이 성공적으로 완료되면 Secure > Vulnerability report로 이동합니다.

  4. 취약점을 검토합니다. 각 취약점을 어떻게 처리할지에 대한 안내는 취약점 해결 방법을 참고합니다.

Note

Tanuki Shop 애플리케이션은 시연을 위해 의도적으로 취약하게 만들어졌습니다. 보안 정책, 개인 식별 정보(PII) 노출, 그 밖의 일반적인 웹 취약점과 관련된 결과가 표시됩니다.

다음 단계#

이 튜토리얼을 마친 뒤에는 다음을 수행할 수 있습니다.

문제 해결#

빌드 job이 인증 오류로 실패하는 경우#

컨테이너 레지스트리 자격 증명을 사용할 수 없을 때 인증 오류가 발생합니다.

이 문제를 해결하려면 다음 단계를 따릅니다.

  1. 컨테이너 레지스트리가 활성화되어 있는지 확인합니다.

    1. Settings > General로 이동합니다.
    2. Visibility, project features, permissions를 확장합니다.
    3. Container registry 토글이 켜져 있는지 확인합니다.
  2. 프로젝트에 유효한 CI/CD 토큰이 있는지 확인합니다. GitLab은 $CI_REGISTRY_USER와 $CI_REGISTRY_PASSWORD를 자동으로 제공합니다.

DAST job은 완료되었지만 취약점이 발견되지 않는 경우#

이 문제는 DAST가 애플리케이션에 접근하지 못했거나 애플리케이션에 취약점이 없을 때 발생합니다.

이 문제를 해결하려면 다음 단계를 따릅니다.

  1. 애플리케이션이 실행 중인지 확인합니다.

    curl "http://yourapp:3000"
    
  2. DAST job 로그에서 연결 관련 오류를 확인합니다.

  3. DAST_TARGET_URL 변수가 올바르게 설정되었는지 확인합니다(http://yourapp:3000 이어야 합니다).

  4. Tanuki Shop 애플리케이션에는 취약점이 있어야 합니다. 아무것도 발견되지 않으면 올바른 포크 리포지터리를 사용 중인지 확인합니다.

관련 주제#