Как происходит работа с дескрипторами процессов внутри контейнеров и есть ли доступ к дескрипторам хостовой машины
Что проверяют
Понимаете ли вы, что контейнер это обычный процесс на ядре хоста, а не маленькая виртуальная машина. Из этого следуют ответы и про дескрипторы, и про изоляцию. Следом обычно спрашивают, как контейнер всё-таки может добраться до ресурсов хоста.
Как отвечать
Сначала уточните термин. Файловый дескриптор это номер в таблице открытых файлов процесса: файлы, сокеты, пайпы. С PID его не путают, хотя в Linux есть и pidfd, дескриптор, который ссылается на процесс.
Дальше механика:
- таблица дескрипторов своя у каждого процесса, в контейнере он или нет. Ядро одно, отдельного namespace для дескрипторов нет;
- изоляцию дают namespaces: PID namespace скрывает чужие процессы, а
/procвнутри контейнера показывает только свои. Поэтому через/proc/<pid>/fdдо дескрипторов хоста не дотянуться. С хоста, наоборот, всё видно через/proc/<pid>/fdилиlsof; - лимиты:
RLIMIT_NOFILEдействует на процесс (--ulimit nofileв Docker), аfs.file-maxодин на ядро и общий с хостом. Контроллера cgroups для числа дескрипторов нет.
Когда граница пробивается:
--pid=hostпоказывает процессы хоста, а сCAP_SYS_PTRACEили--privilegedоткрывает и их дескрипторы;- смонтированный
/var/run/docker.sockфактически даёт root на хосте; - передача через Unix-сокет (
SCM_RIGHTS) работает между namespaces; - утечка от рантайма: CVE-2024-21626 в runc позволяла выйти на файловую систему хоста через унаследованный дескриптор.
Для Go: с версии 1.19 пакет os при старте поднимает мягкий лимит RLIMIT_NOFILE до жёсткого. Файлы открываются с O_CLOEXEC, и процесс из os/exec получает только stdio и cmd.ExtraFiles.
Где спотыкаются
Называют дескриптор процесса уникальным идентификатором процесса, то есть путают fd и PID.
Говорят, что cgroups ограничивают доступ к дескрипторам. Cgroups считают CPU, память, число процессов и I/O, а видимость задают namespaces.
Считают, что без --privileged контейнер изолирован полностью. Смонтированный docker.sock или каталог хоста ломают изоляцию без всяких флагов.