튜토리얼: 의존성 스캔 설정
의존성 스캔은 응용 프로그램을 개발하고 테스트하는 동안 소프트웨어 의존성에서 보안 취약점을 자동으로 찾을 수 있습니다. 예를 들어, 의존성 스캔을 통해 응용 프로그램이 취약한 것으로 알려진 외부(오픈 소스) 라이브러리를 사용하는지 여부를 알 수 있습니다. 그런 다음 응용 프로그램을 보호하기 위해 조치를 취할 수 있습니다.
이 튜토리얼에서는 샘플 취약한 응용 프로그램을 만드는 방법 및 다음을 보여줍니다.
- 응용 프로그램의 의존성에서 취약점을 감지하고 필터링하고 해결하는 방법.
- 병합 요청에서의 취약점 감지 방법.
의존성 스캔을 설정하려면:
시작하기 전에
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(`서버가 ${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 > Vulnerability report로 이동합니다.
- 각 중등도 취약점을 각 행의 확인란을 선택하여 선택합니다.
-
상태 설정 드롭다운 목록에서 기각을 선택합니다. 기각 이유 드롭다운 목록에서 테스트에 사용됨을 선택하고 “테스트에 사용됨”이라는 주석을 추가한 다음 상태 변경을 선택합니다.
중등도 취약점은 보기에서 필터링되어 높은 심각도 취약점만 남게 됩니다.
-
높음 취약점의 설명을 선택합니다.
권장 솔루션은
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 브라우저 탭으로 전환합니다.
- Code > 병합 요청로 이동한 다음 병합 요청 생성을 선택합니다.
- 새 병합 요청 페이지로 스크롤하여 병합 요청 생성을 선택합니다. 병합 요청 파이프라인이 완료될 때까지 기다립니다.
- 페이지를 새로 고침하고 병합을 선택합니다.
- 파이프라인이 성공적으로 완료될 때까지 기다립니다.
- Secure > 취약성 보고서로 이동합니다.
-
높음 취약점의 설명을 선택합니다.
배너에서 취약점이
main
브랜치에서 해결되었다는 것이 확인됩니다. 일반적으로는yarn.lock
파일에서 지정된fastify
패키지의 버전을 확인하는 등 수동으로 확인할 것입니다만, 이 튜토리얼에서는 확인 단계를 건너뛸 수 있습니다. - 상태 드롭다운 목록에서 해결을 선택하고 상태 변경을 선택합니다.
-
Secure > 취약성 보고서로 이동합니다.
이제 취약점 보고서에는 취약점이 없게 됩니다.
병합 요청에서 취약점 감지 테스트
이제 취약점을 분류하고 해결하는 방법을 알게 되었습니다. 이제 새로운 잠재적인 취약점을 감지하는 방법을 살펴봅시다. 새로운 취약점을 추가하려면 다음을 수행하세요:
- Gitpod 탭으로 전환합니다. 시간 초과된 경우 작업 공간 열기를 선택합니다.
-
터미널 창에서 로컬
main
브랜치를 업데이트하려면 다음 명령을 실행합니다.plaintext git checkout main git fetch origin git rebase origin/main
-
터미널 창에서 새로운 브랜치를 생성하려면 다음 명령을 실행합니다.
plaintext git checkout -b add_dependency main
- 파일 탐색기 사이드바에서
package.json
파일을 선택합니다. -
package.json
파일의dependencies
섹션에 다음 라인을 추가합니다.json "axios": "0.21.0",
-
터미널 창에서
package.json
파일에 추가된 종속성을 설치하려면 다음 명령을 실행합니다.plaintext yarn install
-
터미널 창에서 변경 사항을 커밋하려면 다음 명령을 실행합니다. 이렇게 하면 GitLab에서 CI/CD 파이프라인이 트리거됩니다.
plaintext 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.10.2, ajv@^6.11.0, ajv@^6.12.0:
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"
archy@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40"
integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==
atomic-sleep@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b"
integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==
avvio@^6.3.1:
version "6.5.0"
resolved "https://registry.yarnpkg.com/avvio/-/avvio-6.5.0.tgz#d2cf119967fe90d2156afc29de350ced800cdaab"
integrity sha512-BmzcZ7gFpyFJsW8G+tfQw8vJNUboA9SDkkHLZ9RAALhvw/rplfWwni8Ee1rA11zj/J7/E5EvZmweusVvTHjWCA==
dependencies:
archy "^1.0.0"
debug "^4.0.0"
fastq "^1.6.0"
// 계속됨...