Docker 소켓 예외 및 고급 설정 구성
Docker 소켓 예외 및 고급 설정 구성 (Configure Docker socket exceptions and advanced settings)
ECI에서 신뢰할 수 있는 도구가 보안을 유지하면서 Docker 소켓에 접근하도록 예외를 구성하는 방법을 배워볼게요.
출처: 문서
본문
이 페이지는 Enhanced Container Isolation(ECI)에 대한 Docker 소켓 예외와 기타 고급 설정을 구성하는 방법을 보여줘요. 이러한 구성은 Testcontainers 같은 신뢰할 수 있는 도구가 보안을 유지하면서 ECI와 함께 작동하게 해줘요.
Docker 소켓 마운트 권한
기본적으로 Enhanced Container Isolation은 Docker Engine에 대한 악성 접근을 방지하기 위해 컨테이너가 Docker 소켓을 마운트하지 못하게 차단해요. 그러나 일부 도구는 Docker 소켓 접근이 필요해요. Docker 소켓 접근이 필요한 일반적인 시나리오는 다음과 같아요:
- 테스트 프레임워크: 테스트 컨테이너를 관리하는 Testcontainers
- 빌드 도구: 임시 빌드 컨테이너를 만드는 Paketo buildpacks
- CI/CD 도구: 배포 파이프라인의 일부로 컨테이너를 관리하는 도구
- 개발 유틸리티: 컨테이너 관리용 Docker CLI 컨테이너
소켓 예외 구성
Settings Management를 사용해 Docker 소켓 예외를 구성해요.
Docker Home
- Docker Home에 로그인하고 왼쪽 위 계정 드롭다운에서 조직을 선택해요.
- Docker Desktop, 다음 Settings Management 를 선택해요.
- 설정 정책을 만들거나 편집해요.
- Enhanced Container Isolation 설정을 찾아요.
- 신뢰할 수 있는 이미지와 명령 제한으로 Docker 소켓 접근 제어를 구성해요.
JSON 파일
admin-settings.json 파일을 만들고 다음을 추가해요:
{
"configurationFileVersion": 2,
"enhancedContainerIsolation": {
"locked": true,
"value": true,
"dockerSocketMount": {
"imageList": {
"images": [
"docker.io/localstack/localstack:*",
"docker.io/testcontainers/ryuk:*",
"docker:cli"
],
"allowDerivedImages": true
},
"commandList": {
"type": "deny",
"commands": ["push", "build"]
}
}
}
}
이미지 허용 목록 구성
imageList는 Docker 소켓을 마운트할 수 있는 컨테이너 이미지를 정의해요.
이미지 참조 형식
| 형식 | 설명 |
|---|---|
<image_name>[:] |
선택적 태그가 있는 이미지 이름. 태그를 생략하면 :latest 태그가 사용됨. 태그가 와일드카드 *이면 "해당 이미지의 모든 태그"를 의미함 |
<image_name>@ |
특정 저장소 digest가 있는 이미지 이름 (예: docker buildx imagetools inspect가 보고한 대로). 이름과 digest가 일치하는 이미지만 허용함 |
예시 구성
테스트 도구용 기본 허용 목록:
"imageList": {
"images": [
"docker.io/testcontainers/ryuk:*",
"docker:cli",
"alpine:latest"
]
}
와일드카드 허용 목록 (Docker Desktop 4.36 이상):
"imageList": {
"images": ["*"]
}
경고:
"*"를 사용하면 모든 컨테이너가 Docker 소켓을 마운트할 수 있어 보안이 약화돼요. 허용 이미지를 명시적으로 나열하는 것이 실용적이지 않을 때만 사용해요.
보안 검증
Docker Desktop은 허용 이미지를 검증해요:
- 허용 이미지에 대한 이미지 digest를 레지스트리에서 다운로드
- 컨테이너 시작 시 컨테이너 이미지 digest를 허용 목록과 비교
- 허용 이미지와 digest가 일치하지 않는 컨테이너를 차단
이렇게 하면 승인되지 않은 이미지를 다시 태그해 제한을 우회하는 것을 방지해요:
$ docker tag malicious-image docker:cli
$ docker run -v /var/run/docker.sock:/var/run/docker.sock docker:cli
# digest가 실제 docker:cli 이미지와 일치하지 않아 실패함
파생 이미지 지원
파생 이미지 요구 사항
- 로컬 이미지만: 파생 이미지는 원격 레지스트리에 존재하지 않아야 함
- 기본 이미지 사용 가능: 상위 이미지를 먼저 로컬로 풀해야 함
- 성능 영향: 검증을 위해 컨테이너 시작에 최대 1초 추가
- 버전 호환성: 전체 와일드카드 지원에는 Docker Desktop 4.36+ 필요
명령 제한
거부 목록 (권장)
지정된 명령을 차단하면서 다른 모든 명령을 허용:
"commandList": {
"type": "deny",
"commands": ["push", "build", "image*"]
}
허용 목록
다른 모든 명령을 차단하면서 지정된 명령만 허용:
"commandList": {
"type": "allow",
"commands": ["ps", "container*", "volume*"]
}
명령 와일드카드
| 와일드카드 | 차단/허용 |
|---|---|
"container\*" |
모든 "docker container ..." 명령 |
"image\*" |
모든 "docker image ..." 명령 |
"volume\*" |
모든 "docker volume ..." 명령 |
"network\*" |
모든 "docker network ..." 명령 |
"build\*" |
모든 "docker build ..." 명령 |
"system\*" |
모든 "docker system ..." 명령 |
명령 차단 예시
차단된 명령이 실행되면:
/ # docker push myimage
Error response from daemon: enhanced container isolation: docker command "/v1.43/images/myimage/push?tag=latest" is blocked; if you wish to allow it, configure the docker socket command list in the Docker Desktop settings.
일반적인 구성 예시
Testcontainers 설정
Java/Python 테스트를 위한 Testcontainers:
"dockerSocketMount": {
"imageList": {
"images": [
"docker.io/testcontainers/ryuk:*",
"testcontainers/*:*"
]
},
"commandList": {
"type": "deny",
"commands": ["push", "build"]
}
}
개발 환경
Docker-in-Docker 로컬 개발:
"dockerSocketMount": {
"imageList": {
"images": [
"docker:dind",
"docker:cli"
]
},
"commandList": {
"type": "deny",
"commands": ["system*"]
}
}
보안 권장 사항
이미지 허용 목록 모범 사례
- 제한적으로: 절대적으로 신뢰하고 필요한 이미지만 허용
- 와일드카드는 신중히: 태그 와일드카드(
*)는 편리하지만 특정 태그보다 안전하지 않음 - 정기 검토: 허용 목록을 주기적으로 검토·업데이트
- digest 고정: 중요한 환경에서 최대 보안을 위해 digest 참조 사용
명령 제한
- 기본적으로 거부로 시작:
push와build같은 위험한 명령을 차단하는 거부 목록으로 시작 - 최소 권한 원칙: 도구가 실제로 필요한 명령만 허용
- 사용 모니터링: 차단되고 있는 명령을 추적해 구성을 다듬어요
다음 단계
- Enhanced Container Isolation 제한 사항 을 검토해요.
- Enhanced Container Isolation FAQ 를 검토해요.