원격 실행 환경 샌드박스
GitLab v19.2GitLab 18.7에서 기능 플래그 ai_duo_agent_platform_network_firewall 활성화. GitLab 18.7에서 기능 플래그 ai_dap_executor_connects_over_ws 활성화.
히스토리
-
GitLab 18.7에서 기능 플래그
ai_duo_agent_platform_network_firewall활성화. -
GitLab 18.7에서 기능 플래그
ai_dap_executor_connects_over_ws활성화. -
GitLab 18.8에서 일반 공개.
-
GitLab 18.10에서
network_policy설정 도입. -
GitLab 18.11에서
allow_all_unix_sockets네트워크 정책 설정 도입. -
GitLab 18.11에서 인스턴스 수준 및 그룹 수준 네트워크 액세스 제어가
dap_instance_network_access_controls및dap_group_network_access_controls라는 기능 플래그와 함께 도입. 기본적으로 비활성화됨. -
GitLab 19.0에서 기능 플래그
dap_instance_network_access_controls및dap_group_network_access_controls활성화. -
19.2에서 기능 플래그
dap_group_network_access_controls제거.
실행 환경 샌드박스는 애플리케이션 수준의 네트워크 및 파일시스템 격리를 제공하여 GitLab Duo Agent Platform 원격 플로우를 무단 네트워크 접근 및 데이터 유출로부터 보호하는 데 도움이 됩니다. 데이터 유출 시도, 외부 소스에서 악성 코드 로딩, 합법적인 플로우 작업에 필요한 연결을 유지하면서 무단 데이터 수집을 방지하도록 설계되었습니다.
샌드박스가 적용되는 시점#
실행 환경 샌드박스는 Anthropic Sandbox Runtime (SRT)이 설치된 호환 Docker 이미지를 사용할 때 자동으로 적용됩니다. 여기에는 기본 GitLab Docker 이미지(릴리스 v0.0.6 이상)를 사용하거나 SRT가 설치된 커스텀 이미지를 사용하는 것이 포함됩니다.
샌드박스는 다음 경우에 활성화됩니다:
-
Anthropic Sandbox Runtime (SRT)이 Docker 이미지에서 사용 가능한 경우.
-
GitLab Duo Agent Platform 세션이 러너에서 실행 중인 경우(로컬 환경은 샌드박스화되지 않음).
기본 및 커스텀 이미지 구성 간의 CI/CD 변수 차이에 대한 정보는 플로우 실행 변수를 참조하세요.
사전 요구 사항#
실행 환경 샌드박스를 사용하려면 다음이 필요합니다:
-
프로젝트에서 GitLab Duo Agent Platform이 활성화됨.
-
권한 있는 러너 모드 활성화. 샌드박싱이 작동하는 데 필요합니다.
-
호환 Docker 이미지:
v0.0.6이상 버전의 기본 GitLab Docker 이미지이거나 Anthropic Sandbox Runtime (SRT)이 설치된 커스텀 이미지.
작동 방식#
실행 환경 샌드박스는 Anthropic Sandbox Runtime (SRT)를 사용하여 다음 보호 기능으로 플로우 실행을 래핑합니다:
-
네트워크 격리: 모든 네트워크 요청이 실행 환경을 떠나기 전에 가로채어 허용된 도메인 목록에 대해 유효성을 검사합니다.
-
파일시스템 제한: 특정 디렉터리에 대한 읽기 및 쓰기 접근을 제한하고 민감한 파일에 대한 접근을 차단합니다.
-
우아한 폴백: SRT를 사용할 수 없거나 필요한 운영 체제 권한이 없는 경우 플로우가 경고 메시지와 함께 직접 실행됩니다.
커스텀 이미지에 Anthropic Sandbox Runtime (SRT) 설치#
agent-config.yml을 사용한 커스텀 이미지를 사용하는 경우,
환경에 Anthropic SRT 버전 0.0.20 이상이 설치되어 있어야 합니다.
SRT는 @anthropic-ai/sandbox-runtime으로 npm을 통해 사용할 수 있습니다. 다음 예시는 Dockerfile의 설치 단계를 보여줍니다:
# Install srt sandboxing with cache clearing and verification
ARG SANDBOX_RUNTIME_VERSION=0.0.20
RUN npm cache clean --force && \
npm install -g @anthropic-ai/sandbox-runtime@${SANDBOX_RUNTIME_VERSION} && \
test -s "$(npm root -g)/@anthropic-ai/sandbox-runtime/package.json" && \
srt --version
런타임 시 러너는 SRT가 사용 가능하고 작동하는지 확인합니다:
$ if which srt > /dev/null; then
$ echo "SRT found, creating config..."
SRT found, creating config...
$ echo '{"network":{"allowedDomains":["host.docker.internal","localhost","gitlab.com","*.gitlab.com","duo-workflow-svc.runway.gitlab.net"],"deniedDomains":[],"allowAllUnixSockets":false},"filesystem":{"denyRead":["~/.ssh"],"allowWrite":["./","/tmp"],"denyWrite":["/var/tmp/.gitlab-sandbox"],"allowGitConfig":true}}' > /var/tmp/.gitlab-sandbox/srt-settings.json
$ echo "Testing SRT sandbox capabilities..."
Testing SRT sandbox capabilities...
런타임 중에 다음 오류가 발생할 수 있으며, 이는 SRT의 의존성을 사용할 수 없음을 나타낼 수 있습니다:
Warning: SRT found but can't create sandbox (insufficient privileges), running command directly
이를 해결하려면:
bash를 사용하여 다음 명령으로 이미지를 확인하세요:
docker run --rm -it <image>:<tag> /bin/bash
srt를 사용하세요:
srt ls
다음 오류가 표시되면 커스텀 이미지에 추가 의존성을 설치해야 합니다:
Error: Sandbox dependencies are not available on this system. Required: ripgrep (rg), bubblewrap (bwrap), and socat.
네트워크 및 파일시스템 제한#
실행 환경 샌드박스가 적용되면 다음 제한이 적용됩니다.
샌드박스 설정 구성#
agent-config.yml 파일을 사용하여 일부 샌드박스 설정을 구성하세요.
기본적으로 샌드박스는 다음 구성에 대한 접근을 허용합니다:
- 기본 허용 도메인. 자동으로 구성되며 변경하거나 업데이트할 수 없습니다.
환경 변수#
샌드박스 환경에서는 DAP 및 Git 작업 실행에 필요한 환경 변수와 파라미터만 접근 가능합니다.
파일시스템 구성#
샌드박스는 다음 파일시스템 제한을 적용합니다:
-
읽기 제한: SSH 키(
~/.ssh)가 차단됩니다. -
쓰기 허용: 현재 디렉터리(
./) 및/tmp. -
쓰기 제한:
/var/tmp/.gitlab-sandbox(샌드박스 설정과 같은 플랫폼 내부 파일에 사용). -
Git 구성 접근: 허용됨.
네트워크 정책 구성#
SRT는 GitLab에서 제공하는 기본 Docker 이미지에 포함되어 있습니다. 커스텀 이미지에 SRT를 설치할 수도 있습니다.
SRT가 설치된 경우 플로우는 기본적으로 다음 도메인에만 접근할 수 있습니다. 이 도메인들은 항상 허용되며 제거할 수 없습니다:
-
localhost -
host.docker.internal -
GitLab 인스턴스 도메인(예:
gitlab.com,*.gitlab.com) -
GitLab Duo Workflow Service 도메인
SRT 없이 커스텀 이미지를 사용하는 경우 네트워크 제한이 적용되지 않으며 플로우는 러너에서 접근 가능한 모든 도메인에 접근할 수 있습니다.
network_policy는 allowed_domains 또는 denied_domains에서 "*"를 허용하지 않습니다. SRT는
모든 네트워크 트래픽 켜기를 지원하지 않습니다. 그러나 와일드카드는 도메인의 일부로 허용됩니다.
예: "*.domain.com".
관리자 네트워크 정책 제어#
GitLab.com의 최상위 그룹 소유자 또는 GitLab Self-Managed의
인스턴스 관리자가 네트워크 액세스 제어를 구성하면 해당 설정이 모든 플로우의
기본 정책을 정의합니다. 프로젝트가 네트워크 샌드박스 설정을 확장하도록 허용
체크박스는 프로젝트 소유자가 agent-config.yml에서 설정을 구성할 때 어떤 설정이
적용되는지 결정합니다.
유연한 모드 (프로젝트가 네트워크 샌드박스 설정을 확장하도록 허용 활성화):
-
agent-config.yml의allowed_domains가 관리자 허용 목록과 병합됩니다. -
agent-config.yml의denied_domains가 관리자 거부 목록과 병합됩니다. -
agent-config.yml의include_recommended_allowed가 관리자 설정을 재정의합니다. -
agent-config.yml의allow_all_unix_sockets가 관리자 설정을 재정의합니다.
엄격한 모드 (프로젝트가 네트워크 샌드박스 설정을 확장하도록 허용 비활성화):
-
agent-config.yml의denied_domains가 관리자 거부 목록과 병합됩니다. -
include_recommended_allowed는 관리자가 활성화한 설정을 강화하기 위해false로만 설정할 수 있습니다. 관리자가 비활성화한 경우에는 효과가 없습니다. -
allow_all_unix_sockets는 관리자가 활성화한 설정을 강화하기 위해false로만 설정할 수 있습니다. 관리자가 비활성화한 경우에는 효과가 없습니다. -
agent-config.yml의allowed_domains는 무시됩니다.
프로젝트 수준 설정 구성#
추가 도메인을 허용하거나 거부하려면 agent-config.yml 파일에 network_policy를 추가하세요:
network_policy:
include_recommended_allowed: true # default: false
allow_all_unix_sockets: true # default: false
allowed_domains:
- my-own-site.com
denied_domains:
- malicious.com
Unix 소켓 접근 허용#
allow_all_unix_sockets 설정을 사용하여 플로우가 호스트의 모든 Unix 도메인 소켓에
접근할 수 있도록 합니다. 기본적으로 비활성화되어 있습니다.
allow_all_unix_sockets를 활성화하면 모든 Unix 소켓에 대한 접근이 허용됩니다. 필요한 경우에만 신뢰할 수 있는 환경에서만 활성화하세요.
인스턴스 또는 그룹에 대한 네트워크 액세스 제어 구성#
히스토리
프로젝트 수준 agent-config.yml 설정 외에도
관리자 및 최상위 그룹 소유자는 GitLab UI를 통해 네트워크 액세스 제어를 관리할 수 있습니다.
이 설정은 인스턴스 수준(GitLab Self-Managed) 또는 최상위 그룹 수준(GitLab.com)에 저장되며
하위의 모든 프로젝트에 상속됩니다.
이러한 설정이 프로젝트 수준 agent-config.yml과 어떻게 결합되는지에 대한 설명은
관리자 네트워크 정책 제어를 참조하세요.
인스턴스 수준 네트워크 액세스 제어 구성#
전제 조건:
- 관리자여야 합니다.
인스턴스 수준 네트워크 액세스 제어를 구성하려면:
-
오른쪽 상단에서 관리자를 선택합니다.
-
왼쪽 사이드바에서 GitLab Duo를 선택합니다.
-
구성 변경을 선택합니다.
-
데이터 및 개인 정보, 네트워크 액세스 섹션에서 다음 설정을 구성합니다:
허용 목록에 권장 도메인 포함: 권장 도메인의 엄선된 목록이 자동으로 허용 목록에 포함됩니다.
-
모든 Unix 소켓 허용: GitLab Duo Agent Platform 작업에 대해 모든 Unix 소켓이 허용됩니다.
-
프로젝트가 네트워크 샌드박스 설정을 확장하도록 허용: 프로젝트의 Maintainer 또는 Owner 권한을 가진 사용자가
agent-config.yml파일을 통해 권장 도메인을 포함하고 추가 도메인을 추가하며 모든 Unix 소켓을 허용할 수 있습니다. -
선택 사항. 허용 도메인 아래에서 허용 목록에서 도메인을 추가하거나 제거합니다. 차단 도메인 아래에서 거부 목록에서 도메인을 추가하거나 제거합니다.
-
변경 사항 저장을 선택합니다.
최상위 그룹 네트워크 액세스 제어 구성 (GitLab.com)#
전제 조건:
-
최상위 그룹에 대한 Owner 권한이 있어야 합니다.
-
그룹은 GitLab.com의 최상위 그룹이어야 합니다. 하위 그룹은 최상위 그룹의 설정을 상속합니다.
그룹 수준 네트워크 액세스 제어를 구성하려면:
-
상단 표시줄에서 검색 또는 이동을 선택하고 최상위 그룹을 찾습니다.
-
왼쪽 사이드바에서 설정, GitLab Duo를 선택합니다.
-
구성 변경을 선택합니다.
-
데이터 및 개인 정보, 네트워크 액세스 섹션에서 인스턴스 수준 네트워크 액세스 제어 구성에 설명된 것과 동일한 설정을 구성합니다.
-
변경 사항 저장을 선택합니다.
관련 API 리소스#
-
인스턴스 수준 불리언:
duoSettingsUpdateGraphQL 뮤테이션. -
그룹 수준 불리언: 그룹 속성 업데이트 REST API,
ai_settings_attributes파라미터 사용. -
도메인 허용 목록 및 거부 목록:
aiDomainSettingsInstanceUpdate및aiDomainSettingsNamespaceUpdateGraphQL 뮤테이션.
허용 도메인 켜기#
패키지 레지스트리 및 개발 도구에 사용되는 외부 도메인 세트에 대한 접근을 플로우에 부여하려면,
include_recommended_allowed 설정을 켭니다.
이 설정은 기본적으로 비활성화되어 있습니다(false). 켜려면 agent-config.yml 파일에서
include_recommended_allowed를 true로 설정합니다.
네트워크 액세스 제어가 엄격한 모드에서 활성화된 경우(프로젝트가 네트워크 샌드박스 설정을 확장하도록 허용 비활성화),
include_recommended_allowed만 비활성화할 수 있습니다. 관리자가 비활성화한 경우 true로 설정해도 효과가 없습니다.
include_recommended_allowed를 활성화하면 광범위한 외부 도메인으로의 네트워크 접근이 허용됩니다.
이러한 이그레스 엔드포인트는 환경에서 데이터를 유출하는 데 사용될 수 있습니다.
필요한 경우에만 신뢰할 수 있는 환경에서만 활성화하세요.
이 설정은 다음 도메인에 대한 접근을 허용합니다:
-
github.com -
www.github.com -
api.github.com -
npm.pkg.github.com -
raw.githubusercontent.com -
pkg-npm.githubusercontent.com -
objects.githubusercontent.com -
codeload.github.com -
avatars.githubusercontent.com -
camo.githubusercontent.com -
gist.github.com -
gitlab.com -
www.gitlab.com -
registry.gitlab.com -
bitbucket.org -
www.bitbucket.org -
api.bitbucket.org -
registry-1.docker.io -
auth.docker.io -
index.docker.io -
hub.docker.com -
www.docker.com -
production.cloudflare.docker.com -
download.docker.com -
gcr.io -
*.gcr.io -
ghcr.io -
mcr.microsoft.com -
*.data.mcr.microsoft.com -
public.ecr.aws -
cloud.google.com -
accounts.google.com -
gcloud.google.com -
storage.googleapis.com -
compute.googleapis.com -
container.googleapis.com -
artifactregistry.googleapis.com -
cloudresourcemanager.googleapis.com -
oauth2.googleapis.com -
www.googleapis.com -
login.microsoftonline.com -
packages.microsoft.com -
dotnet.microsoft.com -
dot.net -
dev.azure.com -
s3.amazonaws.com -
*.s3.amazonaws.com -
*.codeartifact.amazonaws.com -
*.s3.api.aws -
*.codeartifact.api.aws -
download.oracle.com -
yum.oracle.com -
registry.npmjs.org -
www.npmjs.com -
www.npmjs.org -
npmjs.com -
npmjs.org -
yarnpkg.com -
registry.yarnpkg.com -
pypi.org -
www.pypi.org -
files.pythonhosted.org -
pythonhosted.org -
test.pypi.org -
pypi.python.org -
pypa.io -
www.pypa.io -
rubygems.org -
www.rubygems.org -
api.rubygems.org -
index.rubygems.org -
ruby-lang.org -
www.ruby-lang.org -
rubyonrails.org -
www.rubyonrails.org -
rvm.io -
get.rvm.io -
crates.io -
www.crates.io -
index.crates.io -
static.crates.io -
rustup.rs -
static.rust-lang.org -
www.rust-lang.org -
proxy.golang.org -
sum.golang.org -
index.golang.org -
golang.org -
www.golang.org -
goproxy.io -
pkg.go.dev -
maven.org -
repo.maven.org -
central.maven.org -
repo1.maven.org -
jcenter.bintray.com -
gradle.org -
www.gradle.org -
services.gradle.org -
plugins.gradle.org -
kotlin.org -
www.kotlin.org -
spring.io -
repo.spring.io -
packagist.org -
www.packagist.org -
repo.packagist.org -
nuget.org -
www.nuget.org -
api.nuget.org -
pub.dev -
api.pub.dev -
hex.pm -
www.hex.pm -
cpan.org -
www.cpan.org -
metacpan.org -
www.metacpan.org -
api.metacpan.org -
cocoapods.org -
www.cocoapods.org -
cdn.cocoapods.org -
haskell.org -
www.haskell.org -
hackage.haskell.org -
swift.org -
www.swift.org -
archive.ubuntu.com -
security.ubuntu.com -
ubuntu.com -
www.ubuntu.com -
*.ubuntu.com -
ppa.launchpad.net -
launchpad.net -
www.launchpad.net -
dl.k8s.io -
pkgs.k8s.io -
k8s.io -
www.k8s.io -
releases.hashicorp.com -
apt.releases.hashicorp.com -
rpm.releases.hashicorp.com -
archive.releases.hashicorp.com -
hashicorp.com -
www.hashicorp.com -
repo.anaconda.com -
conda.anaconda.org -
anaconda.org -
www.anaconda.com -
anaconda.com -
continuum.io -
apache.org -
www.apache.org -
archive.apache.org -
downloads.apache.org -
eclipse.org -
www.eclipse.org -
download.eclipse.org -
nodejs.org -
www.nodejs.org -
sourceforge.net -
*.sourceforge.net -
packagecloud.io -
*.packagecloud.io -
json-schema.org -
www.json-schema.org -
json.schemastore.org -
www.schemastore.org -
*.modelcontextprotocol.io
경고 및 폴백 동작#
샌드박싱을 사용할 수 없거나 적용할 수 없는 경우:
-
플로우가 샌드박스 보호 없이 직접 실행됩니다.
-
러너 구성 지침 링크가 포함된 경고 메시지가 CI job 로그에 표시됩니다.
이렇게 하면 샌드박싱을 활성화할 수 없는 경우에도 플로우가 계속 실행되는 동시에 상황을 알릴 수 있습니다.