Dependency Scanning
의존성 스캐닝은 알려진 취약점에 대해 응용 프로그램의 의존성을 분석합니다. 모든 의존성이 스캔되며, 중첩 의존성으로도 알려진 효과적인 의존성을 모두 스캔합니다.
의존성 스캐닝은 종종 소프트웨어 구성 분석(SCA)의 일부로 간주됩니다. SCA에는 코드에서 사용하는 항목을 검사하는 측면이 포함될 수 있습니다. 이러한 항목은 주로 외부 소스에서 가져오는 응용 프로그램 및 시스템 의존성을 포함하며, 직접 작성한 항목에서 가져오는 것이 아닙니다.
의존성 스캐닝은 응용 프로그램 수명주기의 개발 단계에서 실행할 수 있습니다. 파이프라인을 실행할 때마다 취약점이 식별되고, 소스 및 대상 브랜치 간에 비교됩니다. 병합 요청에서 취약점과 그 심각도가 나열되어 응용 프로그램의 위험에 대처할 수 있도록 코드 변경이 커밋되기 전에 사전에 주의할 수 있습니다. 취약점은 파이프라인 외부에서도 지속적인 취약점 스캔으로 식별할 수 있습니다.
GitLab은 의존성 스캐닝과 컨테이너 스캐닝 모두 제공하여 모든 이러한 종속성 유형에 대해 보안을 보장합니다. 가능한 리스크 영역을 최대한 커버하기 위해 보안 스캐너를 모두 사용할 것을 권장합니다. 이러한 기능을 비교하려면 의존성 스캐닝을 컨테이너 스캐닝과 비교하십시오.
경고: 의존성 스캐닝은 컴파일러 및 해석기의 런타임 설치를 지원하지 않습니다.
- 개요는 의존성 스캐닝을 참조하세요.
- 해당 의존성 스캐닝 문서에 대한 대화형 독해 및 사용 방법 데모는 의존성 스캐닝 튜토리얼 실전 GitLab Application Security part 3 사용 방법을 참조하세요.
- 다른 대화형 읽기 및 사용 방법 데모는 GitLab Application Security Playlist로 시작를 참조하세요.
지원되는 언어 및 패키지 관리자
다음 언어 및 의존성 관리자가 지원됩니다:
언어 | 언어 버전 | 패키지 관리자 | 지원되는 파일 | 여러 파일을 처리하는 방법 |
---|---|---|---|---|
.NET | 모든 버전 | NuGet | packages.lock.json
| Y |
C# | ||||
C | 모든 버전 | Conan | conan.lock
| Y |
C++ | ||||
Go | 모든 버전 | Go |
| Y |
Java 및 Kotlin(안드로이드 제외)1 | 8 LTS, 11 LTS, 17 LTS, 또는 21 LTS2 | Gradle3 |
| N |
Maven8 | pom.xml
| N | ||
JavaScript 및 TypeScript | 모든 버전 | npm |
| Y |
yarn | yarn.lock
| Y | ||
pnpm4 | pnpm-lock.yaml
| Y | ||
PHP | 모든 버전 | Composer | composer.lock
| Y |
Python | 3.99, 3.105 | setuptools | setup.py
| N |
pip |
| N | ||
Pipenv | N | |||
Poetry6 | poetry.lock
| N | ||
Ruby | 모든 버전 | Bundler |
| Y |
Scala | 모든 버전 | sbt7 | build.sbt
| N |
-
Kotlin 프로젝트의 지원 여부는 이슈 336866에서 추적됩니다.
-
sbt의 Java 21 LTS는 버전 1.9.7로 제한됩니다. 더 많은 sbt 버전의 지원 사항은 이슈 430335에서 추적됩니다. FIPS 모드가 활성화된 경우 지원되지 않습니다.
-
FIPS 모드가 활성화된 경우 Gradle은 지원되지 않습니다.
-
pnpm
잠금 파일 지원은 GitLab 15.11에서 소개되었습니다.pnpm
잠금 파일은 번들된 종속성을 저장하지 않으므로 보고된 종속성이npm
또는yarn
과 다를 수 있습니다. -
Python 3.10
지원을 위해 GitLab CI/CD 구성 파일에 다음 스탠자를 추가합니다. 이 명령은 기본Python 3.9
대신Python 3.10
이미지를 사용하도록 지정합니다.gemnasium-dependency_scanning: image: name: $CI_TEMPLATE_REGISTRY_HOST/security-products/gemnasium-python:4-python-3.10
-
Poetry 프로젝트 지원에는
poetry.lock
파일이 GitLab 15.0에서 추가되었습니다.poetry.lock
파일이 없는 프로젝트 지원은 이슈에서 추적됩니다: 의존성 스캐닝에 대한 Poetry의 pyproject.toml 지원. -
sbt 1.0.x 지원은 GitLab 16.8에서 폐기되었습니다.
-
Maven 3.8.8 미만의 지원은 GitLab 16.9에서 폐기되었으며, GitLab 17.0에서는 제거될 예정입니다.
-
<
## Dependency detection
의존성 스캐닝은 저장소에서 사용된 언어를 자동으로 감지합니다. 감지된 언어와 일치하는 모든 분석기가 실행됩니다. 분석기의 선택을 사용자 정의할 필요는 일반적으로 없습니다. 사용자가 분석기를 지정하지 않으면 폐기되거나 제거되는 경우 조정할 필요가 없으므로 최상의 커버리지를 얻을 수 있습니다. 그러나 `DS_EXCLUDED_ANALYZERS` 변수를 사용하여 선택을 재정의할 수 있습니다.
언어 감지는 CI 작업 [`rules`](../../../ci/yaml/index.md#rules)을 기반으로 하며, 저장소 루트에서 최대 두 단계의 디렉토리에서 검색합니다. 예를 들어, `Gemfile`, `api/Gemfile` 또는 `api/client/Gemfile` 중 하나를 포함하는 저장소의 경우 `gemnasium-dependency_scanning` 작업이 활성화됩니다. 다만, `api/v1/client/Gemfile`만 지원되는 종속성 파일인 경우에는 활성화되지 않습니다.
Java 및 Python의 경우 지원되는 종속성 파일이 감지되면, 의존성 스캐닝은 프로젝트를 빌드하고 일부 Java 또는 Python 명령을 실행하여 종속성 목록을 가져오려고 시도합니다. 다른 모든 프로젝트의 경우 프로젝트를 먼저 빌드할 필요 없이 잠금 파일을 구문 분석하여 종속성 목록을 얻습니다.
지원되는 종속성 파일이 감지되면, 모든 종속성(전이적 종속성 포함)이 분석됩니다. 분석되는 중첩 또는 전이적 종속성의 깊이에 제한이 없습니다.
### 분석기
의존성 스캐닝은 다음 공식 [Gemnasium 기반](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium) 분석기를 지원합니다:
- `gemnasium`
- `gemnasium-maven`
- `gemnasium-python`
분석기는 Docker 이미지로 출판되며, 의존성 스캐닝은 각 분석을 위해 전용 컨테이너를 시작하는 데 사용합니다. 또한 사용자 정의 [보안 스캐너](../../../development/integrations/secure.md)를 통합할 수도 있습니다.
각 분석기는 Gemnasium의 새 버전이 출시 될 때마다 업데이트됩니다. 자세한 정보는 분석기 [릴리스 프로세스 문서](../../../development/sec/analyzer_development_guide.md#versioning-and-release-process)를 참조하세요.
### 분석기의 종속성 정보 얻는 방법
GitLab 분석기는 종속성 정보를 얻는 데 다음 두 가지 방법 중 하나를 사용합니다:
1. [잠금 파일을 직접 구문 분석합니다.](#잠금 파일을 직접 구문 분석하는 방법)
2. [패키지 관리자 또는 빌드 도구를 실행하여 구문 분석 가능한 파일을 생성한 후 구문 분석합니다.](#패키지 관리자를 실행하여 파생 가능한 파일을 생성하여 종속성 정보를 얻는 방법)
#### 잠금 파일을 직접 구문 분석하는 방법
다음 패키지 관리자들은 GitLab 분석기가 직접 구문 분석할 수 있는 잠금 파일을 사용합니다:
패키지 관리자 지원되는 파일 형식 버전 테스트된 패키지 관리자 버전 Bundler 해당 없음 1.17.3, 2.1.4 Composer 해당 없음 1.x Conan 0.4 1.x Go 해당 없음 1.x1 NuGet v1, v22 4.9 npm v1, v2, v33 6.x, 7.x, 9.x pnpm v5, v6 7.x, 8.x yarn v1, v24, v34 1.x, 2.x, 3.x Poetry v1 1.x -
Go 프로젝트에서 사용하는 빌드 목록을 생성할 수 없는 경우, Dependency Scanning은
go.sum
을만 파싱합니다. -
NuGet 버전 2 잠금 파일 지원은 GitLab 16.2에 도입되었습니다.
-
lockfileVersion = 3
지원은 GitLab 15.7에 도입되었습니다. -
Yarn
v2
및v3
지원은 GitLab 15.11에 도입되었습니다. 그러나 이 기능은 GitLab 15.0 이후 버전에서도 사용할 수 있습니다.아래 기능들은 Yarn
v2
또는v3
에서 지원되지 않습니다:패치, 워크스페이스 또는 이 두 가지 기능이 포함된 Yarn 파일은 여전히 처리되지만 이러한 기능들은 무시됩니다.
패키지 관리자 사전 설치된 버전 테스트된 버전 sbt 1.6.2 1.0.4, 1.1.6, 1.2.8, 1.3.12, 1.4.6, 1.5.8, 1.6.2 1.7.3 1.8.3 1.9.6 1.9.7 maven 3.6.3 3.6.31 Gradle 6.7.12, 7.3.32 5.6.4, 6.7, 6.9, 7.3 8.4 setuptools 58.1.0 >= 65.6.3 pip 22.0.4 20.x Pipenv 2022.1.8 2022.1.83, 2022.1.8 Go 1.18 1.184 -
이 테스트는
.tool-versions
파일에서 지정된 기본 버전의maven
을 사용합니다. -
서로 다른 Java 버전은 서로 다른 Gradle 버전을 필요로 합니다. 위 표에 나열된 Gradle 버전은 분석기 이미지에 사전 설치되어 있습니다. 분석기에서 사용하는 Gradle 버전은 프로젝트가
gradlew
(Gradle 래퍼) 파일을 사용하는지 여부에 따라 달라집니다:-
프로젝트가 사용하지 않는
gradlew
파일을 사용하는 경우, 분석기는DS_JAVA_VERSION
변수에서 지정된 Java 버전에 기반하여 자동으로 사전 설치된 Gradle 버전 중 하나로 전환합니다. 기본적으로, 분석기는 Java 17 및 Gradle 7.3.3을 사용합니다.Java 버전
8
및11
의 경우, Gradle6.7.1
이 자동으로 선택되며, Java 버전17
의 경우, Gradle7.3.3
이 자동으로 선택됩니다. -
프로젝트가 사용하는
gradlew
파일을 사용하는 경우, 분석기 이미지에 사전 설치된 Gradle 버전은 무시되고, 대신 사용 중인gradlew
파일에 지정된 버전이 사용됩니다.
-
-
이 테스트는
Pipfile.lock
파일이 발견되면, 이 파일에 나열된 정확한 패키지 버전을 스캔하는 데 Gemnasium가 사용되는지 확인합니다. -
go build
구현으로 인해, Go 빌드 프로세스는 네트워크 액세스,go mod download
를 통한 미리 로드된 모드 캐시 또는 판매된 의존성이 필요합니다. 더 많은 정보는 패키지 및 의존성 컴파일에서 Go 문서를 참조하세요.
의존성 스캐닝은 제한된 취약성 세트를 감지하기 위해 [Retire.js](https://github.com/RetireJS/retire.js) 스캐너를 사용합니다. 감지되는 취약점에 대한 자세한 내용은 [Retire.js repository](https://github.com/RetireJS/retire.js/blob/master/repository/jsrepository.json)를 참조하세요. (GitLab 14.8에서 [도입](https://gitlab.com/gitlab-org/gitlab/-/issues/350512)). | | `DS_INCLUDE_DEV_DEPENDENCIES` | `gemnasium` | `"true"` | `"false"`로 설정하면 개발 의존성 및 해당 취약성이 보고되지 않습니다. Composer, npm, pnpm, Pipenv 또는 Poetry를 사용하는 프로젝트만 지원됩니다. (GitLab 15.1에서 [도입](https://gitlab.com/gitlab-org/gitlab/-/issues/227861)). | | `GOOS` | `gemnasium` | `"linux"` | Go 코드를 컴파일할 운영 체제입니다. | | `GOARCH` | `gemnasium` | `"amd64"` | Go 코드를 컴파일할 프로세서 아키텍처입니다. | | `GOFLAGS` | `gemnasium` | | `go build` 도구에 전달되는 플래그입니다. | | `GOPRIVATE` | `gemnasium` | | 소스에서 가져올 글로브 패턴 및 접두사 목록입니다. 자세한 내용은 Go private modules [documentation](https://go.dev/ref/mod#private-modules)를 참조하세요. | | `DS_JAVA_VERSION` | `gemnasium-maven` | `17` | Java 버전입니다. 사용 가능한 버전: `8`, `11`, `17`, `21`. | | `MAVEN_CLI_OPTS` | `gemnasium-maven` | `"-DskipTests --batch-mode"` | 분석기가 `maven`으로 전달하는 명령줄 인수 목록입니다. [사용자 지정 Maven 저장소 사용](../index.md#using-private-maven-repositories)의 예제를 참조하세요. | | `GRADLE_CLI_OPTS` | `gemnasium-maven` | | 분석기가 `gradle`로 전달하는 명령줄 인수 목록입니다. | | `SBT_CLI_OPTS` | `gemnasium-maven` | | 분석기가 `sbt`에 전달하는 명령줄 인수 목록입니다. | | `PIP_INDEX_URL` | `gemnasium-python`| `https://pypi.org/simple` | Python 패키지 인덱스의 기본 URL입니다. | | `PIP_EXTRA_INDEX_URL` | `gemnasium-python`| | `PIP_INDEX_URL`에 추가하여 사용할 패키지 인덱스의 [추가 URL](https://pip.pypa.io/en/stable/reference/pip_install/#cmdoption-extra-index-url) 배열입니다. 쉼표로 구분합니다. 이 환경 변수를 사용할 때 [다음 보안 고려 사항](#python-projects)을 참조하세요. | | `PIP_REQUIREMENTS_FILE` | `gemnasium-python`| | 스캔할 pip 요구 사항 파일입니다. 이 환경 변수가 설정된 경우 지정된 파일만 스캔됩니다. | | `PIPENV_PYPI_MIRROR` | `gemnasium-python`| | 설정된 경우, Pipenv가 PyPi 인덱스를 [미러](https://github.com/pypa/pipenv/blob/v2022.1.8/pipenv/environments.py#L263)로 사용합니다. | | `DS_PIP_VERSION` | `gemnasium-python`| | 특정 pip 버전을 설치합니다(예: `"19.3"`). 그렇지 않으면 Docker 이미지에 설치된 pip가 사용됩니다. | | `DS_PIP_DEPENDENCY_PATH` | `gemnasium-python`| | Python pip 종속성을로드할 경로입니다. | #### 기타 변수 이전 표들은 사용할 수 있는 모든 변수들의 체계적인 목록은 아닙니다. 지원 및 테스트하는 GitLab 및 분석기 변수를 모두 포함하고 있습니다. 환경 변수와 같은 많은 변수가 있으며, 이들은 전달하고 작동합니다. 이 리스트는 많고, 우리가 알지 못하는 변수들이 많으며, 이에 따라 문서화되지 않았습니다. 예를 들어, 비-GitLab 환경 변수 `HTTPS_PROXY`를 모든 Dependency Scanning 작업에 전달하려면, 다음과 같이 `.gitlab-ci.yml` 파일의 [CI/CD 변수를 설정](../../../ci/variables/index.md#define-a-cicd-variable-in-the-gitlab-ciyml-file)하세요: ```yaml variables: HTTPS_PROXY: "https://squid-proxy:3128" ``` 참고: Gradle 프로젝트는 [추가 변수](#using-a-proxy-with-gradle-projects) 설정이 필요합니다. 또는 Dependency Scanning과 같이 특정 작업에서 사용할 수 있습니다: ```yaml dependency_scanning: variables: HTTPS_PROXY: $HTTPS_PROXY ``` 우리는 모든 변수를 테스트하지 않았으므로 몇 가지 변수가 작동하고 다른 변수가 작동하지 않을 수 있습니다. 작동하지 않는 변수를 사용해야 하는 경우 [기능 요청을 제출](https://gitlab.com/gitlab-org/gitlab/-/issues/new?issuable_template=Feature%20proposal%20-%20detailed&issue[title]=Docs%20feedback%20-%20feature%20proposal:%20Write%20your%20title)하거나 [코드 기여](../../../development/index.md)를 하는 것을 권장합니다. ### 사용자 정의 TLS 인증서 Dependency Scanning은 분석기 컨테이너 이미지에 기본으로 제공되는 것 대신 SSL/TLS 연결을 위한 사용자 정의 TLS 인증서를 사용할 수 있게 합니다. 사용자 정의 인증 기관에 대한 지원은 다음 버전에서 소개되었습니다. | 분석기 | 버전 | |--------------------|--------------------------------------------------------------------------------------------------------| | `gemnasium` | [v2.8.0](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium/-/releases/v2.8.0) | | `gemnasium-maven` | [v2.9.0](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-maven/-/releases/v2.9.0) | | `gemnasium-python` | [v2.7.0](https://gitlab.com/gitlab-org/security-products/analyzers/gemnasium-python/-/releases/v2.7.0) | #### 사용자 정의 TLS 인증서 사용 사용자 정의 TLS 인증서를 사용하려면 CI/CD 변수 `ADDITIONAL_CA_CERT_BUNDLE`에 [X.509 PEM 공개 키 인증서의 텍스트 표현](https://www.rfc-editor.org/rfc/rfc7468#section-5.1)를 할당하세요. 예를 들어, 인증서를 `.gitlab-ci.yml` 파일에서 구성하려면: ```yaml variables: ADDITIONAL_CA_CERT_BUNDLE: | -----BEGIN CERTIFICATE----- MIIGqTCCBJGgAwIBAgIQI7AVxxVwg2kch4d56XNdDjANBgkqhkiG9w0BAQsFADCB ... jWgmPqF3vUbZE0EyScetPJquRFRKIesyJuBFMAs= -----END CERTIFICATE----- ``` ### 사설 Maven 저장소 사용 사설 Maven 저장소에 로그인 자격 증명이 필요한 경우 `MAVEN_CLI_OPTS` CI/CD 변수를 사용할 수 있습니다. 사설 Maven 저장소 사용 방법에 대해 자세히 알아보세요: [사설 Maven 저장소 사용](../index.md#using-private-maven-repositories). ### FIPS 활성화된 이미지 > - GitLab 14.10에서 소개. GitLab 팀원은 이 기밀된 이슈에서 더 많은 정보를 볼 수 있습니다: `https://gitlab.com/gitlab-org/gitlab/-/issues/354796` > - GitLab 15.0에서 소개 - FIPS 모드가 활성화되면 Gemnasium은 FIPS 모드의 이미지를 사용합니다. GitLab은 또한 [FIPS 활성화된 Red Hat UBI](https://www.redhat.com/en/blog/introducing-red-hat-universal-base-image) 버전의 Gemnasium 이미지를 제공합니다. GitLab 인스턴스에서 FIPS 모드가 활성화된 경우, Gemnasium 스캔 작업은 자동으로 FIPS 활성화된 이미지를 사용합니다. 수동으로 FIPS 활성화된 이미지로 전환하려면 변수 `DS_IMAGE_SUFFIX`를 `"-fips"`로 설정하세요. Gradle 프로젝트의 Dependency scanning과 Yarn 프로젝트의 자동 보완은 FIPS 모드에서 지원되지 않습니다. ## 결과 Dependency Scanning에서 다음과 같은 결과를 생성합니다: - **Dependency scanning 보고서**: 종속성에서 감지된 모든 취약점의 세부 정보를 포함합니다. - **CycloneDX SBoM(Software Bill of Materials)**: 각 지원되는 잠금 또는 빌드 파일의 SBoM. ### Dependency scanning 보고서 Dependency Scanning은 모든 취약점에 대한 세부 정보를 담은 보고서를 출력합니다. 이 보고서는 내부적으로 처리되며 결과는 UI에 표시됩니다. 또한 보고서는 Dependency Scanning 작업의 artifact로 `gl-dependency-scanning-report.json`라는 이름으로 출력됩니다. Dependency scanning 보고서에 대한 자세한 내용은 다음을 참조하세요: - [보안 스캐너 통합](../../../development/integrations/secure.md). - [Dependency scanning 보고서 스키마](https://gitlab.com/gitlab-org/security-products/security-report-schemas/-/blob/master/dist/dependency-scanning-report-format.json). ### CycloneDX 소프트웨어 자재 목록 > - [소개](https://gitlab.com/gitlab-org/gitlab/-/issues/350509): GitLab 14.8에서 [베타](../../../policy/experiment-beta-support.md#beta)로 소개됨. > - GitLab 15.7에서 일반적으로 사용 가능함. 의존성 스캐닝은 각 지원되는 잠금 또는 빌드 파일에 대해 [CycloneDX](https://cyclonedx.org/) 소프트웨어 자재 목록(SBOM)을 생성합니다. CycloneDX SBOM은 다음과 같습니다: - `gl-sbom-- .cdx.json`로 명명됨. - 의존성 스캐닝 작업의 작업 결과물로 이용 가능함. - 감지된 잠금 또는 빌드 파일과 동일한 디렉터리에 저장됨. 예를 들어, 프로젝트가 다음 구조를 갖고 있다면: ```plaintext . ├── ruby-project/ │ └── Gemfile.lock ├── ruby-project-2/ │ └── Gemfile.lock ├── php-project/ │ └── composer.lock └── go-project/ └── go.sum ``` 그러면 Gemnasium 스캐너는 다음과 같은 CycloneDX SBOM을 생성합니다: ```plaintext . ├── ruby-project/ │ ├── Gemfile.lock │ └── gl-sbom-gem-bundler.cdx.json ├── ruby-project-2/ │ ├── Gemfile.lock │ └── gl-sbom-gem-bundler.cdx.json ├── php-project/ │ ├── composer.lock │ └── gl-sbom-packagist-composer.cdx.json └── go-project/ ├── go.sum └── gl-sbom-go-go.cdx.json ``` #### 여러 CycloneDX SBOM 병합 여러 CycloneDX SBOM을 하나의 SBOM으로 병합할 수 있습니다. GitLab은 각 CycloneDX SBOM의 메타데이터에 구현별 세부 정보(빌드 및 잠금 파일의 위치와 같은)를 저장하기 위해 [CycloneDX 속성](https://cyclonedx.org/use-cases/#properties--name-value-store)를 사용합니다. 여러 CycloneDX SBOM이 함께 병합되면 해당 정보는 결과로 나온 병합 파일에서 제거됩니다. 예를 들어, 다음 `.gitlab-ci.yml` 추출은 Cyclone SBOM 파일을 병합하고, 결과 파일을 유효성을 검사하는 방법을 보여줍니다. ```yaml stages: - test - merge-cyclonedx-sboms include: - template: Jobs/Dependency-Scanning.gitlab-ci.yml merge cyclonedx sboms: stage: merge-cyclonedx-sboms image: name: cyclonedx/cyclonedx-cli:0.24.2 entrypoint: [""] script: - apt-get update && apt-get install -y jq - find . -name "gl-sbom-*.cdx.json" -exec cyclonedx merge --output-file gl-sbom-all.cdx.json --input-files "{}" + # 병합된 파일에서 중복을 제거합니다. 자세한 내용은 https://github.com/CycloneDX/cyclonedx-cli/issues/188를 참조하세요. - | jq '. | { "bomFormat": .bomFormat, "specVersion": .specVersion, "serialNumber": .serialNumber, "version": .version, "metadata": { "tools": [ (.metadata.tools | unique[]) ] }, "components": [ (.components | unique[]) ] }' "gl-sbom-all.cdx.json" > gl-sbom-all.cdx.json.tmp && mv gl-sbom-all.cdx.json.tmp gl-sbom-all.cdx.json # 선택 사항: 병합된 sbom을 유효성 검사합니다 - cyclonedx validate --input-version v1_4 --input-file gl-sbom-all.cdx.json artifacts: paths: - gl-sbom-all.cdx.json ``` ## 취약점 데이터베이스 기여 취약점을 찾으려면 [`GitLab 공지 데이터베이스`](https://advisories.gitlab.com/)에서 검색할 수 있습니다. 또한 [새로운 취약점을 제출](https://gitlab.com/gitlab-org/security-products/gemnasium-db/blob/master/CONTRIBUTING.md)할 수 있습니다. ## 오프라인 환경에서 의존성 스캐닝 실행 인터넷을 통한 외부 리소스에 대한 액세스가 제한된 환경에 있는 자체 관리 GitLab 인스턴스의 경우, 의존성 스캐닝 작업이 성공적으로 실행되려면 일부 조정이 필요합니다. 자세한 정보는 [오프라인 환경](../offline_deployments/index.md)을 참조하세요. ### 오프라인 의존성 스캐닝 요구 사항 오프라인 환경에서 의존성 스캐닝을 사용하기 위해 다음이 필요합니다: - `docker` 또는 `kubernetes` 실행자가 있는 GitLab Runner. - 의존성 스캐닝 [분석기](https://gitlab.com/gitlab-org/security-products/analyzers) 이미지의 로컬로 사용 가능한 사본이 있는 Docker 컨테이너 레지스트리. - 액세스를 허용해야 하는 제한된 액세스 환경의 경우, 프록시 사용과 같은 액세스를 허용해야 합니다. `https://gitlab.com/gitlab-org/security-products/gemnasium-db.git`에 대한 CI/CD 변수 `GEMNASIUM_DB_REMOTE_URL`을 이 리포지토리의 URL로 설정해야 할 수도 있습니다. 구성 변수에 대한 자세한 정보는 [분석기 동작 사용자 정의](#customizing-analyzer-behavior)를 참조하세요. 이 공지 데이터베이스는 지속적으로 업데이트되므로 로컬 사본을 GitLab과 주기적으로 동기화해야 합니다. GitLab Runner는 기본적으로 [항상 `pull policy`를 사용](https://docs.gitlab.com/runner/executors/docker.html#using-the-always-pull-policy)하여 GitLab 컨테이너 레지스트리에서 Docker 이미지를 가져오려고 하며, 지역 사본이 있더라도. 오프라인 환경에서는 GitLab Runner의 [`pull_policy`를 `if-not-present`로 설정](https://docs.gitlab.com/runner/executors/docker.html#using-the-if-not-present-pull-policy)할 수 있습니다. 이렇게 하면 로컬로 사용 가능한 Docker 이미지만 사용하게 됩니다. 그러나 CI/CD 파이프라인에서 업데이트된 스캐너를 사용하려면 오프라인 환경이 아니라면 항상 `pull policy` 설정을 유지하는 것이 좋습니다. ### Docker 레지스트리 내부에 GitLab 의존성 스캐닝 분석기 이미지 사용 가능하게 지원되는 언어 및 프레임워크에서 [의존성 스캐닝](#supported-languages-and-package-managers)을 하기 위해서는, `registry.gitlab.com`에서 기본 의존성 스캐닝 분석기 이미지를 다음과 같이 로컬 Docker 컨테이너 레지스트리에 가져와야 합니다: ```plaintext registry.gitlab.com/security-products/gemnasium:4 registry.gitlab.com/security-products/gemnasium-maven:4 registry.gitlab.com/security-products/gemnasium-python:4 ``` 로컬 오프라인 Docker 레지스트리로 Docker 이미지를 가져오는 절차는 **귀하의 네트워크 보안 정책**에 따라 다릅니다. 외부 리소스를 가져오거나 임시로 액세스하는 데 수락되고 승인된 방법을 찾기 위해 IT 직원에게 상의하십시오. 이러한 스캐너들은 [주기적으로 업데이트](../index.md#vulnerability-scanner-maintenance)되며, 가끔씩 귀하도 스스로 업데이트할 수 있을 수도 있습니다. Docker 이미지를 파일로 저장하고 전송하는 세부 정보는 Docker 문서에서 [`docker save`](https://docs.docker.com/reference/cli/docker/image/save/), [`docker load`](https://docs.docker.com/reference/cli/docker/image/load/), [`docker export`](https://docs.docker.com/reference/cli/docker/container/export/), 그리고 [`docker import`](https://docs.docker.com/reference/cli/docker/image/import/)를 참조하세요. ### 로컬 의존성 스캐닝 분석기를 사용하도록 의존성 스캐닝 CI/CD 작업 변수 설정 `.gitlab-ci.yml` 파일에 다음 구성을 추가하세요. `SECURE_ANALYZERS_PREFIX` 값을 로컬 Docker 컨테이너 레지스트리로 지정해야 합니다. 또한 `GEMNASIUM_DB_REMOTE_URL` 값을 오프라인 Git 복사본에 있는 [`gemnasium-db` 고문 데이터](https://gitlab.com/gitlab-org/security-products/gemnasium-db/)의 위치로 변경해야 합니다: ```yaml include: - template: Jobs/Dependency-Scanning.gitlab-ci.yml variables: SECURE_ANALYZERS_PREFIX: "docker-registry.example.com/analyzers" GEMNASIUM_DB_REMOTE_URL: "gitlab.example.com/gemnasium-db.git" ``` 이전 변수에 대한 설명은 [구성 섹션](#customizing-analyzer-behavior)에서 확인하세요. ### `gemnasium_db` 고문 데이터의 복사본 호스팅 [`gemnasium_db`](https://gitlab.com/gitlab-org/security-products/gemnasium-db) Git 리포지토리는 `gemnasium`, `gemnasium-maven`, 그리고 `gemnasium-python`에서 취약성 데이터의 원본으로 사용됩니다. 이 리포지토리는 최신 고문을 가져오기 위해 스캔 시간에 업데이트됩니다. 그러나 제한된 네트워킹 환경으로 인해 이 업데이트를 실행하는 것이 때로는 불가능할 수 있습니다. 이 경우 사용자는 다음 중 하나를 할 수 있습니다: - [고문 데이터의 복사본 호스팅](#host-a-copy-of-the-advisory-database) - [로컬 복제 사용](#use-a-local-clone) #### 고문 데이터의 복사본 호스팅 만약 환경 내에서 [gemnasium-db](https://gitlab.com/gitlab-org/security-products/gemnasium-db)에 접근할 수 없다면, 사용자는 자체 Git 복사본을 호스팅할 수 있습니다. 그런 다음 분석기는 `GEMNASIUM_DB_REMOTE_URL`을 사용하여 사용자의 복사본에서 데이터베이스를 업데이트하도록 지시할 수 있습니다: ```yaml variables: GEMNASIUM_DB_REMOTE_URL: https://users-own-copy.example.com/gemnasium-db/.git ... ``` #### 로컬 복제 사용 호스팅된 복사본이 불가능한 경우, 사용자는 [gemnasium-db](https://gitlab.com/gitlab-org/security-products/gemnasium-db)를 클론하거나 스캔 전에 아카이브를 생성하고 분석기를 디렉토리로 지정할 수 있습니다(`GEMNASIUM_DB_LOCAL_PATH`를 사용). 분석기의 자체 업데이트 메커니즘을 비활성화하세요(`GEMNASIUM_DB_UPDATE_DISABLED`를 사용). 예를 들어, 이 예시에서는 데이터베이스 디렉토리를 `before_script`에서 생성하고 `gemnasium` 분석기의 스캔 작업 직전에 생성합니다: ```yaml ... gemnasium-dependency_scanning: variables: GEMNASIUM_DB_LOCAL_PATH: ./gemnasium-db-local GEMNASIUM_DB_UPDATE_DISABLED: "true" before_script: - mkdir $GEMNASIUM_DB_LOCAL_PATH - tar -xzf gemnasium_db.tar.gz -C $GEMNASIUM_DB_LOCAL_PATH ``` ## Gradle 프로젝트에 Proxy 사용하기 Gradle 래퍼 스크립트는 `HTTP(S)_PROXY` 환경 변수를 읽지 않습니다. [상위 이슈](https://github.com/gradle/gradle/issues/11065)를 참조하세요. Gradle 래퍼 스크립트가 프록시를 사용하도록 하려면 `GRADLE_CLI_OPTS` CI/CD 변수를 사용하여 옵션을 지정할 수 있습니다: ```yaml variables: GRADLE_CLI_OPTS: "-Dhttps.proxyHost=squid-proxy -Dhttps.proxyPort=3128 -Dhttp.proxyHost=squid-proxy -Dhttp.proxyPort=3128 -Dhttp.nonProxyHosts=localhost" ``` ## Maven 프로젝트에 프록시 사용하기 Maven은 `HTTP(S)_PROXY` 환경 변수를 읽지 않습니다. Maven 종속성 스캐너를 프록시를 사용하도록 만들려면 `MAVEN_CLI_OPTS` CI/CD 변수를 사용하여 옵션을 지정할 수 있습니다. ```yaml variables: MAVEN_CLI_OPTS: "-DproxySet=true -Dhttps.proxyHost=squid-proxy -Dhttps.proxyPort=3128 -Dhttp.proxyHost=squid-proxy -Dhttp.proxyPort=3218" ``` ## 언어 및 패키지 관리자에 대한 특정 설정 특정 언어 및 패키지 관리자를 구성하는 방법은 다음 섹션을 참조하세요. ### Python (pip) 분석기가 실행되기 전에 Python 패키지를 설치해야 하는 경우, 스캔 작업의 `before_script`에서 `pip install --user`를 사용해야 합니다. `--user` 플래그는 프로젝트 종속성이 사용자 디렉토리에 설치되도록 합니다. `--user` 옵션을 전달하지 않으면 패키지가 전역적으로 설치되며 스캔되지 않으며 프로젝트 종속성을 나열할 때 나타나지 않습니다. ### Python (setuptools) 분석기가 실행되기 전에 Python 패키지를 설치해야 하는 경우, 스캔 작업의 `before_script`에서 `python setup.py install --user`를 사용해야 합니다. `--user` 플래그는 프로젝트 종속성이 사용자 디렉토리에 설치되도록 합니다. `--user` 옵션을 전달하지 않으면 패키지가 전역적으로 설치되며 스캔되지 않으며 프로젝트 종속성을 나열할 때 나타나지 않습니다. 개인 PyPi 저장소에 대한 자체 서명된 인증서를 사용하는 경우, 템플릿 `.gitlab-ci.yml` 이외의 추가 작업 구성이 필요하지 않습니다. 그러나 프로젝트가 개인 저장소에 도달할 수 있도록 `setup.py`를 업데이트해야 합니다. 다음은 예시 구성입니다: 1. 각 `install_requires` 목록의 종속성마다 개인 저장소를 가리키는 `dependency_links` 속성을 만들도록 `setup.py`를 업데이트하세요. ```python install_requires=['pyparsing>=2.0.3'], dependency_links=['https://pypi.example.com/simple/pyparsing'], ``` 1. 저장소 URL에서 인증서를 가져와 프로젝트에 추가하세요. ```shell printf "\n" | openssl s_client -connect pypi.example.com:443 -servername pypi.example.com | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > internal.crt ``` 1. `setup.py`를 새로 다운로드한 인증서를 가리키도록 하세요. ```python import setuptools.ssl_support setuptools.ssl_support.cert_paths = ['internal.crt'] ``` ### Python (Pipenv) 네트워크 연결이 제한된 환경에서 실행해야 하는 경우, `PIPENV_PYPI_MIRROR` 변수를 구성하여 개인 PyPi 미러를 사용해야 합니다. 이 미러에는 기본 및 개발 종속성이 모두 포함되어야 합니다. ```yaml variables: PIPENV_PYPI_MIRROR: https://pypi.example.com/simple ``` `PIP_EXTRA_INDEX_URL` 환경 변수를 사용해야 하는 경우, [CVE-2018-20225](https://nvd.nist.gov/vuln/detail/CVE-2018-20225)에서 문서화된 가능한 악용으로 인해 추가 주의가 필요합니다. -