오프라인 환경
GitLab v19.5Offering: GitLab Self-Managed
요약
오프라인 환경을 구성하려면 구매 전에 클라우드 라이선스 옵트아웃 예외를 받아야 합니다. 인터넷에 연결되지 않은 상태에서도 대부분의 GitLab 보안 스캐너를 실행할 수 있습니다. 이 문서는 오프라인 환경에서 Secure 카테고리(즉, 스캐너 유형)를 운영하는 방법을 설명합니다.
오프라인 환경을 구성하려면 구매 전에 클라우드 라이선스 옵트아웃 예외를 받아야 합니다. 자세한 내용은 GitLab 영업 담당자에게 문의합니다.
인터넷에 연결되지 않은 상태에서도 대부분의 GitLab 보안 스캐너를 실행할 수 있습니다.
이 문서는 오프라인 환경에서 Secure 카테고리(즉, 스캐너 유형)를 운영하는 방법을 설명합니다. 이 지침은 보안이 적용되었거나, 방화벽 정책과 같은 보안 정책이 있거나, 그 밖의 이유로 인터넷 전체에 접근하지 못하는 GitLab Self-Managed 인스턴스에도 적용됩니다. GitLab은 이러한 환경을 오프라인 환경 이라고 부릅니다. 흔히 쓰이는 다른 명칭은 다음과 같습니다.
- 에어갭 환경
- 제한된 연결 환경
- 근거리 통신망(LAN) 환경
- 인트라넷 환경
이러한 환경에는 인터넷 접근을 막거나 제한하는 물리적 장벽이나 보안 정책(예: 방화벽)이 있습니다. 이 지침은 물리적으로 분리된 네트워크를 대상으로 하지만, 앞서 언급한 다른 사례에도 적용할 수 있습니다.
오프라인 환경 정의#
오프라인 환경에서 GitLab 인스턴스는 로컬 네트워크로 통신할 수 있으나 인터넷 접근이 없거나 매우 제한된 하나 이상의 서버와 서비스로 구성될 수 있습니다. GitLab 인스턴스와 이를 뒷받침하는 인프라(예: 사설 Maven 리포지터리)의 모든 요소는 로컬 네트워크 연결로 접근할 수 있다고 가정합니다. 인터넷에서 오는 모든 파일은 물리 매체(USB 드라이브, 하드 드라이브, 기록 가능한 DVD 등)를 통해 들어와야 한다고 가정합니다.
오프라인 스캐너 사용#
GitLab 스캐너는 보통 최신 시그니처, 규칙, 패치 세트를 내려받기 위해 인터넷에 연결합니다. 로컬 네트워크에서 사용할 수 있는 리소스로 도구가 올바르게 동작하도록 구성하려면 몇 가지 추가 단계가 필요합니다.
컨테이너 레지스트리 및 패키지 리포지터리#
큰 틀에서 보안 분석기는 Docker 이미지로 제공되며 여러 패키지 리포지터리를 활용할 수 있습니다. 인터넷에 연결된 GitLab 설치에서 job을 실행하면, GitLab은 GitLab.com에서 호스팅하는 컨테이너 레지스트리를 확인해 이 Docker 이미지의 최신 버전을 사용하고 있는지 검사하며, 필요한 의존성을 설치하기 위해 패키지 리포지터리에 연결하기도 합니다.
오프라인 환경에서는 GitLab.com에 질의하지 않도록 이러한 검사를 비활성화해야 합니다. GitLab.com 레지스트리와 리포지터리를 사용할 수 없으므로, 각 스캐너가 내부에서 호스팅하는 다른 레지스트리를 참조하도록 수정하거나 개별 스캐너 이미지에 접근할 수 있게 해야 합니다.
또한 npm, yarn, Ruby gem처럼 GitLab.com에서 호스팅하지 않는 일반 패키지 리포지터리에 애플리케이션이 접근할 수 있어야 합니다. 이러한 리포지터리의 패키지는 네트워크에 일시적으로 연결하거나, 오프라인 네트워크 안에 패키지를 미러링해 확보할 수 있습니다.
취약점과 상호 작용#
취약점이 발견되면 해당 취약점을 처리할 수 있습니다. 자세한 내용은 취약점 해결을 참고합니다.
보고된 취약점이 UI에 노출되는 외부 링크를 포함한 메타데이터를 제공하는 경우도 있습니다. 이러한 링크는 오프라인 환경에서 접근하지 못할 수 있습니다.
취약점 해결#
취약점 해결 기능은 오프라인 의존성 스캐닝과 컨테이너 스캐닝에서 사용할 수 있지만, 인스턴스 구성에 따라 동작하지 않을 수 있습니다. GitLab은 해당 의존성이나 이미지의 최신 버전을 호스팅하는 최신 레지스트리 서비스에 접근할 수 있을 때만 해결 방안(대체로 더 최신의 패치된 버전)을 제안할 수 있습니다.
스캐너 서명 및 규칙 업데이트#
인터넷에 연결된 상태에서 일부 스캐너는 검사에 사용할 최신 시그니처와 규칙 세트를 얻기 위해 공개 데이터베이스를 참조합니다. 연결이 없으면 이 방식은 불가능합니다. 따라서 스캐너에 따라 자동 업데이트 확인을 비활성화하고, 스캐너에 함께 제공된 데이터베이스를 사용하면서 직접 업데이트하거나, 네트워크 안에서 호스팅하는 자체 사본에 접근할 수 있게 해야 합니다.
특정 스캐너 지침#
개별 스캐너는 앞서 설명한 단계와 조금씩 다를 수 있습니다. 자세한 내용은 아래 각 페이지에서 확인할 수 있습니다.
- 컨테이너 스캐닝 오프라인 지침
- SAST 오프라인 지침
- 시크릿 탐지 오프라인 지침
- DAST 오프라인 지침
- API 퍼징 오프라인 지침
- 라이선스 스캐닝 오프라인 지침
- 의존성 스캐닝 오프라인 지침
- IaC 스캐닝 오프라인 지침
패키지 메타데이터 데이터베이스#
의존성 스캐닝과 지속적 취약점 스캐닝은 라이선스, 권고, 취약점 위험 평가 데이터를 위해 패키지 메타데이터 데이터베이스를 읽습니다. 이 데이터베이스는 분석기 이미지가 아니라 데이터 아티팩트이므로, 분석기 이미지를 로드해도 함께 제공되지 않습니다. 오프라인 인스턴스는 내보낸 데이터를 복사해 오기 전까지 이 데이터를 전혀 갖고 있지 않습니다.
데이터베이스에 포함된 내용과 GitLab 버전별로 지원되는 데이터 형식 버전에 대한 정보는 패키지 메타데이터 데이터베이스를 참고합니다.
오프라인 호스트에 Docker 이미지 로딩#
보안 스캔과 Auto DevOps를 비롯한 여러 GitLab 기능을 사용하려면 러너가 관련 Docker 이미지를 가져올 수 있어야 합니다.
공개 인터넷에 직접 접근하지 않고 이러한 이미지를 사용할 수 있게 하려면, 이미지를 내려받은 다음 패키징해 오프라인 호스트로 전송합니다. 전송 절차의 예시는 다음과 같습니다.
- 공개 인터넷에서 Docker 이미지를 내려받습니다.
- Docker 이미지를 tar 아카이브로 패키징합니다.
- 이미지를 오프라인 환경으로 전송합니다.
- 전송한 이미지를 오프라인 Docker 레지스트리에 로드합니다.
공식 GitLab 템플릿 사용#
GitLab은 이 과정을 쉽게 처리할 수 있도록 벤더 제공 템플릿을 제공합니다.
이 템플릿은 다음 내용을 담은 .gitlab-ci.yml 파일과 함께 비어 있는 새 프로젝트에서 사용합니다.
include:
- template: Security/Secure-Binaries.gitlab-ci.yml
이 파이프라인은 보안 스캐너에 필요한 Docker 이미지를 내려받아
job 아티팩트로 저장하거나, 파이프라인이 실행되는 프로젝트의
컨테이너 레지스트리로 푸시합니다. 이 아카이브는 다른 위치로 전송해
Docker 데몬에서 로드할 수 있습니다.
이 방법에는 gitlab.com(registry.gitlab.com 포함)과 로컬 오프라인 인스턴스 양쪽에
접근할 수 있는 러너가 필요합니다. 이 러너는 job 안에서 docker 명령을 사용할 수 있도록
특권 모드로
실행해야 합니다. 이 러너는 DMZ나 배스천 호스트에 설치해 이 프로젝트에만
사용할 수 있습니다.
이 템플릿에는 컨테이너 스캐닝 분석기에 대한 업데이트가 포함되지 않습니다. 컨테이너 스캐닝 오프라인 지침을 참고합니다.
업데이트 예약#
기본적으로 이 프로젝트의 파이프라인은 .gitlab-ci.yml 이 리포지터리에 추가될 때 한 번만
실행됩니다. GitLab 보안 스캐너와 시그니처를 업데이트하려면 이 파이프라인을 주기적으로
실행해야 합니다. GitLab은 파이프라인 예약 기능을 제공합니다.
예를 들어 매주 Docker 이미지를 내려받아 저장하도록 설정할 수 있습니다.
생성된 보안 번들 사용#
Secure-Binaries.gitlab-ci.yml 템플릿을 사용하는 프로젝트에는 이제 GitLab 보안 기능을 실행하는 데
필요한 이미지와 리소스가 모두 호스팅됩니다.
다음으로 오프라인 인스턴스가 GitLab.com의 기본 리소스 대신 이 리소스를 사용하도록 지정해야
합니다. 이를 위해 CI/CD 변수 SECURE_ANALYZERS_PREFIX에 해당 프로젝트
컨테이너 레지스트리의 URL을 설정합니다.
이 변수는 프로젝트의 .gitlab-ci.yml에 설정하거나
프로젝트 또는 그룹의 GitLab UI에서 설정할 수 있습니다. 자세한 내용은 GitLab CI/CD 변수 페이지를
참고합니다.
변수#
다음 표는 Secure-Binaries.gitlab-ci.yml 템플릿에서 사용할 수 있는 CI/CD 변수를
보여 줍니다.
| CI/CD 변수 | 설명 | 기본값 |
|---|---|---|
SECURE_BINARIES_ANALYZERS |
내려받을 분석기의 쉼표로 구분된 목록 | "bandit, brakeman, gosec, ..." |
SECURE_BINARIES_DOWNLOAD_IMAGES |
job을 비활성화하는 데 사용 | "true" |
SECURE_BINARIES_PUSH_IMAGES |
프로젝트 레지스트리에 파일 푸시 | "true" |
SECURE_BINARIES_SAVE_ARTIFACTS |
이미지 아카이브를 아티팩트로도 저장 | "false" |
SECURE_BINARIES_ANALYZER_VERSION |
기본 분석기 버전(Docker 태그) | "2" |
공식 템플릿 없는 대안 방법#
앞의 방법을 사용할 수 없다면 이미지를 수동으로 전송할 수도 있습니다.
이미지 패키저 스크립트 예시#
#!/bin/bash
set -ux
# Specify needed analyzer images
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
# Specify needed analyzer images
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를 실행하기 전에 공식 GitLab 템플릿 사용의 단계를 따라 해당 컨테이너 이미지를 로컬 컨테이너 레지스트리에 로드합니다.
-
AutoDevOps가 올바른 위치에서 이미지를 찾도록 CI/CD 변수를 설정합니다. AutoDevOps 템플릿은 분석기 이미지의 위치를 확인하기 위해
SECURE_ANALYZERS_PREFIX변수를 활용합니다. 자세한 내용은 생성된 보안 번들 사용을 참고합니다. 분석기 이미지를 로드한 위치에 맞는 값으로 이 변수를 설정합니다. 프로젝트 CI/CD 변수로 설정하거나.gitlab-ci.yml파일을 직접 수정하는 방법을 고려할 수 있습니다.
이 단계를 마치면 GitLab이 Secure 분석기의 로컬 사본을 갖추고, 인터넷에서 호스팅되는 컨테이너 이미지 대신 이를 사용하도록 설정됩니다. 이로써 오프라인 환경에서도 AutoDevOps로 Secure를 실행할 수 있습니다.
이 단계는 AutoDevOps와 함께 사용하는 GitLab Secure에 한정됩니다. AutoDevOps에서 다른 Stage를 사용하려면 Auto DevOps 문서에 설명된 다른 단계가 필요할 수 있습니다.