
Docker가 새 컨테이너를 시작할 때 기본적으로 동일한 사용자 및 cgroup 네임스페이스를 사용하는 이유는 무엇입니까?
Docker가 새 사용자 네임스페이스를 설정하지 않아서 root
컨테이너와 root
호스트의 네임스페이스가 동일하지 않은 이유를 이해할 수 없습니다.
특히 cgroup을 제외한 다른 모든 항목은 네임스페이스로 지정되므로 기본적으로 컨테이너를 완전히 격리하지 않는 것은 실제로 의미가 없습니다.
Docker가 기본적으로 사용자 네임스페이스를 활성화하지 않는 이유를 누군가가 명확히 설명할 수 있습니까?
호스트 네임스페이스:
parallels@debian-gnu-linux-vm:~$ ls -la /proc/self/ns
total 0
dr-x--x--x 2 parallels parallels 0 Jan 30 17:29 .
dr-xr-xr-x 9 parallels parallels 0 Jan 30 17:29 ..
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 cgroup -> cgroup:[4026531835]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 ipc -> ipc:[4026531839]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 mnt -> mnt:[4026531840]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 net -> net:[4026531957]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 pid -> pid:[4026531836]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 user -> user:[4026531837]
lrwxrwxrwx 1 parallels parallels 0 Jan 30 17:29 uts -> uts:[4026531838]
컨테이너 네임스페이스:
docker run -ti --rm debian:latest
root@210189a7a164:/# ls -la /proc/self/ns
total 0
dr-x--x--x 2 root root 0 Jan 30 16:30 .
dr-xr-xr-x 9 root root 0 Jan 30 16:30 ..
lrwxrwxrwx 1 root root 0 Jan 30 16:30 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 ipc -> 'ipc:[4026532287]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 mnt -> 'mnt:[4026532285]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 net -> 'net:[4026532290]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 pid -> 'pid:[4026532288]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Jan 30 16:30 uts -> 'uts:[4026532286]'
및 네임스페이스 user
는 cgroup
호스트와 컨테이너에 대해 동일합니다.
답변1
기본적으로 사용자를 활성화하지 않기로 한 Docker의 구체적인 결정에 대해서는 Docker에게 문의해야 할 수도 있지만 가능한 합리적인 방법을 제시해 드릴 수 있습니다.
Docker의 일반적인 디자인 철학은 개발 워크플로의 중단과 복잡성을 최소화하면서 컨테이너를 사용할 수 있도록 하는 것인 것으로 보입니다.
사용자 네임스페이스를 활성화하면 기본 호스트에서 볼륨을 마운트할 때 파일/디렉터리 권한 문제가 발생할 수 있습니다. 컨테이너에서 사용 중인 uid/gid에는 마운트된 디렉터리에 대한 권한이 없을 수 있기 때문입니다.
물론 이러한 권한을 주의 깊게 관리하면 이 문제를 해결할 수 있지만 이는 혼란을 야기합니다.
사용자 네임스페이스는 옵션으로 사용할 수 있으므로 개별 조직 및 사용자가 이를 활성화할 수 있으며 설정만 하면 됩니다.
Docker는 "루트 없는" Docker 지원을 활성화하기 위해 노력하고 있으며 이는 현재 실험적 옵션으로 제공된다는 점은 주목할 가치가 있습니다(자세한 내용은여기) 이는 컨테이너(또는 데몬 자체)가 루트로 실행되지 않도록 하여 전반적인 문제를 해결합니다.
답변2
이는 기본적으로 유용성과 보안 사이의 전형적인 절충안입니다. 이후에 개발자 데스크탑에 맞게 구성했습니다.CVE-2019-5736사용자 네임스페이스에 의해 완화되는 것으로 보고되었으며 몇 달 후에 꺼졌습니다. 호스트 볼륨으로 작업하기가 매우 어렵습니다. 배포된 클라우드 네이티브 애플리케이션에는 큰 문제가 아니지만 CI 빌드나 시스템 관리 도구와 같은 DevOps 목적으로 또는 많은 호스트 파일에 의존하는 레거시 앱에 Docker를 사용하는 경우에는 큰 문제입니다.
문제를 더욱 복잡하게 만드는 것은 문제가 있는 유일한 사람이라는 사실이었습니다. 물론 귀하가 제안한 대로 사용자 네임스페이스가 기본값인 경우에는 그렇지 않지만 docker 1.10이 나올 때까지 이 기능을 사용할 수 없었고 그 다음에는 기본값은 기존 사용자에게 너무 지장을 줄 수 있습니다.