오프라인 환경

Tier: Free, Premium, Ultimate Offering: Self-managed
note
오프라인 환경을 설정하려면 구매 전에 클라우드 라이선스의 옵트아웃 면제를 받아야 합니다. 자세한 내용은 GitLab 영업 담당자에게 문의하십시오.

인터넷에 연결되지 않은 상태에서 대부분의 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 gems 등)에 접근할 수 있도록 해야 합니다. 이러한 저장소의 패키지는 일시적으로 네트워크에 연결하거나 패키지를 자신의 오프라인 네트워크 내에서 미러링하여 얻을 수 있습니다.

취약점과 상호 작용하기

취약점이 발견되면 그와 상호 작용할 수 있습니다. 취약점을 해결하는 방법에 대해 자세히 알아보세요.

일부 경우, 보고된 취약점은 UI에 표시되는 외부 링크를 포함할 수 있는 메타데이터를 제공합니다. 이러한 링크는 오프라인 환경에서는 접근할 수 없을 수 있습니다.

취약점 해결하기

취약점 해결하기 기능은 오프라인 종속성 스캐닝 및 컨테이너 스캐닝에 대해 사용할 수 있지만, 인스턴스의 구성에 따라 작동하지 않을 수 있습니다. 우리는 일반적으로 더 최신의 패치된 버전과 같은 솔루션만 제안할 수 있으며, 이는 최신 버전의 종속성이나 이미지를 호스팅하는 최신 레지스트리 서비스에 접근할 수 있을 때 가능합니다.

스캐너 서명 및 규칙 업데이트

인터넷에 연결되어 있는 경우 일부 스캐너는 최신 서명 및 규칙 세트를 확인하기 위해 공용 데이터베이스를 참조합니다. 연결이 없는 경우에는 이 작업이 불가능합니다. 따라서 스캐너에 따라 이러한 자동 업데이트 확인을 비활성화하고 제공된 데이터베이스를 사용하여 수동으로 업데이트하거나 네트워크 내에 호스팅된 복사본에 대한 액세스를 제공해야 합니다.

특정 스캐너 지침

각 개별 스캐너는 위에 설명된 단계와 약간 다를 수 있습니다. 아래의 각 페이지에서 더 많은 정보를 찾을 수 있습니다:

오프라인 호스트에 도커 이미지 로딩

보안 스캔 및 Auto DevOps를 포함한 많은 GitLab 기능을 사용하려면 러너가 관련 도커 이미지를 가져올 수 있어야 합니다.

공용 인터넷에 직접 액세스하지 않고 이러한 이미지를 사용할 수 있게 하는 과정은 이미지를 다운로드한 다음 패키징하고 오프라인 호스트로 전송하는 것입니다. 다음은 그러한 전송의 예입니다:

  1. 공용 인터넷에서 도커 이미지를 다운로드합니다.

  2. 도커 이미지를 tar 아카이브로 패키징합니다.

  3. 오프라인 환경으로 이미지를 전송합니다.

  4. 전송된 이미지를 오프라인 도커 레지스트리에 로드합니다.

공식 GitLab 템플릿 사용하기

GitLab은 이 프로세스를 용이하게 하기 위해 vendored template를 제공합니다.

이 템플릿은 새롭고 빈 프로젝트에서 사용해야 하며, .gitlab-ci.yml 파일에는 다음 내용이 포함되어야 합니다:

include:
  - template: Security/Secure-Binaries.gitlab-ci.yml

파이프라인은 보안 스캐너에 필요한 도커 이미지를 다운로드하고 이를 작업 아티팩트로 저장하거나 파이프라인이 실행되는 프로젝트의 컨테이너 레지스트리에 푸시합니다. 이 아카이브는 다른 위치로 전송되고 로드될 수 있습니다.

이 방법은 gitlab.com(포함 registry.gitlab.com)과 로컬 오프라인 인스턴스 모두에 대한 액세스가 있는 러너가 필요합니다. 이 러너는 작업 내에서 docker 명령을 사용할 수 있도록 privileged mode로 실행해야 합니다. 이 러너는 DMZ에 설치되거나 방화벽을 통해 특정 프로젝트만 사용할 수 있습니다.

경고: 이 템플릿에는 컨테이너 스캐닝 분석기에 대한 업데이트가 포함되어 있지 않습니다. 컨테이너 스캐닝 오프라인 지침을 참조하십시오.

업데이트 예약

기본적으로 이 프로젝트의 파이프라인은 .gitlab-ci.yml 파일이 리포지토리에 추가될 때 한 번만 실행됩니다. GitLab 보안 스캐너 및 서명을 업데이트하려면 이 파이프라인을 정기적으로 실행해야 합니다. GitLab은 파이프라인 예약하는 방법을 제공합니다. 예를 들어, 매주 도커 이미지를 다운로드하여 저장하도록 설정할 수 있습니다.

생성된 보안 번들 사용하기

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, etc..."
SECURE_BINARIES_DOWNLOAD_IMAGES 작업 비활성화에 사용 "true"
SECURE_BINARIES_PUSH_IMAGES 파일을 프로젝트 레지스트리에 푸시 "true"
SECURE_BINARIES_SAVE_ARTIFACTS 이미지 아카이브를 아티팩트로 저장 "false"
SECURE_BINARIES_ANALYZER_VERSION 기본 분석기 버전 (Docker 태그) "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

오프라인 환경에서 GitLab Secure를 AutoDevOps와 함께 사용하기

GitLab AutoDevOps를 오프라인 환경에서 보안 스캔을 위해 사용할 수 있습니다. 그러나 먼저 다음 단계를 수행해야 합니다:

  1. 컨테이너 이미지를 로컬 레지스트리에 로드합니다. GitLab Secure는 다양한 스캔을 수행하기 위해 분석기 컨테이너 이미지를 활용합니다. 이러한 이미지는 AutoDevOps 실행의 일부로 사용 가능해야 합니다. AutoDevOps를 실행하기 전에 위 단계를 따라 로컬 컨테이너 레지스트리에 해당 컨테이너 이미지를 로드하세요.

  2. CI/CD 변수를 설정하여 AutoDevOps가 해당 이미지를 올바른 위치에서 찾도록 합니다. AutoDevOps 템플릿은 분석기 이미지의 위치를 식별하기 위해 SECURE_ANALYZERS_PREFIX 변수를 활용합니다. 이 변수는 생성된 보안 번들 사용하기 섹션에서 설명되었습니다. 분석기 이미지를 로드한 위치에 대한 올바른 값으로 이 변수를 설정해야 합니다. 프로젝트 CI/CD 변수로 설정하거나 .gitlab-ci.yml 파일을 직접 수정하는 것을 고려할 수 있습니다.

이 단계가 완료되면, GitLab은 Secure 분석기의 로컬 복사본을 보유하고 있으며 인터넷 호스팅 컨테이너 이미지 대신 이를 사용할 수 있도록 설정됩니다. 이를 통해 오프라인 환경에서 AutoDevOps에서 Secure를 실행할 수 있습니다.

이 단계는 GitLab Secure와 AutoDevOps에 특정한 것입니다. AutoDevOps와 다른 단계를 사용하는 경우 Auto DevOps 문서에 설명된 다른 단계를 요구할 수 있습니다.