Почему Docker по умолчанию использует те же пространства имен пользователей и cgroup при запуске нового контейнера?

Почему Docker по умолчанию использует те же пространства имен пользователей и cgroup при запуске нового контейнера?

Почему 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 без прав root, и сейчас это доступно в качестве экспериментальной опции (подробнеездесь) и это решило бы общую проблему, гарантируя, что ни один контейнер (или сам демон) не будет запущен от имени root.

решение2

Это в основном классический компромисс между удобством использования и безопасностью. Я настроил его для своего рабочего стола разработчика послеCVE-2019-5736сообщалось, что это было смягчено пользовательскими пространствами имен, и отключил его несколько месяцев спустя. Это очень затрудняет работу с томами хоста. Это не имеет большого значения для развернутого облачного приложения, но имеет огромное значение, если вы используете docker для целей devops, таких как сборки CI или инструменты системного администратора, или для устаревших приложений, которые зависят от множества файлов хоста.

Проблема усугублялась тем фактом, что я был единственным, у кого возникла эта проблема, что, конечно, было бы не так, если бы пространства имен пользователей были параметрами по умолчанию, как вы предлагаете, но эта функция была доступна только в Docker 1.10, и к тому времени изменение параметров по умолчанию стало бы слишком разрушительным для существующих пользователей.

Связанный контент