Опубликован выпуск Linux-дистрибутива Bottlerocket 1.8.0, развиваемого при участии компании Amazon для эффективного и безопасного запуска изолированных контейнеров. Инструментарий и управляющие компоненты дистрибутива написаны на языке Rust и распространяются под лицензиями MIT и Apache 2.0. Поддерживается запуск Bottlerocket в кластерах Amazon ECS, VMware и AWS EKS Kubernetes, а также создание произвольных сборок и редакций, допускающих применение различных инструментов оркестровки и runtime для контейнеров.
Дистрибутив предоставляет атомарно и автоматически обновляемый неделимый системный образ, включающий ядро Linux и минимальное системное окружение, включающие только компоненты, необходимые для запуска контейнеров. В окружении задействованы системный менеджер systemd, библиотека Glibc, сборочный инструментарий
Buildroot, загрузчик GRUB, конфигуратор сети wicked, runtime для изолированных контейнеров containerd, платформа оркестровки контейнеров Kubernetes, аутентификатор aws-iam-authenticator и агент Amazon ECS.
Инструменты для оркестровки контейнеров поставляются в отдельном управляющем контейнере, который включается по умолчанию и управляется через API и AWS SSM Agent. В базовом образе отсутствует командная оболочка, сервер SSH и интерпретируемые языки (например, нет Python или Perl) – средства для администратора и отладочные инструменты вынесены в отдельный служебный контейнер, который по умолчанию отключён.
Ключевым отличием от похожих дистрибутивов, таких как Fedora CoreOS, CentOS/Red Hat Atomic Host является первичная ориентация на предоставление максимальной безопасности в контексте усиления защиты системы от возможных угроз, усложнения эксплуатации уязвимостей в компонентах ОС и повышения изоляции контейнеров. Контейнеры создаются при помощи штатных механизмов ядра Linux – cgroups, пространств имён и seccomp. Для дополнительной изоляции в дистрибутиве применяется SELinux в режиме “enforcing”.
Корневой раздел монтируется в режиме только для чтения, а раздел с настройками /etc монтируется в tmpfs и восстанавливает исходное состояние после перезапуска. Прямое изменение файлов в каталоге /etc, таких как /etc/resolv.conf и /etc/containerd/config.toml, не поддерживается – для постоянного сохранения настроек следует использовать API или выносить функциональность в отдельные контейнеры. Для криптографической верификации целостности корневого раздела задействован модуль dm-verity, а в случае выявления попытки модификации данных на уровне блочного устройства система перезагружается.
Большинство системных компонентов написаны на языке Rust, предоставляющем средства для безопасной работы с памятью, позволяющие избежать уязвимостей, вызванных обращением к области памяти после её освобождения, разыменованием нулевых указателей и выходом за границы буфера. При сборке по умолчанию применяются режимы компиляции “–enable-default-pie” и “–enable-default-ssp” для включения рандомизации адресного пространства исполняемых файлов (PIE) и защиты от переполнения стека через подстановку канареечных меток.
Для пакетов, написанных на языке C/C++, дополнительно включаются флаги
“-Wall”, “-Werror=format-security”, “-Wp,-D_FORTIFY_SOURCE=2”, “-Wp,-D_GLIBCXX_ASSERTIONS” и “-fstack-clash-protection”.
В новом выпуске:
- Обновлено содержимое административного и управляющего контейнеров.
- Runtime для изолированных контейнеров обновлён до ветки containerd 1.6.x.
- Обеспечен перезапуск фоновых процессов, координирующих работу контейнеров, после изменений в хранилище сертификатов.
- Предоставлена возможность выставления загрузочных параметров ядра через секцию Boot Configuration.
- Включено игнорирование пустых блоков при контроле целостности корневого раздела при помощи dm-verity.
- Предоставлена возможность статической привязки имён хостов в /etc/hosts.
- Предоставлена возможность генерации сетевой конфигурации при помощи утилиты netdog (добавлена команда generate-net-config).
- Предложены новые варианты дистрибутива c поддержкой Kubernetes 1.23. Сокращено время запуска pod-ов в Kubernetes за счёт отключения режима configMapAndSecretChangeDetectionStrategy. Добавлены новые настройки kubelet-ов: provider-id и podPidsLimit.
- Предложен новый вариант дистрибутива “aws-ecs-1-nvidia” для Amazon Elastic Container Service (Amazon ECS), поставляемый с драйверами NVIDIA.
- Добавлена поддержка устройств хранения Microchip Smart Storage и MegaRAID SAS. Расширена поддержка Ethernet-карт на чипах Broadcom.
- Обновлены версии пакетов и зависимости для языков Go и Rust, а также версии пакетов со сторонними программами. Bottlerocket SDK обновлён до версии 0.26.0.