오프라인 환경

세부 정보: Tier: Free, Premium, Ultimate Offering: Self-managed

참고: 오프라인 환경을 설정하려면 구매 전 클라우드 라이선스의 선택 사항(exemption)을 받아야 합니다. 자세한 내용은 GitLab 영업 담당자에게 문의하십시오.

인터넷에 연결되지 않은 상태에서 대부분의 GitLab 보안 스캐너를 실행하는 것이 가능합니다.

본 문서에서는 오프라인 환경(예: 스캐너 유형)에서 보안 범주를 운영하는 방법에 대해 설명합니다. 이러한 지침은 보안이 강화된 오프라인 설치뿐만 아니라 보안 정책(예: 방화벽 정책)에 의해 완전히 또는 제한적으로 인터넷 액세스가 제한된 환경에도 적용됩니다. 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에서 노출된 외부 링크를 포함하는 메타데이터를 제공할 수 있습니다. 이러한 링크는 오프라인 환경에서 액세스할 수 없을 수도 있습니다.

취약점 해결

취약점 해결 기능은 오프라인 의존성 스캐닝 및 컨테이너 스캐닝을 위해 사용할 수 있지만, 인스턴스 구성에 따라 작동하지 않을 수 있습니다. 우리는 최신 버전을 적용된 패치, 즉 최신 버전을 호스팅하는 최신 레지스트리 서비스에 액세스할 수 있는 경우에만 제안할 수 있습니다.

스캐너 시그니처 및 규칙 업데이트

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

특정 스캐너 지침

각각의 스캐너마다 약간의 차이가 있을 수 있습니다. 각 페이지에서 더 많은 정보를 찾을 수 있습니다.

오프라인 호스트에 Docker 이미지 로드

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

공개 인터넷에 직접 액세스할 수 없는 경우 해당 이미지를 사용 가능하게 만들기 위한 과정은 이미지를 다운로드한 후 해당 이미지를 패키징하고 오프라인 호스트로 전송하는 것을 포함합니다. 아래는 이러한 전송의 예시입니다:

  1. 공개 인터넷에서 Docker 이미지를 다운로드합니다.
  2. Docker 이미지를 tar 아카이브로 패키지화합니다.
  3. 이미지를 오프라인 환경으로 전송합니다.
  4. 전송된 이미지를 오프라인 Docker 레지스트리에 로드합니다.

공식 GitLab 템플릿 사용

GitLab은 vendored template을 제공하여 이 프로세스를 쉽게 할 수 있습니다.

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

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

이 파이프라인은 보안 스캐너에 필요한 Docker 이미지를 다운로드하고 해당 이미지를 작업 아티팩트로 저장하거나 프로젝트의 컨테이너 레지스트리에 푸시합니다. 이러한 아카이브는 다른 위치로 전송될 수 있으며 로드될 수 있습니다. Docker 데몬에서 이 메서드를 사용하려면 gitlab.com (포함하여 registry.gitlab.com) 및 로컬 오프라인 인스턴스에 모두 액세스할 수 있는 러너가 필요합니다. 이 러너는 작업 내에서 docker 명령을 사용할 수 있도록 하기 위해 특권 모드에서 실행되어야 합니다. 이 러너는 DMZ에 설치하거나 특정 프로젝트에만 사용합니다.

경고: 이 템플릿에는 컨테이너 스캔 분석기의 업데이트가 포함되어 있지 않습니다. 오프라인 환경에서 컨테이너 스캔 실행을 참조하세요.

업데이트 예약

기본적으로 이 프로젝트의 파이프라인은 저장소에 .gitlab-ci.yml이 추가될 때 한 번만 실행됩니다. GitLab은 파이프라인 예약하는 방법을 제공합니다. 예를 들어, 매주 Docker 이미지를 다운로드하고 저장하도록 이를 설정할 수 있습니다.

생성된 보안 번들 사용

Secure-Binaries.gitlab-ci.yml 템플릿을 사용하는 프로젝트는 이제 GitLab 보안 기능을 실행하는 데 필요한 모든 필수 이미지 및 리소스를 호스팅해야 합니다.

다음으로 오프라인 인스턴스에 기본 default 리소스 대신 이러한 리소스를 사용하도록 알려야 합니다. 이를 위해 프로젝트의 .gitlab-ci.yml이나 GitLab UI에서 프로젝트 또는 그룹 수준에서 SECURE_ANALYZERS_PREFIX CI/CD 변수를 설정해야 합니다. 자세한 정보는 GitLab CI/CD 변수 페이지를 참조하세요.

변수

다음 표는 Secure-Binaries.gitlab-ci.yml 템플릿과 함께 사용할 수 있는 CI/CD 변수를 보여줍니다:

CI/CD variable Description Default value
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 기본 분석기 버전(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

이미지 로더 스크립트 예시

이 예시는 이미지를 bastion 호스트에서 오프라인 호스트로 로드합니다. 특정 구성에서는 이러한 전송을 위해 물리적 미디어가 필요할 수 있습니다:

#!/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를 사용하여 Secure 스캔을 수행할 수 있습니다. 그러나 먼저 다음 단계를 수행해야 합니다.

  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 문서에서 다루는 다른 단계가 필요할 수 있습니다.