- PVSM.RU - https://www.pvsm.ru -

Вышел минималистичный Linux-дистрибутив Bottlerocket для запуска контейнеров. Самое главное о нём

Вышел минималистичный Linux-дистрибутив Bottlerocket для запуска контейнеров. Самое главное о нём - 1

Компания Amazon объявила [1] о финальном релизе Bottlerocket [2] — специализированного дистрибутива для запуска контейнеров и эффективного управления ими.

Bottlerocket (кстати, так называют мелкие самодельные ракеты на дымном порохе) — не первая ОС для контейнеров, но вполне вероятно, что она получит широкое распространение благодаря дефолтной интеграции с сервисами AWS. Хотя система ориентирована на облако Amazon, открытый исходный код позволяет собрать её где угодно: локально на сервере, на Raspberry Pi, в любом конкурирующем облаке и даже в среде без контейнеров.

Это вполне достойная замена дистрибутиву CoreOS, который похоронила Red Hat.

Вообще, у подразделения Amazon Web Services уже есть Amazon Linux, который недавно вышел во второй версии: это дистрибутив общего назначения, который можно запустить в контейнере Docker или с гипервизорами Linux KVM, Microsoft Hyper-V и VMware ESXi. Он был оптимизирован для работы в облаке AWS, но с выходом Bottlerocket всем рекомендуется сделать апгрейд на новую систему, которая более безопасная, современная и потребляет меньше ресурсов.

AWS анонсировала Bottlerocket в марте 2020 года [3]. Она сразу признала, что это не первый «Linux для контейнеров», упомянув в качестве источников вдохновения CoreOS, Rancher OS и Project Atomic. Разработчики написали, что операционная система является «результатом уроков, которые мы извлекли за долгое время работы производственных служб в масштабе Amazon, и с учётом опыта, который мы получили за последние шесть лет о том, как запускать контейнеры».

Экстремальный минимализм

Linux очищен от всего, что не нужно для запуска контейнеров. Такой дизайн, по словам компании, сокращает поверхность атаки.

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

Amazon также удалила все оболочки и интерпретаторы, исключив риск их использования или случайного повышения привилегий пользователями. В базовом образе ради минимализма и безопасности отсутствует командная оболочка, сервер SSH и интерпретируемые языки типа Python. Инструменты для администратора вынесены в отдельный служебный контейнер, который отключён по умолчанию.

Управление системой предусмотрено двумя способами: через API и оркестровку.

Вместо менеджера пакетов, который обновляет отдельные части программного обеспечения, Bottlerocket загружает полный образ файловой системы и перезагружается в него. В случае сбоя загрузки он автоматически откатывается, а сбой рабочей нагрузки может инициировать откат вручную (команда через API).

Фреймворк TUF [4] (The Update Framework) загружает обновления на основе образов в альтернативные или «размонтированные» разделы. Под систему выделяется два дисковых раздела, один из которых содержит активную систему, а на второй копируется обновление. При этом корневой раздел монтируется в режиме только для чтения, а раздел /etc монтируется с файловой системой в оперативной памяти tmpfs [5] и восстанавливает исходное состояние после перезапуска. Прямое изменение конфигурационных файлов в /etc не поддерживается: для сохранения настроек следует использовать API или выносить функциональность в отдельные контейнеры.

Вышел минималистичный Linux-дистрибутив Bottlerocket для запуска контейнеров. Самое главное о нём - 2
Схема обновления через API

Безопасность

Контейнеры создаются штатными механизмами ядра Linux — cgroups, пространства имён и seccomp, а в качестве системы принудительного контроля доступа, то есть для дополнительной изоляции используется SELinux [6] в режиме "enforcing".

По умолчанию включены политики для разделения ресурсов между контейнерами и ядром. Бинарники защищены флагами, чтобы пользователи или программы не могли их выполнять. И если кто-то добрался до файловой системы, Bottlerocket предлагает инструмент для проверки и отслеживания любых внесённых изменений.

Режим «проверенной загрузки» реализован через функцию device-mapper-verity (dm-verity [7]), которая проверяет целостность корневого раздела во время загрузки. AWS описывает dm-verity как «функцию ядра Linux, обеспечивающую проверку целостности, чтобы предотвратить работу зловредов в ОС, таких как перезапись основного системного программного обеспечения».

Также в системе присутствует фильтр eBPF [8] (extended BPF, разработка Алексея Старовойтова [9]), который позволяет заменять модули ядра более безопасными программами BPF для низкоуровневых системных операций.

Модель выполнения Задаётся пользователем Компиляция Безопасность Режим сбоя Доступ к ресурсам
Юзер задача да любая права пользователей прерывание выполнения системный вызов, fault
Ядро задача нет статическая нет паника ядра прямой
BPF событие да JIT, CO-RE верификация, JIT сообщение об ошибке ограниченные хелперы

Отличие BPF от обычного кода уровня пользователя или ядра, источник [10]

