Enhanced Container Isolation
Enhanced Container Isolation (ECI)
악성 컨테이너가 Docker Desktop이나 호스트 시스템을 침해하지 못하도록 자동으로 방지하는 ECI 기능을 배워볼게요.
출처: 문서
본문
Enhanced Container Isolation(ECI)은 악성 컨테이너가 Docker Desktop이나 호스트 시스템을 침해하지 못하도록 방지해요. 개발자 생산성과 워크플로우 호환성을 유지하면서 고급 보안 기법을 자동으로 적용해요.
- ECI는 컨테이너 격리를 강화하고 Registry Access Management 정책과 Settings Management 제어 같은 관리자가 만든 보안 구성을 잠근다.
- ECI는 축소된 Linux capabilities, seccomp, AppArmor 같은 다른 Docker 보안 기능과 함께 작동해요.
WSL2 백엔드를 사용한다면 WSL 버전 2.6 이상을 실행하고 있는지 확인해요. ECI가 최소 6.3.0 이상의 Linux 커널 버전에 의존하고 WSL 2.6+가 커널 버전 6.6을 포함하기 때문에 필요해요.
Enhanced Container Isolation을 사용해야 하는 사람?
ECI는 다음을 위해 설계됐어요:
- 컨테이너 기반 공격을 방지하고 개발자 환경에서 보안 취약점을 줄이려는 조직
- 개발자 워크플로우에 영향을 주지 않고 더 강한 컨테이너 격리가 필요한 보안 팀
- 신뢰할 수 없거나 타사 컨테이너 이미지를 실행할 때 추가 보호가 필요한 엔터프라이즈
Enhanced Container Isolation이 작동하는 방식
Docker는 표준 OCI runc 런타임의 보안 강화 버전인 Sysbox 컨테이너 런타임을 사용해 ECI를 구현해요. ECI를 켜면 docker run 또는 docker create로 만든 컨테이너가 개발자 워크플로우 변경 없이 runc 대신 자동으로 Sysbox를 사용해요. Docker의 기본 런타임은 runc로 유지되지만, 모든 사용자 컨테이너는 암묵적으로 Sysbox로 시작돼요.
ECI를 켜면 Docker CLI --runtime 플래그가 무시돼요. --privileged 플래그를 사용하는 컨테이너도 ECI로 안전하게 실행되어 Docker Desktop 가상 머신이나 다른 컨테이너를 침해하지 못해요.
주요 보안 기능
Linux 사용자 네임스페이스 격리
Enhanced Container Isolation을 사용하면 모든 컨테이너가 더 강한 격리를 위해 Linux 사용자 네임스페이스를 활용해요. 컨테이너 root 사용자는 Docker Desktop VM의 비특권(unprivileged) 사용자에 매핑돼요:
$ docker run -it --rm --name=first alpine
/ # cat /proc/self/uid_map
0 100000 65536
이 출력은 컨테이너 root(0)가 64K 사용자 ID 범위로 VM의 비특권 사용자 100000에 매핑됨을 보여줘요. 각 컨테이너는 고유한 매핑을 얻어요:
$ docker run -it --rm --name=second alpine
/ # cat /proc/self/uid_map
0 165536 65536
Enhanced Container Isolation 없이 컨테이너는 실제 root로 실행돼요:
$ docker run -it --rm alpine
/ # cat /proc/self/uid_map
0 0 4294967295
Linux 사용자 네임스페이스를 사용함으로써 ECI는 컨테이너 프로세스가 Linux VM에서 유효한 사용자 ID로 절대 실행되지 않게 보장해, 해당 기능(capabilities)을 컨테이너 내 리소스로만 제한해요.
보안 특권 컨테이너
docker run --privileged 특권 컨테이너는 Linux 커널에 대한 무제한 접근을 제공하므로 일반적으로 상당한 보안 위험을 초래해요. ECI가 켜지면 이런 특권 컨테이너도 Docker Desktop VM의 다른 리소스를 침해할 수 없도록 보안 버전으로 변환돼요.