튜토리얼: 의존성 스캔 설정

Tier: Ultimate Offering: GitLab.com

의존성 스캔은 응용 프로그램을 개발하고 테스트하는 동안 소프트웨어 의존성에서 보안 취약점을 자동으로 찾을 수 있습니다. 예를 들어, 의존성 스캔을 통해 응용 프로그램이 알려진 취약점을 가진 외부 (오픈 소스) 라이브러리를 사용하는지 여부를 알 수 있습니다. 그런 다음 응용 프로그램을 보호하기 위해 조치를 취할 수 있습니다.

이 튜토리얼에서는 샘플 취약한 응용 프로그램을 생성한 다음 다음을 수행합니다. - 응용 프로그램의 의존성에서 취약점을 감지, 분류 및 해결하는 방법. - Merge Request에서 취약점을 감지하는 방법.

의존성 스캔 설정:

시작하기 전에

Gitpod가 활성화되어 있는지 확인하세요. Gitpod는 온디맨드 클라우드 개발 환경입니다. 자세한 내용은 Gitpod를 참조하세요. 그렇지 않으면 자체 개발 환경을 사용할 수 있습니다. 이 경우 Yarn과 Node.js가 설치되어 있어야 합니다.

예제 응용 프로그램 파일 생성

먼저, 새 프로젝트에서 파이프라인을 구성하고 취약점을 검사할 수 있는 의존성을 추가하는 파일을 생성합니다.

  1. 기본값을 사용하여 빈 프로젝트를 생성합니다.

  2. main 브랜치에 다음 파일을 생성합니다.

    파일명: .gitlab-ci.yml

    stages:
    - build
    - test
       
    include:
    - template: Jobs/Dependency-Scanning.gitlab-ci.yml
       
    # 의존성 스캔 작업을 재정의합니다.
    gemnasium-dependency_scanning:
      tags: [ saas-linux-large-amd64 ]
      rules:
        - if: $CI_COMMIT_BRANCH == "main"
        - if: $CI_MERGE_REQUEST_IID
    

    파일명: index.js

    // 프레임워크를 호출하고 인스턴스화합니다.
    const fastify = require('fastify')({ logger: true })
    const path = require('path')
    //const fetch = require('node-fetch')
       
    fastify.register(require('fastify-static'), {
      root: path.join(__dirname, 'public'),
      prefix: '/'
    })
       
    fastify.register(require('./routes'), {
      message: "hello"
    })
       
    // fastify.register(require('fastify-redis'), { url: constants.redisUrl, /* other redis options */ })
       
    // 서버 실행!
    const start = async () => {
      try {
        await fastify.listen(8080, "0.0.0.0")
        fastify.log.info(`server listening on ${fastify.server.address().port}`)
         
      } catch (error) {
        fastify.log.error(error)
        //process.exit(1)
      }
    }
    start()
    

    파일명 package.json

    {
      "dependencies": {
        "fastify": "2.14.1",
        "fastify-static": "2.0.0"
      }
    }
    

    파일명 yarn.lock

    Yarn lockfile 섹션에 표시된 내용을 사용합니다.

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

파이프라인에서 의존성 스캔이 실행되고 취약점이 자동으로 감지됩니다.

취약점 분류

취약점 보고서는 취약점에 대한 중요한 정보를 제공합니다. 일반적으로 기관의 정책에 따라 취약점을 분류합니다. 이 튜토리얼에서는 중간 심각도의 취약점을 무시하고 높은 심각도의 취약점만 확인하는 것으로 가정합니다.

취약점을 분류하려면:

  1. Secure > 취약점 보고서로 이동합니다.
  2. 각 중간 심각도 취약점을 해당 행의 확인란을 선택하여 선택합니다.
  3. 상태 설정 드롭다운 디렉터리에서 기각을 선택합니다. 기각 사유 드롭다운 디렉터리에서 테스트에서 사용됨을 선택하고 “테스트에서 사용됨”이라는 주석을 추가한 다음 상태 변경을 선택합니다.

    중간 심각도의 취약점은 보기에서 필터링되어 높은 심각도의 취약점만 남게 됩니다.

  4. 높음 취약점의 설명을 선택합니다.

    권장 솔루션은 fastify 패키지를 업그레이드하는 것입니다. 일반적으로 이를 더 조사하지만, 이 튜토리얼에서는 취약점이 확인된 것으로 간주할 수 있습니다.

  5. 상태 드롭다운 디렉터리에서 확인을 선택한 다음 상태 변경을 선택합니다.

높은 심각도 취약점 해결

높은 심각도의 취약점만 해결해야 합니다. 분류 단계에서 fastify 패키지를 업그레이드해야 한다는 것을 알고 있습니다.

