원격 실행 환경 샌드박스
실행 환경 샌드박스는 애플리케이션 수준의 네트워크 및 파일시스템 격리를 제공하여 GitLab Duo Agent Platform 원격 플로우를 무단 네트워크 접근 및 데이터 유출로부터 보호하는 데 도움이 됩니다. 실행 환경 샌드박스는 Anthropic Sandbox Runtime (SRT)이 설치된 호환 Docker 이미지를 사용할 때 자동으로 적용됩니다.
히스토리
- GitLab 18.7에서
ai_duo_agent_platform_network_firewall및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 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의 설치 단계를 보여줍니다:
# 캐시 삭제 및 검증과 함께 srt 샌드박싱 설치
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":["/opt/.gitlab-sandbox"],"allowGitConfig":true}}' > /opt/.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. - 쓰기 제한:
/opt/.gitlab-sandbox(샌드박스 설정과 같은 플랫폼 내부 파일에 사용). - Git 구성 접근: 허용됨.
네트워크 정책 구성#
SRT는 GitLab에서 제공하는 기본 Docker 이미지에 포함되어 있습니다. 커스텀 이미지에 SRT를 설치할 수도 있습니다.
SRT가 설치된 경우 플로우는 기본적으로 다음 도메인에만 접근할 수 있습니다. 이 도메인들은 항상 허용되며 제거할 수 없습니다:
localhosthost.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 # 기본값: false
allow_all_unix_sockets: true # 기본값: false
allowed_domains:
- my-own-site.com
denied_domains:
- malicious.com
Unix 소켓 접근 허용#
allow_all_unix_sockets 설정을 사용하여 플로우가 호스트의 모든 Unix 도메인 소켓에 접근할 수 있도록 합니다. 기본적으로 비활성화되어 있습니다.
allow_all_unix_sockets를 활성화하면 모든 Unix 소켓에 대한 접근이 허용됩니다. 필요한 경우에만 신뢰할 수 있는 환경에서만 활성화하세요.
인스턴스 또는 그룹에 대한 네트워크 액세스 제어 구성#
History
-
GitLab 18.11에서
dap_instance_network_access_controls및dap_group_network_access_controls라는 기능 플래그와 함께 도입. 기본적으로 비활성화됨.이 기능의 가용성은 기능 플래그로 제어됩니다. 자세한 내용은 이력을 참조합니다. 이 기능은 테스트용으로 사용할 수 있지만 프로덕션 사용 준비가 되지 않았습니다.
프로젝트 수준
agent-config.yml설정 외에도 관리자 및 최상위 그룹 소유자는 GitLab UI를 통해 네트워크 액세스 제어를 관리할 수 있습니다. 이 설정은 인스턴스 수준(GitLab Self-Managed) 또는 최상위 그룹 수준(GitLab.com)에 저장되며 하위의 모든 프로젝트에 상속됩니다.
이러한 설정이 프로젝트 수준 agent-config.yml과 어떻게 결합되는지에 대한 설명은
관리자 네트워크 정책 제어를 참조하세요.
인스턴스 수준 네트워크 액세스 제어 구성#
전제 조건:
- 관리자여야 합니다.
인스턴스 수준 네트워크 액세스 제어를 구성하려면:
-
오른쪽 상단에서 관리자를 선택합니다.
-
왼쪽 사이드바에서 GitLab Duo를 선택합니다.
-
구성 변경을 선택합니다.
-
데이터 및 개인 정보, 네트워크 액세스 섹션에서 다음 설정을 구성합니다:
허용 목록에 권장 도메인 포함: 활성화하면 일반적으로 필요한 도메인의 엄선된 목록이 허용 목록에 자동으로 포함됩니다.
-
모든 Unix 소켓 허용: 활성화하면 에이전트 플랫폼 작업에 대한 모든 Unix 소켓 연결이 허용됩니다.
-
프로젝트가 네트워크 샌드박스 설정을 확장하도록 허용: 활성화하면 프로젝트 메인테이너가
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.comwww.github.comapi.github.comnpm.pkg.github.comraw.githubusercontent.compkg-npm.githubusercontent.comobjects.githubusercontent.comcodeload.github.comavatars.githubusercontent.comcamo.githubusercontent.comgist.github.comgitlab.comwww.gitlab.comregistry.gitlab.combitbucket.orgwww.bitbucket.orgapi.bitbucket.orgregistry-1.docker.ioauth.docker.ioindex.docker.iohub.docker.comwww.docker.comproduction.cloudflare.docker.comdownload.docker.comgcr.io*.gcr.ioghcr.iomcr.microsoft.com*.data.mcr.microsoft.compublic.ecr.awscloud.google.comaccounts.google.comgcloud.google.comstorage.googleapis.comcompute.googleapis.comcontainer.googleapis.comartifactregistry.googleapis.comcloudresourcemanager.googleapis.comoauth2.googleapis.comwww.googleapis.comlogin.microsoftonline.compackages.microsoft.comdotnet.microsoft.comdot.netdev.azure.coms3.amazonaws.com*.s3.amazonaws.com*.codeartifact.amazonaws.com*.s3.api.aws*.codeartifact.api.awsdownload.oracle.comyum.oracle.comregistry.npmjs.orgwww.npmjs.comwww.npmjs.orgnpmjs.comnpmjs.orgyarnpkg.comregistry.yarnpkg.compypi.orgwww.pypi.orgfiles.pythonhosted.orgpythonhosted.orgtest.pypi.orgpypi.python.orgpypa.iowww.pypa.iorubygems.orgwww.rubygems.orgapi.rubygems.orgindex.rubygems.orgruby-lang.orgwww.ruby-lang.orgrubyonrails.orgwww.rubyonrails.orgrvm.ioget.rvm.iocrates.iowww.crates.ioindex.crates.iostatic.crates.iorustup.rsstatic.rust-lang.orgwww.rust-lang.orgproxy.golang.orgsum.golang.orgindex.golang.orggolang.orgwww.golang.orggoproxy.iopkg.go.devmaven.orgrepo.maven.orgcentral.maven.orgrepo1.maven.orgjcenter.bintray.comgradle.orgwww.gradle.orgservices.gradle.orgplugins.gradle.orgkotlin.orgwww.kotlin.orgspring.iorepo.spring.iopackagist.orgwww.packagist.orgrepo.packagist.orgnuget.orgwww.nuget.orgapi.nuget.orgpub.devapi.pub.devhex.pmwww.hex.pmcpan.orgwww.cpan.orgmetacpan.orgwww.metacpan.orgapi.metacpan.orgcocoapods.orgwww.cocoapods.orgcdn.cocoapods.orghaskell.orgwww.haskell.orghackage.haskell.orgswift.orgwww.swift.orgarchive.ubuntu.comsecurity.ubuntu.comubuntu.comwww.ubuntu.com*.ubuntu.comppa.launchpad.netlaunchpad.netwww.launchpad.netdl.k8s.iopkgs.k8s.iok8s.iowww.k8s.ioreleases.hashicorp.comapt.releases.hashicorp.comrpm.releases.hashicorp.comarchive.releases.hashicorp.comhashicorp.comwww.hashicorp.comrepo.anaconda.comconda.anaconda.organaconda.orgwww.anaconda.comanaconda.comcontinuum.ioapache.orgwww.apache.orgarchive.apache.orgdownloads.apache.orgeclipse.orgwww.eclipse.orgdownload.eclipse.orgnodejs.orgwww.nodejs.orgsourceforge.net*.sourceforge.netpackagecloud.io*.packagecloud.iojson-schema.orgwww.json-schema.orgjson.schemastore.orgwww.schemastore.org*.modelcontextprotocol.io
경고 및 폴백 동작#
샌드박싱을 사용할 수 없거나 적용할 수 없는 경우:
- 플로우가 샌드박스 보호 없이 직접 실행됩니다.
- 러너 구성 지침 링크가 포함된 경고 메시지가 CI 작업 로그에 표시됩니다.
이렇게 하면 샌드박싱을 활성화할 수 없는 경우에도 플로우가 계속 실행되는 동시에 상황을 알릴 수 있습니다.
