LXC — это хорошо известная и тщательно протестированная низкоуровневая среда выполнения контейнеров Linux. Он находится в активной разработке с 2008 года и зарекомендовал себя в критически важных производственных средах по всему миру. Некоторые из его основных участников — это те же люди, которые помогли реализовать различные известные функции контейнеризации внутри ядра Linux.
Тип | Услуга | Статус |
---|---|---|
КИ (Линукс) | GitHub | |
КИ (Линукс) | Дженкинс | |
Статус проекта | Лучшие практики CII | |
Фаззинг | OSS-Fuzz | |
Фаззинг | CIFuzz |
Основное внимание LXC уделяется системным контейнерам. То есть контейнеры, которые предлагают среду, максимально приближенную к той, которую вы получаете от виртуальной машины, но без накладных расходов, связанных с запуском отдельного ядра и моделированием всего оборудования.
Это достигается за счет сочетания функций безопасности ядра, таких как пространства имен, обязательный контроль доступа и группы управления.
Непривилегированные контейнеры — это контейнеры, которые запускаются без каких-либо привилегий. Для этого требуется поддержка пользовательских пространств имен в ядре, в котором запущен контейнер. LXC была первой средой выполнения, поддерживающей непривилегированные контейнеры после того, как пространства имен пользователей были объединены с основным ядром.
По сути, пространства имен пользователей изолируют заданные наборы UID и GID. Это достигается путем установления сопоставления между диапазоном UID и GID на хосте с другим (непривилегированным) диапазоном UID и GID в контейнере. Ядро преобразует это сопоставление таким образом, что внутри контейнера все UID и GID отображаются так, как и следовало ожидать от хоста, тогда как на хосте эти UID и GID фактически являются непривилегированными. Например, процесс, выполняющийся внутри контейнера с UID и GID 0, может отображаться на хосте как UID и GID 100000. Детали реализации и работы можно получить на соответствующей странице руководства по пространству имен пользователя.
Поскольку непривилегированные контейнеры повышают безопасность, они, естественно, имеют несколько ограничений, налагаемых ядром. Чтобы обеспечить полнофункциональный непривилегированный контейнер, LXC взаимодействует с тремя фрагментами кода setuid:
Все остальное запускается как ваш собственный пользователь или как uid, которым владеет ваш пользователь.
В общем, цель LXC — использовать все функции безопасности, доступные в ядре. Это означает, что управление конфигурацией LXC позволит опытным пользователям тонко настроить LXC в соответствии со своими потребностями.
Более подробное введение в безопасность LXC можно найти по следующей ссылке.
В принципе, LXC можно запускать без каких-либо из этих инструментов при условии применения правильной конфигурации. Однако полезность таких контейнеров обычно весьма ограничена. Просто выделю две наиболее распространенные проблемы:
Сеть: Не полагаясь на помощник setuid для настройки соответствующих сетевых устройств для непривилегированного пользователя (см. двоичный файл LXC lxc-user-nic
), единственный вариант — разделить сетевое пространство имен с хостом. Хотя в принципе это должно быть безопасно, совместное использование сетевого пространства имен хоста по-прежнему требует на один шаг меньше изоляции и увеличивает вектор атаки. Более того, если хост и контейнер используют одно и то же сетевое пространство имен, ядро откажется от любого монтирования sysfs. Обычно это означает, что двоичный файл init внутри контейнера не сможет правильно загрузиться.
Пространства имен пользователей. Как отмечалось выше, пространства имен пользователей являются большим улучшением безопасности. Однако, не полагаясь на привилегированных помощников, пользователям, не имеющим привилегий на хосте, разрешено сопоставлять только свой собственный UID с контейнером. Однако стандартная система POSIX требует наличия 65536 UID и GID, чтобы гарантировать полную функциональность.
LXC настраивается с помощью простого набора ключей. Например,
lxc.rootfs.path
lxc.mount.entry
Ключи конфигурации пространств имен LXC с использованием одиночных точек. Это означает, что сложные ключи конфигурации, такие как lxc.net.0
предоставляют различные подразделы, такие как lxc.net.0.type
, lxc.net.0.link
, lxc.net.0.ipv6.address
и другие, для еще большей точности. зернистая конфигурация.
LXC используется в качестве среды выполнения по умолчанию для Incus, контейнерного гипервизора, поверх которого предоставляется хорошо продуманный и стабильный REST-API.
LXC работает на любом ядре начиная с версии 2.6.32. Все, что для этого требуется, — это функциональный компилятор C. LXC работает на всех архитектурах, которые предоставляют необходимые функции ядра. Это включает (но не ограничивается):
LXC также поддерживает как минимум следующие стандартные библиотеки C:
LXC всегда уделял особое внимание строгой обратной совместимости. Фактически, API не был взломан, начиная с версии 1.0.0
. Основной LXC в настоящее время имеет версию 4.*.*
.
Проект LXC имеет хорошую репутацию в быстром и эффективном решении проблем безопасности. Если вы считаете, что обнаружили потенциальную проблему безопасности, сообщите об этом по электронной почте в адрес безопасности (at) linuxcontainers (dot) org.
Для получения более подробной информации, пожалуйста, посмотрите
Мы всегда приветствуем новых участников и будем рады предоставить рекомендации, когда это необходимо. LXC следует соглашениям о кодировании ядра. Это означает, что нам требуется только, чтобы каждый коммит включал строку Signed-off-by
. Используемый нами стиль кодирования идентичен тому, который используется в ядре Linux. Подробное введение вы можете найти по адресу:
а также следует взглянуть на файл CONTRIBUTING в этом репозитории.
Если вы хотите стать более активным, обычно полезно появиться на IRC-канале LXC #lxc-dev на irc.libera.chat. Мы стараемся вести всю разработку открыто, а обсуждение новых функций или ошибок происходит либо в соответствующих выпусках GitHub, либо в IRC.
Когда вы думаете о внесении критического вклада в безопасность или о существенных изменениях, обычно рекомендуется сначала связаться с разработчиками и спросить, будет ли принят запрос на запрос.
LXC и связанные с ним проекты строго придерживаются схемы семантического управления версиями.
Исходный код последней выпущенной версии всегда можно загрузить с сайта
Вы можете просмотреть исходный код с точностью до минуты и изменить историю онлайн.
Не принимая во внимание конкретные детали распределения, простой
meson setup -Dprefix=/usr build
meson compile -C build
обычно бывает достаточно.
Если вы обнаружите, что вам нужна помощь, проекты LXC предоставят вам несколько вариантов.
Мы поддерживаем дискуссионный форум по адресу
где вы можете получить поддержку.
Вы можете найти нас в #lxc на irc.libera.chat.
Вы можете просмотреть один из двух архивов списков рассылки LXC и зарегистрироваться, если интересно: