튜토리얼: 의존성 스캔 설정
의존성 스캔은 응용 프로그램을 개발하고 테스트하는 동안 소프트웨어 의존성에서 보안 취약점을 자동으로 찾을 수 있습니다. 예를 들어, 의존성 스캔을 통해 응용 프로그램이 알려진 취약점을 가진 외부 (오픈 소스) 라이브러리를 사용하는지 여부를 알 수 있습니다. 그런 다음 응용 프로그램을 보호하기 위해 조치를 취할 수 있습니다.
이 튜토리얼에서는 샘플 취약한 응용 프로그램을 생성한 다음 다음을 수행합니다. - 응용 프로그램의 의존성에서 취약점을 감지, 분류 및 해결하는 방법. - Merge Request에서 취약점을 감지하는 방법.
의존성 스캔 설정:
시작하기 전에
Gitpod가 활성화되어 있는지 확인하세요. Gitpod는 온디맨드 클라우드 개발 환경입니다. 자세한 내용은 Gitpod를 참조하세요. 그렇지 않으면 자체 개발 환경을 사용할 수 있습니다. 이 경우 Yarn과 Node.js가 설치되어 있어야 합니다.
예제 응용 프로그램 파일 생성
먼저, 새 프로젝트에서 파이프라인을 구성하고 취약점을 검사할 수 있는 의존성을 추가하는 파일을 생성합니다.
-
기본값을 사용하여 빈 프로젝트를 생성합니다.
-
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 섹션에 표시된 내용을 사용합니다.
-
Build > Pipelines로 이동하여 최신 파이프라인이 성공적으로 완료되었는지 확인합니다.
파이프라인에서 의존성 스캔이 실행되고 취약점이 자동으로 감지됩니다.
취약점 분류
취약점 보고서는 취약점에 대한 중요한 정보를 제공합니다. 일반적으로 기관의 정책에 따라 취약점을 분류합니다. 이 튜토리얼에서는 중간 심각도의 취약점을 무시하고 높은 심각도의 취약점만 확인하는 것으로 가정합니다.
취약점을 분류하려면:
- Secure > 취약점 보고서로 이동합니다.
- 각 중간 심각도 취약점을 해당 행의 확인란을 선택하여 선택합니다.
-
상태 설정 드롭다운 디렉터리에서 기각을 선택합니다. 기각 사유 드롭다운 디렉터리에서 테스트에서 사용됨을 선택하고 “테스트에서 사용됨”이라는 주석을 추가한 다음 상태 변경을 선택합니다.
중간 심각도의 취약점은 보기에서 필터링되어 높은 심각도의 취약점만 남게 됩니다.
-
높음 취약점의 설명을 선택합니다.
권장 솔루션은
fastify
패키지를 업그레이드하는 것입니다. 일반적으로 이를 더 조사하지만, 이 튜토리얼에서는 취약점이 확인된 것으로 간주할 수 있습니다. - 상태 드롭다운 디렉터리에서 확인을 선택한 다음 상태 변경을 선택합니다.
높은 심각도 취약점 해결
높은 심각도의 취약점만 해결해야 합니다. 분류 단계에서 fastify
패키지를 업그레이드해야 한다는 것을 알고 있습니다.
취약점을 해결하려면:
- 왼쪽 사이드바에서 검색 또는 이동을 선택하여 프로젝트를 찾습니다.
- 오른쪽 상단에서 편집 > Gitpod을 선택하고 새 탭에서 Gitpod를 엽니다.
- 지시에 따라 GitLab으로 계속 진행을 선택한 다음 인증을 선택합니다.
- 새 워크스페이스 페이지에서 계속을 선택합니다.
-
터미널 창에 다음 명령을 입력하여 새 브랜치를 생성합니다.
git checkout -b update_packages main
-
터미널 창에 명령을 실행하여
yarn upgrade --latest
를 실행합니다. 이 명령은 프로젝트의 의존성과yarn.lock
파일을 업데이트합니다. -
터미널 창에 명령을 실행하여 변경 사항을 커밋합니다. 이는 CI/CD 파이프라인을 트리거합니다.
git add package.json yarn.lock git commit -m "패키지 버전 업데이트" git push --set-upstream origin update_packages
- GitLab 브라우저 탭으로 전환합니다.
- 코드 > Merge Request로 이동한 다음 Merge Request 생성을 선택합니다.
- 새 Merge Request 페이지로 스크롤하여 Merge Request 생성을 선택합니다. Merge Request 파이프라인이 완료될 때까지 기다립니다.
- 페이지를 새로 고침한 다음 Merge을 선택합니다.
- 파이프라인이 성공적으로 완료될 때까지 기다립니다.
- Secure > 취약점 보고서로 이동합니다.
-
높음 취약점의 설명을 선택합니다.
배너에서 취약점이
main
브랜치에서 해결되었음을 확인합니다. 일반적으로yarn.lock
파일에 지정된fastify
패키지 버전을 확인하여 이를 매뉴얼으로 확인하게 됩니다. 이 튜토리얼에서는 확인 단계를 건너 뛸 수 있습니다. - 상태 드롭다운 디렉터리에서 해결을 선택한 다음 상태 변경을 선택합니다.
-
Secure > 취약점 보고서로 이동합니다.
이제 취약점 보고서에는 나열된 취약점이 _없음_을 확인할 수 있어야 합니다.
합병 요청에서 취약점 검색 테스트
이제 취약점을 위험도에 따라 분류하고 해결하는 방법을 알게 되었습니다. 이제 새로운 잠재적인 취약점을 감지하는 방법을 확인해보겠습니다.
새로운 취약점을 추가하려면:
- Gitpod 탭으로 전환합니다. 시간 초과된 경우 워크스페이스 열기를 선택합니다.
-
터미널 창에서 로컬
main
브랜치를 업데이트 하려면 다음 명령을 실행합니다.git checkout main git fetch origin git rebase origin/main
-
터미널 창에서 새 브랜치를 생성하려면 다음 명령을 실행합니다.
git checkout -b add_dependency main
- 파일 탐색기 사이드바에서
package.json
파일을 선택합니다. -
package.json
파일의dependencies
섹션에 다음 줄을 추가합니다."axios": "0.21.0",
-
package.json
파일에 추가한 의존성을 설치하려면 터미널 창에서 다음 명령을 실행합니다.yarn install
-
변경 사항을 커밋하여 CI/CD 파이프라인을 트리거하려면 터미널 창에서 다음 명령을 실행합니다.
git add package.json yarn.lock git commit -m "Add dependency" git push --set-upstream origin add_dependency
- GitLab 브라우저 탭으로 전환합니다.
- 코드 > 합병 요청로 이동하여 합병 요청 생성을 선택합니다.
- 새 합병 요청 페이지로 이동하여 페이지 하단의 합병 요청 생성을 선택합니다.
합병 요청 파이프라인이 완료될 때까지 기다린 후 페이지를 새로고침합니다. 합병 요청 보안 위젯에서 새로운 잠재적인 취약점에 대해 경고합니다. 이러한 취약점은 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"
...
(중략)