취약점을 해결하려면:

  1. 왼쪽 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
  2. 오른쪽 상단에서 편집 > Gitpod을 선택하고 새 탭에서 Gitpod를 엽니다.
  3. 지시에 따라 GitLab으로 계속 진행을 선택한 다음 인증을 선택합니다.
  4. 새 워크스페이스 페이지에서 계속을 선택합니다.
  5. 터미널 창에 다음 명령을 입력하여 새 브랜치를 생성합니다.

    git checkout -b update_packages main
    
  6. 터미널 창에 명령을 실행하여 yarn upgrade --latest를 실행합니다. 이 명령은 프로젝트의 의존성과 yarn.lock 파일을 업데이트합니다.
  7. 터미널 창에 명령을 실행하여 변경 사항을 커밋합니다. 이는 CI/CD 파이프라인을 트리거합니다.

    git add package.json yarn.lock
    git commit -m "패키지 버전 업데이트"
    git push --set-upstream origin update_packages
    
  8. GitLab 브라우저 탭으로 전환합니다.
  9. 코드 > Merge Request로 이동한 다음 Merge Request 생성을 선택합니다.
  10. 새 Merge Request 페이지로 스크롤하여 Merge Request 생성을 선택합니다. Merge Request 파이프라인이 완료될 때까지 기다립니다.
  11. 페이지를 새로 고침한 다음 Merge을 선택합니다.
  12. 파이프라인이 성공적으로 완료될 때까지 기다립니다.
  13. Secure > 취약점 보고서로 이동합니다.
  14. 높음 취약점의 설명을 선택합니다.

    배너에서 취약점이 main 브랜치에서 해결되었음을 확인합니다. 일반적으로 yarn.lock 파일에 지정된 fastify 패키지 버전을 확인하여 이를 매뉴얼으로 확인하게 됩니다. 이 튜토리얼에서는 확인 단계를 건너 뛸 수 있습니다.

  15. 상태 드롭다운 디렉터리에서 해결을 선택한 다음 상태 변경을 선택합니다.
  16. Secure > 취약점 보고서로 이동합니다.

    이제 취약점 보고서에는 나열된 취약점이 _없음_을 확인할 수 있어야 합니다.

합병 요청에서 취약점 검색 테스트

이제 취약점을 위험도에 따라 분류하고 해결하는 방법을 알게 되었습니다. 이제 새로운 잠재적인 취약점을 감지하는 방법을 확인해보겠습니다.

새로운 취약점을 추가하려면:

  1. Gitpod 탭으로 전환합니다. 시간 초과된 경우 워크스페이스 열기를 선택합니다.
  2. 터미널 창에서 로컬 main 브랜치를 업데이트 하려면 다음 명령을 실행합니다.

    git checkout main
    git fetch origin
    git rebase origin/main
    
  3. 터미널 창에서 새 브랜치를 생성하려면 다음 명령을 실행합니다.

    git checkout -b add_dependency main
    
  4. 파일 탐색기 사이드바에서 package.json 파일을 선택합니다.
  5. package.json 파일의 dependencies 섹션에 다음 줄을 추가합니다.

    "axios": "0.21.0",
    
  6. package.json 파일에 추가한 의존성을 설치하려면 터미널 창에서 다음 명령을 실행합니다.

    yarn install
    
  7. 변경 사항을 커밋하여 CI/CD 파이프라인을 트리거하려면 터미널 창에서 다음 명령을 실행합니다.

    git add package.json yarn.lock
    git commit -m "Add dependency"
    git push --set-upstream origin add_dependency
    
  8. GitLab 브라우저 탭으로 전환합니다.
  9. 코드 > 합병 요청로 이동하여 합병 요청 생성을 선택합니다.
  10. 새 합병 요청 페이지로 이동하여 페이지 하단의 합병 요청 생성을 선택합니다.

합병 요청 파이프라인이 완료될 때까지 기다린 후 페이지를 새로고침합니다. 합병 요청 보안 위젯에서 새로운 잠재적인 취약점에 대해 경고합니다. 이러한 취약점은 add_dependency 브랜치에만 존재하며 main 브랜치에는 없습니다.

이제 다음을 알게 되었습니다:

  • 애플리케이션 의존성에서 취약점을 감지하는 방법
  • 취약점을 위험도에 따라 분류하고 해결하는 방법
  • 합병 요청에서 새 취약점을 감지하는 방법

Yarn lock 파일 내용

# 이 파일은 자동으로 생성된 파일입니다. 직접 편집하지 마십시오.
# yarn lockfile v1

abstract-logging@^2.0.0:
  version "2.0.1"
  resolved "https://registry.yarnpkg.com/abstract-logging/-/abstract-logging-2.0.1.tgz#6b0c371df212db7129b57d2e7fcf282b8bf1c839"
  integrity sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==

ajv@^6.12.6:
  version "6.12.6"
  resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
  integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
  dependencies:
    fast-deep-equal "^3.1.1"
    fast-json-stable-stringify "^2.0.0"
    json-schema-traverse "^0.4.1"
    uri-js "^4.2.2"
...

(중략)