Домой Гайды Железо и ПК Переход с Docker на Podman: почему главным улучшением безопасности стал отказ от...

Переход с Docker на Podman: почему главным улучшением безопасности стал отказ от прав суперпользователя

Опыт перехода с Docker на Podman на домашнем сервере показал, что реальное усиление безопасности заключается в отказе от постоянного контроля со стороны суперпользователя.

3
0

Долгое время на домашнем сервере использовался Docker, работа которого не вызывала нареканий. Удобство заключалось и в том, что не приходилось постоянно вводить префикс sudo. Реальные изменения стали очевидны после переноса всего стека на Podman без прав суперпользователя. Главное улучшение заключалось не в новизне самого инструмента, а в удалении постоянно активного корневого контроля. Это изменение переопределяет потенциальное влияние взломанного контейнера на хост. Подобная граница играет важную роль в обеспечении безопасности домашних серверов.

Панель управления контейнерами Podman Desktop на экране устройства
Интерфейс Podman Desktop предоставляет удобные инструменты для локального запуска и отладки контейнеров. Источник: MakeUseOf

В конфигурации по умолчанию демона Dockerd запускается от имени суперпользователя, а сокет Docker представляет собой интерфейс живого управления этим корневым процессом. Ощущение победы удобства заключалось в возможности выполнять команды без sudo, однако членство в группе docker фактически предоставляет привилегии уровня root. Официальная документация Docker также отмечает этот риск как потенциальную угрозу. Сокет Docker предоставляет контейнеру доступ к корневому процессу, поэтому практические результаты не меняются. Процесс, способный взаимодействовать с сокетом, может потенциально использовать привилегии корневого демона, создавать привилегированные контейнеры, монтировать пути хоста или выполнять операции с полномочиями root.

Особенности изоляции в режиме без прав суперпользователя

Подобный контроль бездействовал на домашнем сервере, где запускались медиаинструменты, службы синхронизации документов, обратные прокси-серверы и несколько баз данных. Решение принималось не ради замены одного движка контейнеров на другой из соображений мнимой безопасности. Основной целью было устранение постоянно активной зоны управления с привилегиями root, ставшей частью рабочего процесса. Архитектура Podman не использует центральный демон, работающий от имени суперпользователя, между командами и контейнерами.

переход с Docker на Podman — иллюстрация 9 к материалу
переход с Docker на Podman — иллюстрация к публикации. Источник: MakeUseOf
переход с Docker на Podman — иллюстрация 10 к материалу
переход с Docker на Podman — иллюстрация к публикации. Источник: MakeUseOf
переход с Docker на Podman — иллюстрация 11 к материалу
переход с Docker на Podman — иллюстрация к публикации. Источник: MakeUseOf
переход с Docker на Podman — иллюстрация 12 к материалу
переход с Docker на Podman — иллюстрация к публикации. Источник: MakeUseOf
переход с Docker на Podman — иллюстрация 13 к материалу
переход с Docker на Podman — иллюстрация к публикации. Источник: MakeUseOf

Внутри контейнера процесс может функционировать с правами суперпользователя с идентификатором UID 0, однако эта возможность не выходит за рамки контейнерной границы. Идентификатор UID 0 внутри контейнера сопоставляется с диапазоном непривилегированных UID на хосте, а файлы /etc/subuid и /etc/subgid предоставляют подчиненные диапазоны идентификаторов для этого сопоставления. Ядро Linux обеспечивает принудительное разделение уровней доступа. Проверка команды id внутри контейнера и просмотр того же процесса с хоста выявляют разницу, объясняющую эту границу. Внутри контейнера пользователь получает статус root, тогда как на хосте используется собственный идентификатор. Это означает, что любой скомпрометированный процесс оказывается в заведомо более слабой позиции при выходе за пределы контейнера, поскольку он никогда не обладал реальными правами UID 0 на хосте.

переход с Docker на Podman — иллюстрация 2 к материалу
переход с Docker на Podman — иллюстрация к публикации. Источник: MakeUseOf

В процессе настройки возникали определенные трудности, доказавшие существование реальных ограничений безопасности. Некоторые привычные сетевые сценарии в контейнерах с полными правами не функционировали без соответствующих привилегий. Для организации сети в режиме без прав суперпользователя Podman может применять инструменты вроде Pasta, обеспечивающие сетевое взаимодействие без предоставления движку контейнеров корневых привилегий. Бескорневой режим изначально лишен привилегий, упрощающих традиционные сетевые модели.

переход с Docker на Podman — иллюстрация 3 к материалу
переход с Docker на Podman — иллюстрация к публикации. Источник: MakeUseOf

Ошибки конфигурации и особенности архитектуры

Один небрежный привязанный каталог способен полностью разрушить установленную границу. Запуск контейнеров без прав root не обеспечивает автоматическую защиту всех монтируемых директорий хоста. Папки, разделяемые с контейнером, подчиняются обычным ограничениям прав учетной записи пользователя. Контейнер может получить потенциальную возможность чтения или записи файлов на хосте, к которым у пользовательского аккаунта уже есть доступ. Монтирование целой директории отличается от подключения одной выделенной папки для данных приложения. Выделенная папка сужает зону досягаемости контейнера, тогда как подключение крупного каталога открывает доступ ко всему, что доступно учетной записи в рамках этого монтирования.

переход с Docker на Podman — иллюстрация 4 к материалу
переход с Docker на Podman — иллюстрация к публикации. Источник: MakeUseOf

Общее ядро операционной системы остается жестким ограничением. Сопоставление пользовательских пространств имен не способно остановить эксплойт ядра или успешный побег из пространства имен. Бескорневой режим лишь ограничивает масштаб ущерба после уже произошедшего инцидента, но не всегда способен предотвратить саму атаку.

переход с Docker на Podman — иллюстрация 5 к материалу
переход с Docker на Podman — иллюстрация к публикации. Источник: MakeUseOf

В течение нескольких лет Docker предлагает бескорневой режим, запускающий демона и контейнеры внутри пользовательского пространства имен. Этот подход призван снизить основные привилегии без необходимости смены самого движка. Подобное архитектурное решение имеет реальные отличия, но его возможности более ограничены из-за сохранения работы персонального демона для каждого пользователя. В то же время Podman обходится вообще без него. Инструмент Quadlet позволяет Linux управлять контейнерами в качестве фоновых системных служб, что выступает главным преимуществом Podman для повседневного обслуживания домашних серверов. Quadlet интегрируется с systemd для запуска, перезапуска и сбора журналов с помощью привычных средств управления службами Linux.

переход с Docker на Podman — иллюстрация 6 к материалу
переход с Docker на Podman — иллюстрация к публикации. Источник: MakeUseOf

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

переход с Docker на Podman — иллюстрация 7 к материалу
переход с Docker на Podman — иллюстрация к публикации. Источник: MakeUseOf

Инструмент Podman Desktop представляет собой мощную утилиту управления контейнерами, предоставляющую разработчикам интуитивно понятный графический интерфейс для локальной сборки, запуска и отладки контейнеров. Программа упрощает взаимодействие с Podman и Kubernetes, предлагая удобную альтернативу более тяжелым платформам для работы с контейнерами на операционных системах Windows, macOS и Linux.

переход с Docker на Podman — иллюстрация 8 к материалу
переход с Docker на Podman — иллюстрация к публикации. Источник: MakeUseOf
Источник: https://www.makeuseof.com