01.12.2021

Выпуск Bottlerocket 1.3, дистрибутива на базе изолированных контейнеров

Опубликован выпуск Linux-дистрибутива Bottlerocket 1.3.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».

В новом выпуске:

  • Устранены уязвимости в инструментарии docker и runtime containerd (CVE-2021-41089, CVE-2021-41091, CVE-2021-41092, CVE-2021-41103), связанные с некорректной установкой прав доступа, что позволяло непривилегированным пользователям выйти за пределы базового каталога и выполнить внешние программы.
  • В kubelet и pluto добавлена поддержка IPv6.
  • Предоставлена возможность перезапуска контейнера после изменения его настроек.
  • В пакет eni-max-pods добавлена поддержка инстансов Amazon EC2 M6i.
  • В open-vm-tools добавлена поддержка фильтров устройств, реализованная на базе инструментария Cilium.
  • Для платформы x86_64 реализован гибридный режим загрузки (с поддержкой EFI и BIOS).
  • Обновлены версии пакетов и зависимости для языка Rust.
  • Прекращена поддержка варианта дистрибутива aws-k8s-1.17 на базе Kubernetes 1.17. Рекомендовано использовать вариант aws-k8s-1.21 c поддержкой Kubernetes 1.21. В вариантах k8s задействованы настройки cgroup runtime.slice и system.slice.

Источник.