Раздел 12. Security
Раздел начинается с утверждения, которое стоит запомнить дословно: изоляция container не является полноценной границей безопасности. Container — это процесс host-системы, ограниченный namespaces, cgroups и capabilities. Все эти механизмы реализованы в том же ядре, что и всё остальное. Уязвимость в ядре, ошибка в конфигурации или избыточная привилегия превращают изоляцию в формальность.
Из этого не следует, что containers небезопасны. Следует, что модель угроз должна быть явной. Раздел разбирает реальные векторы: доступ к Docker socket, root внутри container, privileged mode, монтирование каталогов host, секреты в образах, недоверенные базовые образы.
Для каждой опасной настройки даётся одна и та же структура: почему опасно, конкретный сценарий эксплуатации, безопасная альтернатива. Демонстрации выполняются только на собственной учебной машине.
Цели обучения
После раздела учащийся сможет:
- объяснить, почему изоляция container не равна security boundary, и назвать границы её применимости;
- построить модель угроз для контейнеризованного сервиса;
- объяснить, почему доступ к Docker socket эквивалентен правам
rootна host, и показать это; - обосновать выбор между группой
docker,sudoи rootless mode; - объяснить разницу между root в container, user namespaces и rootless Docker;
- применять принцип минимальных привилегий через
--cap-dropи точечный--cap-add; - назвать конкретные последствия
--privilegedи предложить альтернативы; - объяснить роль seccomp, AppArmor и SELinux и что даёт профиль Docker по умолчанию;
- доставлять secrets безопасно и обнаруживать их утечку в слои образа;
- оценивать риски цепочки поставок: базовые образы, зависимости, подпись, provenance;
- находить опасные настройки в чужой конфигурации и обосновывать исправления.
Предварительные знания
- Раздел 02. Основы Containerization — namespaces, cgroups, capabilities;
- Раздел 11. Production — hardening как часть production-требований;
- Раздел 01. Подготовка среды — Docker socket;
- базовое понимание прав доступа в Linux.
Все демонстрации векторов атаки предназначены для выполнения на собственной учебной машине. Цель — понять механизм и уметь его закрыть.
Материалы
-
Модель угроз
Что защищает контейнеризация, а что нет. Активы, границы доверия, векторы. Отличие изоляции containers от изоляции VM. Многопользовательские и однопользовательские сценарии. Практическая методика построения модели угроз для сервиса. -
Daemon и socket
Привилегии Docker daemon./var/run/docker.sockи что даёт доступ к нему. Демонстрация чтения произвольного файла host через socket. Почему монтирование socket в container опасно и какие есть альтернативы. Docker API по TCP и требование TLS. -
Пользователи и namespaces
Root внутри container: что он может и чего не может. User namespaces иuserns-remap: механизм, настройка, ограничения. Rootless Docker: модель безопасности и её цена. Сравнение трёх подходов таблицей. -
Capabilities и privileged
Модель capabilities. Набор, оставляемый Docker по умолчанию, и что даёт каждая.--cap-drop=ALLкак базовая практика. Опасные capabilities:SYS_ADMIN,SYS_PTRACE,NET_ADMIN,DAC_OVERRIDE. Что именно включает--privilegedи почему это почти всегда избыточно.--deviceкак точечная альтернатива. -
Seccomp, AppArmor, SELinux
Профиль seccomp по умолчанию: какие системные вызовы блокирует и зачем. Создание собственного профиля. AppArmor в Ubuntu и профильdocker-default. SELinux в RHEL-подобных системах и контексты монтирования.--security-opt=no-new-privileges. Диагностика блокировок. -
Secrets
ПочемуENVи--build-argнепригодны для секретов. Демонстрация извлечения секрета из слоёв. BuildKit secret mounts. Файлы вместо переменных. Compose secrets. Ротация. Обнаружение утечек в существующих образах и что делать после утечки. -
Supply chain security
Доверие к базовым образам: официальные образы, digest pinning, обновления. Уязвимости зависимостей и их приоритизация. Риски typosquatting в PyPI. Вредоносные образы в публичных registry. Подпись образов и attestations. Проверка происхождения артефакта. -
Практические задания
Лабораторные задания раздела с проверкой результата.
Рекомендуемый порядок чтения
Последовательный: 01 → 02 → 03 → 04 → 05 → 06 → 07 → exercises.
Урок 06 обязателен для всех: утечка секретов — самая частая и самая дорогая ошибка из перечисленных. Урок 05 можно прочитать обзорно, если вы не настраиваете собственные профили.
Практические задания
| № | Задание | Тип |
|---|---|---|
| 1 | Показать на учебной машине, что доступ к Docker socket позволяет прочитать /etc/shadow host | обяз. |
| 2 | Извлечь секрет, переданный через --build-arg, из готового образа | обяз. |
| 3 | Переделать сборку на secret mount и доказать отсутствие секрета в слоях | обяз. |
| 4 | Запустить приложение с --cap-drop=ALL и определить минимально необходимый набор | обяз. |
| 5 | Сравнить вывод capsh --print для обычного и --privileged container | обяз. |
| 6 | Настроить userns-remap и показать, что root в container отображается на непривилегированный UID | доп. |
| 7 | Написать seccomp-профиль, блокирующий конкретный системный вызов, и проверить его | доп. |
| 8 | Проверить образ сканером и обосновать приоритет каждой находки | доп. |
| 9 | Дан compose.yaml с пятью нарушениями безопасности. Найти все и исправить | диаг. |
| 10 | Провести аудит безопасности собственного проекта из раздела 10 по security checklist | ★ |
Полные формулировки — в exercises.md.
Критерии завершения раздела
Раздел пройден, когда учащийся может без подсказок:
- Объяснить за минуту, почему членство в группе
dockerэквивалентноroot. - Назвать три конкретных последствия запуска container с
--privileged. - Извлечь секрет из чужого образа и объяснить, как его туда не допустить.
- Определить минимальный набор capabilities для конкретного приложения.
- Объяснить разницу между rootless Docker и
userns-remap. - Провести аудит
compose.yamlи обосновать каждое найденное нарушение сценарием риска.
Проверьте себя: Quiz 12 и security checklist.
Что дальше
Мы знаем, как построить безопасный и корректный сервис. Следующий раздел учит выяснять, что происходит, когда он всё-таки сломался.
Навигация
← Предыдущий раздел: Production-ready containers
Вернуться к главному оглавлению
Следующий раздел: Observability и диагностика →