오프라인 환경

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 gem과 같은 일반적인 패키지 리포지터리에 앱이 액세스할 수 있도록 보장해야 합니다. 이러한 리포지터리의 패키지는 일시적으로 네트워크에 연결하거나 자체 오프라인 네트워크 내에서 패키지를 미러링함으로써 획득할 수 있습니다.

취약점과 상호 작용

취약점을 찾으면 해당 취약점과 상호 작용할 수 있습니다. 자세한 내용은 취약점을 해결하는 방법을 확인하십시오.

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

취약점 해결

취약점 해결 기능은 오프라인 의존성 스캐닝 및 컨테이너 스캐닝에서 제공되지만 인스턴스 구성에 따라 작동하지 않을 수 있습니다. 최신 버전에 패치된 보다 최신 버전이 가장 많은 해결책이 되도록 제안할 수 있습니다. 이를 위해서는 최신 버전의 레지스트리 서비스에 액세스할 수 있을 때에만 이러한 서비스가 가능합니다.

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

인터넷에 연결된 상태에서 일부 스캐너는 최신 시그니처 및 규칙을 검사하기 위해 공개 데이터베이스를 참조합니다. 연결이 끊어진 경우 이것이 불가능합니다. 스캐너에 따라 이 자동 업데이트 확인을 비활성화하고 해당 데이터베이스를 매뉴얼으로 업데이트하거나 네트워크 내에서 호스팅된 자체 사본에 대한 액세스를 제공하여 이러한 작업을 수행해야 합니다.

특정 스캐너 지침

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

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

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

공개 인터넷에 직접 액세스할 수 없는 상태에서 이러한 이미지를 이용할 수 있도록 하는 프로세스는 이미지를 다운로드한 다음 패키지화하여 오프라인 호스트로 전송하는 것을 포함합니다. 다음은 그러한 전송의 예시입니다.

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

공식 GitLab 템플릿 사용

GitLab은 이 프로세스를 용이하게 하기 위해 장치된 템플릿을 제공합니다.

이 템플릿은 .gitlab-ci.yml 파일이 있는 새로운 빈 프로젝트에 사용되어야 합니다.

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

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

caution
이 템플릿에는 컨테이너 스캐닝 분석기를 위한 업데이트가 포함되어 있지 않습니다. 오프라인 환경에서 컨테이너 스캐닝 실행을 참조하십시오.

업데이트 일정 설정

기본적으로 이 프로젝트의 파이프라인은 .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를 사용할 수 있습니다. 그러나 먼저 이러한 단계를 수행해야 합니다:

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

  2. AutoDevOps가 해당 이미지를 올바른 위치에서 찾도록 CI/CD 변수를 설정합니다. AutoDevOps 템플릿은 SECURE_ANALYZERS_PREFIX 변수를 이용하여 분석기 이미지의 위치를 식별합니다. 이 변수에 올바른 값으로 설정하십시오. 프로젝트 CI/CD 변수를 사용하거나 .gitlab-ci.yml 파일을 직접 수정할 수 있습니다.

이러한 단계를 완료하면 GitLab에서 Secure 분석기의 로컬 사본이 생성되어 인터넷 호스팅된 컨테이너 이미지 대신에 사용할 준비가 되고 오프라인 환경에서 AutoDevOps에서 Secure를 실행할 수 있습니다.

이러한 단계는 GitLab Secure와 AutoDevOps에 특화되어 있습니다. AutoDevOps의 다른 단계를 사용하는 경우 Auto DevOps 문서에서 다루는 다른 단계가 필요할 수 있습니다.