오프라인 환경
인터넷에 연결되지 않은 상태에서 대부분의 GitLab 보안 스캐너를 실행하는 것이 가능합니다.
이 문서는 오프라인 환경에서 Secure Categories(즉, 스캐너 유형)를 운용하는 방법에 대해 설명합니다. 이 지침은 또한 보안이 되어 있는 자체 설치 환경, 보안 정책(예: 방화벽 정책)이 적용된 환경 또는 완전한 인터넷 액세스를 제한하는 환경에도 적용됩니다. GitLab은 이러한 환경을 _오프라인 환경_이라고 합니다. 다른 일반적인 이름으로는 다음이 있습니다.
- 공기차단 환경
- 연결 제한 환경
- 로컬 영역 네트워크(LAN) 환경
- 내부망 환경
이러한 환경은 물리적 장벽이나 보안 정책(예: 방화벽)이 인터넷 액세스를 방지하거나 제한합니다. 이러한 지침은 물리적으로 연결이 끊긴 네트워크용으로 설계되었지만, 다른 사용 사례에서도 따를 수 있습니다.
오프라인 환경 정의
오프라인 환경에서 GitLab 인스턴스는 로컬 네트워크에서 통신할 수 있는 하나 이상의 서버와 서비스일 수 있지만, 인터넷에 액세스할 수 없거나 매우 제한적일 수 있습니다. GitLab 인스턴스와 지원 인프라(예: 개인 Maven 리포지터리) 내의 모든 것은 로컬 네트워크 연결을 통해 액세스할 수 있다고 가정합니다. 인터넷에서의 파일은 물리적으로 매체(USB 드라이브, 하드 드라이브, 기록 가능한 DVD 등)를 통해 가져와야 합니다.
개요
GitLab 스캐너들은 보통 인터넷에 연결하여 최신 시그니처, 규칙 및 패치를 다운로드합니다. 지역 네트워크에서 이용 가능한 리소스를 사용하여 도구를 올바르게 구성하기 위해 몇 가지 추가 단계가 필요합니다.
컨테이너 레지스트리 및 패키지 리포지터리
고수준에서 보안 분석기들은 Docker 이미지로 제공되며, 다양한 패키지 리포지터리를 활용할 수 있습니다. 인터넷이 연결된 GitLab 설치에서 작업을 실행할 때 GitLab은 GitLab.com 호스트 컨테이너 레지스트리를 확인하여 이러한 Docker 이미지의 최신 버전을 가지고 있는지 확인하고 필요한 의존성을 설치하기 위해 패키지 리포지터리에 연결할 수 있습니다.
오프라인 환경에서는 GitLab.com을 쿼리하지 않도록 이러한 확인을 비활성화해야 합니다. GitLab.com의 레지스트리와 리포지터리가 사용할 수 없으므로 각 스캐너를 업데이트하여 다른 내부 호스트 레지스트리를 참조하거나 개별 스캐너 이미지에 액세스할 수 있도록 해야 합니다.
또한 GitLab.com에 호스팅되지 않는 npm, yarn 또는 Ruby gem과 같은 일반적인 패키지 리포지터리에 앱이 액세스할 수 있도록 보장해야 합니다. 이러한 리포지터리의 패키지는 일시적으로 네트워크에 연결하거나 자체 오프라인 네트워크 내에서 패키지를 미러링함으로써 획득할 수 있습니다.
취약점과 상호 작용
취약점을 찾으면 해당 취약점과 상호 작용할 수 있습니다. 자세한 내용은 취약점을 해결하는 방법을 확인하십시오.
경우에 따라 보고된 취약점은 UI에서 노출된 외부 링크를 포함하는 메타데이터를 제공할 수 있습니다. 이러한 링크는 오프라인 환경에서 접근할 수 없을 수 있습니다.
취약점 해결
취약점 해결 기능은 오프라인 의존성 스캐닝 및 컨테이너 스캐닝에서 제공되지만 인스턴스 구성에 따라 작동하지 않을 수 있습니다. 최신 버전에 패치된 보다 최신 버전이 가장 많은 해결책이 되도록 제안할 수 있습니다. 이를 위해서는 최신 버전의 레지스트리 서비스에 액세스할 수 있을 때에만 이러한 서비스가 가능합니다.
스캐너 시그니처 및 규칙 업데이트
인터넷에 연결된 상태에서 일부 스캐너는 최신 시그니처 및 규칙을 검사하기 위해 공개 데이터베이스를 참조합니다. 연결이 끊어진 경우 이것이 불가능합니다. 스캐너에 따라 이 자동 업데이트 확인을 비활성화하고 해당 데이터베이스를 매뉴얼으로 업데이트하거나 네트워크 내에서 호스팅된 자체 사본에 대한 액세스를 제공하여 이러한 작업을 수행해야 합니다.
특정 스캐너 지침
각 개별 스캐너는 위에서 설명한 단계와 약간 다를 수 있습니다. 아래 페이지에서 더 많은 정보를 찾을 수 있습니다.
- 오프라인 환경에서 컨테이너 스캐닝 실행
- 오프라인 환경에서 SAST 실행
- 오프라인 환경에서 Secret Detection 구성
- 오프라인 환경에서 DAST 실행
- API Fuzzing 오프라인 구성
- 오프라인 환경에서 License Scanning 실행
- 오프라인 환경에서 Dependency Scanning 실행
오프라인 호스트에 Docker 이미지 로드
보안 스캔 및 Auto DevOps를 포함한 많은 GitLab 기능을 사용하려면 러너가 관련 Docker 이미지를 가져올 수 있어야 합니다.
공개 인터넷에 직접 액세스할 수 없는 상태에서 이러한 이미지를 이용할 수 있도록 하는 프로세스는 이미지를 다운로드한 다음 패키지화하여 오프라인 호스트로 전송하는 것을 포함합니다. 다음은 그러한 전송의 예시입니다.
- 공개 인터넷에서 Docker 이미지 다운로드.
- Docker 이미지를 tar 아카이브로 패키지화.
- 이미지를 오프라인 환경으로 전송.
- 전송된 이미지를 오프라인 Docker 레지스트리에 로드.
공식 GitLab 템플릿 사용
GitLab은 이 프로세스를 용이하게 하기 위해 장치된 템플릿을 제공합니다.
이 템플릿은 .gitlab-ci.yml
파일이 있는 새로운 빈 프로젝트에 사용되어야 합니다.
include:
- template: Security/Secure-Binaries.gitlab-ci.yml
파이프라인은 보안 스캐너에 필요한 Docker 이미지를 다운로드하고 이를 작업 아티팩트로 저장하거나 파이프라인이 실행되는 프로젝트의 컨테이너 레지스트리에 푸시합니다. 이러한 아카이브를 다른 위치로 전송하고 로드할 수 있습니다. 이 방법은 gitlab.com
(‘registry.gitlab.com’ 포함)과 로컬 오프라인 인스턴스에 모두 액세스할 수 있는 러너가 필요합니다. 이 러너는 특권 모드에서 실행되어야 하고 이 프로젝트에만 사용됩니다.
업데이트 일정 설정
기본적으로 이 프로젝트의 파이프라인은 .gitlab-ci.yml
이 리포지터리에 추가될 때만 한 번 실행됩니다. GitLab 보안 스캐너 및 시그니처를 업데이트하려면 이 파이프라인을 정기적으로 실행해야 합니다. GitLab은 파이프라인 예약하는 방법을 제공합니다. 예를 들어 Docker 이미지를 매주 다운로드하고 저장하도록 설정할 수 있습니다.
생성된 안전한 번들 사용
Secure-Binaries.gitlab-ci.yml
템플릿을 사용하는 프로젝트는 이제 GitLab 보안 기능을 실행하는 데 필요한 모든 필요한 이미지 및 리소스를 호스팅해야 합니다.
다음으로 오프라인 인스턴스에게 기본 GitLab.com의 대신 이러한 리소스를 사용하도록 알려주어야 합니다. 이를 위해 프로젝트의 .gitlab-ci.yml
또는 GitLab UI에서 CI/CD 변수 SECURE_ANALYZERS_PREFIX
를 프로젝트 레지스트리의 URL로 설정하십시오. 자세한 내용은 GitLab CI/CD 변수 페이지를 참조하십시오.
변수
다음 표는 Secure-Binaries.gitlab-ci.yml
템플릿과 함께 사용할 수 있는 CI/CD 변수를 보여줍니다.
CI/CD 변수 | 설명 | 기본값 |
---|---|---|
SECURE_BINARIES_ANALYZERS
| 다운로드할 분석기의 쉼표로 구분된 디렉터리 | "bandit, brakeman, gosec, 등등..."
|
SECURE_BINARIES_DOWNLOAD_IMAGES
| 작업 비활성화에 사용됨 | "true"
|
SECURE_BINARIES_PUSH_IMAGES
| 파일을 프로젝트 레지스트리에 푸시 | "true"
|
SECURE_BINARIES_SAVE_ARTIFACTS
| 이미지 아카이브도 저장 | "false"
|
SECURE_BINARIES_ANALYZER_VERSION
| 기본 분석기 버전 (도커 태그) | "2"
|
공식 템플릿 없이 대체 방법
위의 방법을 따르기 어려운 경우 이미지는 매뉴얼으로 전송될 수 있습니다:
이미지 패키저 스크립트 예시
#!/bin/bash
set -ux
# 필요한 분석기 이미지 지정
analyzers=${SAST_ANALYZERS:-"bandit eslint gosec"}
gitlab=registry.gitlab.com/security-products/
for i in "${analyzers[@]}"
do
tarname="${i}_2.tar"
docker pull $gitlab$i:2
docker save $gitlab$i:2 -o ./analyzers/${tarname}
chmod +r ./analyzers/${tarname}
done
이미지 로더 스크립트 예시
이 예시는 이미지를 배스천 호스트에서 오프라인 호스트로 로드합니다. 특정 구성에서는 이러한 전송을 위해 물리적 미디어가 필요할 수 있습니다:
#!/bin/bash
set -ux
# 필요한 분석기 이미지 지정
analyzers=${SAST_ANALYZERS:-"bandit eslint gosec"}
registry=$GITLAB_HOST:4567
for i in "${analyzers[@]}"
do
tarname="${i}_2.tar"
scp ./analyzers/${tarname} ${GITLAB_HOST}:~/${tarname}
ssh $GITLAB_HOST "sudo docker load -i ${tarname}"
ssh $GITLAB_HOST "sudo docker tag $(sudo docker images | grep $i | awk '{print $3}') ${registry}/analyzers/${i}:2"
ssh $GITLAB_HOST "sudo docker push ${registry}/analyzers/${i}:2"
done
오프라인 환경에서 AutoDevOps로 GitLab Secure 사용
오프라인 환경에서 Secure 스캔을 위해 GitLab AutoDevOps를 사용할 수 있습니다. 그러나 먼저 이러한 단계를 수행해야 합니다:
-
컨테이너 이미지를 로컬 레지스트리에로드합니다. GitLab Secure는 다양한 스캔을 수행하기 위해 분석기 컨테이너 이미지를 활용합니다. 이러한 이미지는 AutoDevOps를 실행하는 일부로 사용할 수 있어야 합니다. AutoDevOps를 실행하기 전에 위의 단계를 따라 이러한 컨테이너 이미지를 로컬 컨테이너 레지스트리에로드하세요.
-
AutoDevOps가 해당 이미지를 올바른 위치에서 찾도록 CI/CD 변수를 설정합니다. AutoDevOps 템플릿은
SECURE_ANALYZERS_PREFIX
변수를 이용하여 분석기 이미지의 위치를 식별합니다. 이 변수에 올바른 값으로 설정하십시오. 프로젝트 CI/CD 변수를 사용하거나.gitlab-ci.yml
파일을 직접 수정할 수 있습니다.
이러한 단계를 완료하면 GitLab에서 Secure 분석기의 로컬 사본이 생성되어 인터넷 호스팅된 컨테이너 이미지 대신에 사용할 준비가 되고 오프라인 환경에서 AutoDevOps에서 Secure를 실행할 수 있습니다.
이러한 단계는 GitLab Secure와 AutoDevOps에 특화되어 있습니다. AutoDevOps의 다른 단계를 사용하는 경우 Auto DevOps 문서에서 다루는 다른 단계가 필요할 수 있습니다.