오프라인 환경

Tier: Free, Premium, Ultimate Offering: Self-Managed

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

인터넷에 연결되지 않은 상태에서 대부분의 GitLab 보안 스캐너를 실행할 수 있습니다.

본 문서는 오프라인 환경에서 안전 범주(스캐너 유형)를 운영하는 방법에 대해 설명합니다. 이 지침은 또한 보안이 되어 있는 자체 설치나 보안 정책(예: 방화벽 정책)이 적용된 자체 설치, 또는 완전히 인터넷 액세스가 제한된 환경에도 적용됩니다. GitLab은 이러한 환경을 오프라인 환경이라고 합니다. 다른 흔히 사용되는 이름으로는 다음이 있습니다.

  • 미연결된 환경
  • 연결 제한된 환경
  • 로컬 영역 네트워크 (LAN) 환경
  • 내부 네트워크 환경

이러한 환경은 물리적 장벽이나 보안 정책(예: 방화벽)에 의해 인터넷 액세스가 제한 또는 방지되는 환경입니다. 본 지침은 물리적으로 연결이 끊긴 네트워크를 위해 설계되었지만, 다른 사용 사례에서도 사용할 수 있습니다.

오프라인 환경 정의

오프라인 환경에서 GitLab 인스턴스는 로컬 네트워크에서 통신할 수 있는 하나 이상의 서버 및 서비스일 수 있지만, 인터넷 액세스가 없거나 매우 제한적일 수 있습니다. GitLab 인스턴스 내부 및 지원 인프라(예: 개인 Maven 저장소)에서는 로컬 네트워크 연결을 통해 액세스할 수 있다고 가정합니다. 인터넷에서의 파일은 물리적인 매체(USB 드라이브, 하드 드라이브, 기록 가능한 DVD 등)를 통해 가져와야 한다고 가정합니다.

개요

GitLab 스캐너는 일반적으로 인터넷에 연결하여 최신 시그니처, 규칙 및 패치 세트를 다운로드합니다. 로컬 네트워크에서 사용할 수 있는 리소스를 활용하여 도구를 올바르게 구성하려면 몇 가지 추가 단계가 필요합니다.

컨테이너 레지스트리 및 패키지 저장소

높은 수준에서 보안 분석기는 Docker 이미지로 제공되며 다양한 패키지 저장소를 활용할 수 있습니다. 인터넷에 연결된 GitLab 설치에서 작업을 실행할 때 GitLab은 GitLab.com 호스팅 컨테이너 레지스트리를 확인하여 이러한 Docker 이미지의 최신 버전을 가지고 있는지 확인하고 필요한 종속성을 설치하기 위해 패키지 저장소에 연결할 수 있습니다.

오프라인 환경에서 이러한 확인을 비활성화해야 합니다. 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 템플릿을 제공합니다.

이 템플릿은 아래의 내용을 포함하는 .gitlab-ci.yml 파일을 가진 새로운 비어있는 프로젝트에서 사용해야 합니다.

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

파이프라인은 보안 스캐너에 필요한 Docker 이미지를 다운로드하고 작업 아티팩트로 저장하거나 프로젝트의 컨테이너 레지스트리에 푸시합니다. 이러한 아카이브를 다른 위치로 전송하고 로드할 수 있습니다. 이러한 방법은 gitlab.com (포함하여 registry.gitlab.com) 및 지역 오프라인 인스턴스에 모두 액세스할 수 있는 러너가 필요합니다. 이러한 러너는 특권 모드에서 실행되어야 하며, 이를 위해 프로젝트에 한정해 사용되는 DMZ 또는 보루에 설치된 특정 프로젝트에 대해서만 사용할 수 있습니다.

경고: 이 템플릿은 컨테이너 스캐닝 분석기에 대한 업데이트를 포함하지 않습니다. 오프라인 환경에서 컨테이너 스캐닝 방법을 참조하십시오.

업데이트 일정 설정

기본적으로 이 프로젝트의 파이프라인은 .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.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 작업 비활성화에 사용 "true"
SECURE_BINARIES_PUSH_IMAGES 파일을 프로젝트 레지스트리에 푸시 "true"
SECURE_BINARIES_SAVE_ARTIFACTS 이미지 아카이브도 저장 "false"
SECURE_BINARIES_ANALYZER_VERSION 기본 분석기 버전 (도커 태그) "2"

공식 템플릿을 사용하지 않는 대체 방법

위 방법을 따르지 못할 경우, 이미지를 수동으로 전송할 수 있습니다:

예제 이미지 패키지 스크립트

#!/bin/bash
set -ux

# 필요한 분석기 이미지 지정
분석기=${SAST_ANALYZERS:-"bandit eslint gosec"}
gitlab=registry.gitlab.com/security-products/

for i in "${분석기[@]}"
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

# 필요한 분석기 이미지 지정
분석기=${SAST_ANALYZERS:-"bandit eslint gosec"}
registry=$GITLAB_HOST:4567

for i in "${분석기[@]}"
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를 사용할 수 있습니다. 그러나 먼저 다음 단계를 수행해야 합니다:

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