AWS заявила, что Bottlerocket «применяет операционную модель, которая ещё больше повышает безопасность, препятствуя подключению к продакшн-серверам с привилегиями администратора», и «подходит для больших распределённых систем, в которых ограничен контроль над каждым отдельным хостом».

Для системных администраторов предусмотрен контейнер администратора. Но AWS не думает, что админу часто придется работать внутри Bottlerocket: «Акт входа в отдельный инстанс Bottlerocket предназначен для нечастых операций: расширенной отладки и устранения неполадок», — пишут [1] разработчики.

Язык Rust

Инструментарий ОС поверх ядра в основном написан на Rust. Этот язык по своей природе уменьшает вероятность небезопасного доступа к памяти [11], а также устраняет условия гонки между потоками [12].

При сборке по умолчанию применяются флаги --enable-default-pie и --enable-default-ssp для включения рандомизации адресного пространства исполняемых файлов (position-independent executable [13], PIE) и защиты от переполнения стека.

Для пакетов на C/C++ дополнительно включаются флаги -Wall, -Werror=format-security, -Wp,-D_FORTIFY_SOURCE=2, -Wp,-D_GLIBCXX_ASSERTIONS и -fstack-clash-protection.

Кроме Rust и C/C++, некоторые пакеты написаны на языке Go.

Интеграция с сервисами AWS

Отличие от аналогичных контейнерных операционных систем заключается в том, что Amazon оптимизировала Bottlerocket для работы на AWS и интеграции с другими сервисами AWS.

Самым популярным оркестратором контейнеров является Kubernetes, поэтому AWS внедрила интеграцию с собственным Enterprise Kubernetes Service (EKS). Инструменты для оркестровки идут в отдельном управляющем контейнере bottlerocket-control-container [14], который включён по умолчанию и управляется через API и AWS SSM Agent.

Будет интересно посмотреть, взлетит ли Bottlerocket, учитывая провал некоторых подобных инициатив в прошлом. Например, PhotonOS от Vmware оказалась невостребованной, а RedHat купила CoreOS и закрыла проект [15], который считался пионером в данной области.

Интеграция Bottlerocket в сервисы AWS делает эту систему в своём роде уникальной. Возможно, это главная причина, почему некоторые пользователи могут предпочесть Bottlerocket другим дистрибутивам, таким как CoreOS или Alpine. Система изначально спроектирована для работы с EKS и ECS, но повторим, что это не обязательно. Во-первых, Bottlerocket можно собрать самостоятельно [16] и использовать, например, как hosted-решение. Во-вторых, пользователи EKS и ECS по-прежнему сохранят возможность выбора ОС.

Исходный код Bottlerocket опубликован на GitHub под лицензией Apache 2.0. Разработчики уже реагируют на баг-репорты и запросы фич [17].


На правах рекламы

VDSina предлагает VDS с посуточной оплатой [18]. Возможно установить любую операционную систему, в том числе из своего образа. Каждый сервер подключён к интернет-каналу в 500 Мегабит и бесплатно защищён от DDoS-атак!

Автор: Александр

Источник [19]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/linux/356867

Ссылки в тексте:

[1] объявила: https://aws.amazon.com/blogs/opensource/announcing-the-general-availability-of-bottlerocket-an-open-source-linux-distribution-purpose-built-to-run-containers/

[2] Bottlerocket: https://github.com/bottlerocket-os/bottlerocket

[3] в марте 2020 года: https://aws.amazon.com/blogs/containers/bottlerocket-a-special-purpose-container-operating-system/

[4] TUF: https://github.com/theupdateframework/specification/

[5] tmpfs: https://www.kernel.org/doc/Documentation/filesystems/tmpfs.txt

[6] SELinux: https://github.com/SELinuxProject

[7] dm-verity: https://www.kernel.org/doc/html/latest/admin-guide/device-mapper/verity.html

[8] eBPF: https://lwn.net/Articles/740157/

[9] разработка Алексея Старовойтова: https://lwn.net/Articles/598545/

[10] источник: https://d1.awsstatic.com/events/reinvent/2019/REPEAT_1_BPF_performance_analysis_at_Netflix_OPN303-R1.pdf

[11] уменьшает вероятность небезопасного доступа к памяти: https://habr.com/ru/post/438288/

[12] устраняет условия гонки между потоками: https://habr.com/ru/post/441370/

[13] position-independent executable: https://en.wikipedia.org/wiki/Position-independent_code

[14] bottlerocket-control-container: https://github.com/bottlerocket-os/bottlerocket-control-container

[15] закрыла проект: https://coreos.com/os/eol/

[16] собрать самостоятельно: https://github.com/bottlerocket-os/bottlerocket/blob/develop/BUILDING.md

[17] реагируют на баг-репорты и запросы фич: https://github.com/orgs/bottlerocket-os/projects/1

[18] VDS с посуточной оплатой: https://vdsina.ru/cloud-servers?partner=habr96

[19] Источник: https://habr.com/ru/post/518290/?utm_source=habrahabr&utm_medium=rss&utm_campaign=518290