Namespaces
Коротко
Механизмы ядра Linux для изоляции и ограничения процессов. На них построены контейнеры (Docker, LXC, Podman).
| Механизм | Что делает |
|---|---|
| Namespaces | Изоляция ресурсов (сеть, PID, FS, users) |
| Cgroups | Лимиты CPU, памяти, I/O |
| Capabilities | Гранулярные привилегии вместо полного root |
| Seccomp | Фильтрация системных вызовов |
| AppArmor/SELinux | Mandatory Access Control - доступ к файлам/сети |
| pivot_root | Смена корневой файловой системы |
Контейнер = namespaces + cgroups + capabilities + seccomp + MAC + pivot_root.
Namespaces
8 типов namespaces (Linux 6.1+):
| Namespace | Clone Flag | Что изолирует |
|---|---|---|
| pid | CLONE_NEWPID | Process IDs - процессы не видят PID из других ns |
| net | CLONE_NEWNET | Сетевой стек: интерфейсы, IP, routes, iptables, сокеты |
| mnt | CLONE_NEWNS | Mount points - своя файловая система |
| user | CLONE_NEWUSER | UID/GID mapping - root внутри != root снаружи |
| uts | CLONE_NEWUTS | Hostname и domain name |
| ipc | CLONE_NEWIPC | System V IPC, POSIX message queues, shared memory |
| cgroup | CLONE_NEWCGROUP | Изолированный view cgroup hierarchy |
| time | CLONE_NEWTIME | Boot и monotonic clocks (с kernel 5.6) |
Команды
Посмотреть namespaces процесса:
| |
lrwxrwxrwx 1 root root 0 Dec 25 12:00 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Dec 25 12:00 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx 1 root root 0 Dec 25 12:00 mnt -> 'mnt:[4026531841]'
lrwxrwxrwx 1 root root 0 Dec 25 12:00 net -> 'net:[4026531840]'
lrwxrwxrwx 1 root root 0 Dec 25 12:00 pid -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 Dec 25 12:00 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Dec 25 12:00 uts -> 'uts:[4026531838]'Список всех namespaces в системе:
| |
Создать процесс в новом namespace:
| |
Войти в namespace другого процесса:
| |
Network Namespace - пример
Создание изолированной сети между двумя netns:
| |
Удаление:
| |
Cgroups
Cgroups (control groups) - лимитирование и учет ресурсов для группы процессов.
cgroups v1 - отдельная иерархия на каждый контроллер (устаревший) cgroups v2 - единая иерархия, делегирование non-root пользователям (современный)
Основные контроллеры:
| Контроллер | Что лимитирует |
|---|---|
| cpu | CPU time, веса, квоты |
| memory | RAM, swap, OOM killer |
| io | Disk I/O bandwidth, IOPS |
| pids | Максимальное число процессов |
| cpuset | Привязка к конкретным CPU/NUMA |
Команды cgroups v2
Проверить что используется v2:
| |
Посмотреть доступные контроллеры:
| |
Создать cgroup и добавить процесс:
| |
Посмотреть текущее использование:
| |
systemd и cgroups
systemd использует cgroups для управления сервисами.
Посмотреть дерево cgroups:
| |
Лимиты для сервиса:
| |
Применить:
| |
Capabilities
Linux capabilities - разбиение привилегий root на отдельные единицы. Вместо “все или ничего” процесс получает только нужные привилегии.
Основные capabilities:
| Capability | Что разрешает |
|---|---|
| CAP_NET_ADMIN | Настройка сети: IP, routes, iptables |
| CAP_NET_BIND_SERVICE | Bind на порты < 1024 |
| CAP_NET_RAW | RAW/PACKET сокеты |
| CAP_SYS_ADMIN | “Новый root” - mount, namespaces, много всего |
| CAP_SYS_PTRACE | ptrace любого процесса |
| CAP_CHOWN | Смена владельца файлов |
| CAP_DAC_OVERRIDE | Игнорировать права доступа к файлам |
| CAP_SETUID/SETGID | Смена UID/GID |
Docker по умолчанию дает контейнеру ~14 capabilities и дропает опасные (SYS_ADMIN, NET_ADMIN).
Посмотреть capabilities процесса:
| |
Управление в Docker:
| |
Seccomp
Seccomp (Secure Computing) - фильтрация системных вызовов на уровне ядра. Процесс может вызывать только разрешенные syscalls.
Режимы:
- strict - только read/write/exit/sigreturn (почти бесполезен)
- filter (BPF) - гибкие правила через BPF программу
Docker по умолчанию блокирует ~44 syscalls: mount, reboot, setns, swapon и др.
Посмотреть seccomp статус процесса:
| |
Docker с кастомным профилем:
| |
Пример профиля (разрешить все кроме mount):
| |
AppArmor
AppArmor - Mandatory Access Control (MAC) для Debian/Ubuntu. Профили ограничивают доступ процесса к файлам, сети, capabilities.
Режимы профилей:
- enforce - блокирует нарушения
- complain - только логирует
Статус:
| |
Docker автоматически применяет профиль docker-default к контейнерам.
| |
Пример профиля /etc/apparmor.d/my-container:
#include <tunables/global>
profile my-container flags=(attach_disconnected) {
#include <abstractions/base>
# разрешить чтение
/etc/passwd r,
/app/** r,
# запретить запись в /etc
deny /etc/** w,
# разрешить сеть
network inet tcp,
}Загрузить профиль:
| |
SELinux
SELinux - MAC для RHEL/CentOS/Fedora. Использует метки (labels) на процессах и ресурсах.
Режимы:
- enforcing - блокирует нарушения
- permissive - только логирует
- disabled - отключен
| |
Контекст безопасности (метка):
| |
Docker и SELinux:
| |
pivot_root
pivot_root - смена корневой файловой системы. Контейнеры используют вместо chroot (более безопасен).
Отличие от chroot:
- chroot меняет только
/для процесса, старый root доступен - pivot_root меняет root для всего mount namespace, старый root можно отмонтировать
| |
В контейнерах это делает runtime (runc, crun) автоматически.
Проверка
Посмотреть все механизмы изоляции процесса:
| |
Для контейнера Docker:
| |