오프라인 환경

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

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

이 문서는 오프라인 환경에서 작동하는 방법에 대해 설명합니다. 이 지침은 보안 방침(예: 방화벽 정책)이 적용된 자체 설치 환경에도 적용됩니다. GitLab은 이러한 환경을 _오프라인 환경_이라고 합니다. 기타 일반적으로 사용되는 이름으로는 다음과 같은 것들이 있습니다.

  • 오프라인 환경
  • 연결이 제한된 환경
  • 로컬 영역 네트워크(LAN) 환경
  • 내부망 환경

이러한 환경은 물리적 장벽이나 보안 정책(예: 방화벽)으로 인해 인터넷 접근이 제한되거나 방지됩니다. 이 지침은 물리적으로 연결되지 않은 네트워크를 대상으로 하지만 이러한 다양한 사용 사례에서도 적용될 수 있습니다.

오프라인 환경 정의

오프라인 환경에서 GitLab 인스턴스는 로컬 네트워크에서 통신할 수 있는 하나 이상의 서버 및 서비스일 수 있지만 인터넷 접근이 전혀 없거나 매우 제한적입니다. GitLab 인스턴스 및 지원 인프라(예: 프라이빗 메이븐 리포지터리) 내의 모든 내용은 로컬 네트워크 연결을 통해 접근할 수 있다고 가정합니다. 인터넷에서 파일을 받아야 하는 경우 물리적 매체(USB 드라이브, 하드 드라이브, 쓰기 가능한 DVD 등)를 통해 파일을 받아야 합니다.

개요

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

컨테이너 레지스트리 및 패키지 리포지터리

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

오프라인 환경에서는 GitLab.com에 쿼리하지 않도록 이러한 확인을 비활성화해야 합니다. GitLab.com 레지스트리와 리포지터리를 사용할 수 없기 때문에 각 스캐너를 업데이트하여 다른 내부 호스팅된 레지스트리를 참조하거나 각 스캐너 이미지에 액세스할 수 있도록 해야 합니다.

또한 npm, yarn, 또는 Ruby gem과 같은 GitLab.com에 호스팅되지 않은 일반 패키지 리포지터리에 앱에 액세스할 수 있어야 합니다. 이러한 리포지터리에서 패키지를 얻으려면 일시적으로 네트워크에 연결하거나 자체 오프라인 네트워크 내에서 패키지를 미러링해야 합니다.

취약점과 상호 작용

취약점을 발견한 경우 해당 취약점과 상호 작용할 수 있습니다. 취약점 해결 자세한 내용을 읽어보세요.

일부 경우 보고된 취약점은 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 이미지를 다운로드하고 작업 artefacts로 저장하거나 파이프라인이 실행된 프로젝트의 컨테이너 레지스트리에 푸시합니다. 이러한 아카이브는 다른 위치로 전송할 수 있으며 Docker 데몬에 로드할 수 있습니다. 이 방법은 gitlab.com (또한 registry.gitlab.com)과 로컬 오프라인 인스턴스에 모두 액세스할 수 있는 러너가 필요합니다. 이러한 러너는 권한 부여된 모드로 실행해야 하며 특정 프로젝트에서만 사용됩니다.

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

업데이트 예약하기

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

생성된 보안 번들 사용

Secure-Binaries.gitlab-ci.yml 템플릿을 사용하는 프로젝트에는 GitLab 보안 기능 실행에 필요한 모든 이미지와 리소스가 제공됩니다.

이제 기본 제공된 리소스 대신 오프라인 인스턴스에서 이러한 리소스를 사용하도록 설정해야 합니다. 이를 위해 프로젝트의 .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

이미지 로더 스크립트 예시

이 예시는 이미지를 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

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

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

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

  2. CI/CD 변수를 설정하여 AutoDevOps가 이미지를 올바른 위치에서 찾을 수 있도록 합니다. AutoDevOps 템플릿은 SECURE_ANALYZERS_PREFIX 변수를 활용하여 분석기 이미지의 위치를 식별합니다. 이 변수에 대한 자세한 내용은 앞에서 설명한 대로 보안 번들 사용하는 방법을 참조하세요. 이 변수를 로드한 위치에 대한 올바른 값으로 설정하십시오. 이를 프로젝트 CI/CD 변수로 설정하거나 .gitlab-ci.yml 파일을 직접 수정함으로써 이를 수행할 수 있습니다.

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

이러한 단계는 GitLab Secure의 AutoDevOps와 관련이 있습니다. AutoDevOps의 다른 단계를 사용하는 경우 Auto DevOps 문서에서 다루는 다른 단계를 수행해야 할 수 있습니다.