오프라인 환경
인터넷에 연결되지 않은 경우 대부분의 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에서 노출된 외부 링크를 포함할 수 있는 메타데이터를 제공할 수 있습니다. 이러한 링크는 오프라인 환경에서 액세스할 수 없을 수 있습니다.
취약점 해결
취약점 해결 기능은 오프라인 의존성 스캔 및 컨테이너 스캔에서 사용할 수 있지만 인스턴스 구성에 따라 작동하지 않을 수 있습니다. 우리는 일반적으로 최신 버전을 제안할 수 있지만 해당 의존성 또는 이미지의 최신 버전을 호스팅하는 최신 레지스트리 서비스에 액세스할 수 있는 경우에만 제안할 수 있습니다.
스캐너 서명 및 규칙 업데이트
인터넷에 연결되어 있을 때 일부 스캐너는 최신 서명과 규칙 집합을 확인하기 위해 공개 데이터베이스를 참조합니다. 연결이 끊겨 있으면 이를 할 수 없습니다. 따라서 각 스캐너에 따라 이러한 자동 업데이트 확인을 비활성화하고 제공된 데이터베이스를 매뉴얼으로 업데이트하거나 오프라인 네트워크 내에서 호스팅된 복사본에 액세스할 수 있도록 해야 합니다.
특정 스캐너 지침
각 개별 스캐너는 위에서 설명한 단계와 약간 다를 수 있습니다. 아래 페이지에서 각각의 자세한 정보를 찾을 수 있습니다.
- 오프라인 환경에서 컨테이너 스캐닝 실행
- 오프라인 환경에서 SAST 실행
- 오프라인 환경에서 비밀 감지
- 오프라인 환경에서 DAST 실행
- API Fuzzing 오프라인 구성 지침
- 오프라인 환경에서 라이선스 스캐닝 실행
- 오프라인 환경에서 의존성 스캐닝 실행
오프라인 호스트에 Docker 이미지 로드
보안 스캔 및 Auto DevOps를 포함한 많은 GitLab 기능을 사용하려면 러너가 관련 Docker 이미지를 가져올 수 있어야 합니다.
공개 인터넷에 직접 액세스할 수 없는 경우 해당 이미지를 사용할 수 있게 만드는 과정은 이미지를 다운로드한 후 패키징하여 오프라인 호스트로 전송하는 과정을 포함합니다. 다음은 이러한 전송의 예입니다.
- 공개 인터넷에서 Docker 이미지를 다운로드합니다.
- Docker 이미지를 tar 아카이브로 패키징합니다.
- 이미지를 오프라인 환경으로 전송합니다.
- 전송된 이미지를 오프라인 Docker 레지스트리에 로드합니다.
공식 GitLab 템플릿 사용
GitLab은 템플릿 공급을 통해 이 프로세스를 간소화합니다.
이 템플릿은 .gitlab-ci.yml
파일을 포함하여 새로운 빈 프로젝트에 사용해야 합니다.
include:
- template: Security/Secure-Binaries.gitlab-ci.yml
파이프라인은 보안 스캐너에 필요한 Docker 이미지를 다운로드하고 작업 artefacts로 저장하거나 파이프라인이 실행된 프로젝트의 컨테이너 레지스트리에 푸시합니다. 이러한 아카이브는 다른 위치로 전송할 수 있으며 Docker 데몬에 로드할 수 있습니다. 이 방법은 gitlab.com
(또한 registry.gitlab.com
)과 로컬 오프라인 인스턴스에 모두 액세스할 수 있는 러너가 필요합니다. 이러한 러너는 권한 부여된 모드로 실행해야 하며 특정 프로젝트에서만 사용됩니다.
업데이트 예약하기
기본적으로 이 프로젝트의 파이프라인은 .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 스캔을 사용할 수 있습니다. 그러나 먼저 다음 단계를 수행해야 합니다:
-
컨테이너 이미지를 로컬 레지스트리에 로드합니다. GitLab Secure는 다양한 스캔을 수행하기 위해 분석기 컨테이너 이미지를 활용합니다. AutoDevOps를 실행하기 전에 위 단계를 따라서 이러한 컨테이너 이미지를 로컬 컨테이너 레지스트리에 로드하세요.
-
CI/CD 변수를 설정하여 AutoDevOps가 이미지를 올바른 위치에서 찾을 수 있도록 합니다. AutoDevOps 템플릿은
SECURE_ANALYZERS_PREFIX
변수를 활용하여 분석기 이미지의 위치를 식별합니다. 이 변수에 대한 자세한 내용은 앞에서 설명한 대로 보안 번들 사용하는 방법을 참조하세요. 이 변수를 로드한 위치에 대한 올바른 값으로 설정하십시오. 이를 프로젝트 CI/CD 변수로 설정하거나 .gitlab-ci.yml 파일을 직접 수정함으로써 이를 수행할 수 있습니다.
이러한 단계를 완료하면 GitLab은 Secure 분석기의 로컬 복사본을 보유하고 있으며 인터넷 호스팅된 컨테이너 이미지 대신 사용할 수 있도록 설정됩니다. 이를 통해 오프라인 환경에서 AutoDevOps에서 Secure를 실행할 수 있습니다.
이러한 단계는 GitLab Secure의 AutoDevOps와 관련이 있습니다. AutoDevOps의 다른 단계를 사용하는 경우 Auto DevOps 문서에서 다루는 다른 단계를 수행해야 할 수 있습니다.