Opublikowano wydanie dystrybucji Linux Bottlerocket 1.3.0, rozwijanej z udziałem firmy Amazon, mającej na celu efektywne i bezpieczne uruchamianie izolowanych kontenerów. Narzędzia i komponenty zarządzające dystrybucją są napisane w języku Rust i są udostępniane na licencjach MIT i Apache 2.0. Obsługiwane jest uruchamianie Bottlerocket w klastrach Amazon ECS, VMware oraz AWS EKS Kubernetes, a także tworzenie dowolnych buildów i edycji, które umożliwiają wykorzystanie różnych narzędzi orkiestracyjnych i runtime dla kontenerów.
Dystrybucja zapewnia atomowy i automatycznie aktualizowany nierozdzielny obraz systemowy, który obejmuje jądro Linux i minimalne środowisko systemowe, zawierające tylko komponenty niezbędne do uruchamiania kontenerów. W środowisku używany jest menedżer systemowy systemd, biblioteka Glibc, narzędzie do budowy Buildroot, bootloader GRUB, konfigurator sieci wicked, runtime dla izolowanych kontenerów containerd, platforma orkiestracyjna Kubernetes, uwierzytelniacz aws-iam-authenticator i agent Amazon ECS.
Narzędzia do orkiestracji kontenerów są dostarczane w osobnym kontenerze zarządzającym, który jest włączony domyślnie i zarządzany przez API oraz AWS SSM Agent. W podstawowym obrazie brakuje powłoki poleceń, serwer SSH oraz języki interpretowane (np. brak Pythona lub Perla) — narzędzia administracyjne i debugujące zostały przeniesione do oddzielnego kontenera pomocniczego, który domyślnie jest wyłączony.
Kluczową różnicą w porównaniu do podobnych dystrybucji, takich jak Fedora CoreOS, CentOS/Red Hat Atomic Host, jest pierwotne skoncentrowanie się na zapewnieniu maksymalnego bezpieczeństwa w kontekście wzmacniania ochrony systemu przed potencjalnymi zagrożeniami, utrudnienia wykorzystania luk w komponentach systemu operacyjnego oraz zwiększenia izolacji kontenerów. Kontenery są tworzone przy użyciu standardowych mechanizmów jądra Linuksa — cgroups, przestrzeni nazw oraz seccomp. Dla dodatkowej izolacji w dystrybucji stosowane jest SELinux w trybie „enforcing.”
Główny system plików jest montowany w trybie tylko do odczytu, a katalog z ustawieniami /etc jest montowany w tmpfs i przywraca pierwotny stan po restarcie. Bezpośrednie zmiany plików w katalogu /etc, takich jak /etc/resolv.conf i /etc/containerd/config.toml, nie są wspierane — aby trwale zachować ustawienia, należy używać API lub przenieść funkcjonalność do oddzielnych kontenerów. Do kryptograficznej weryfikacji integralności głównego systemu plików używany jest moduł dm-verity, a w przypadku wykrycia próby modyfikacji danych na poziomie bloku system zostanie zrestartowany.
Większość komponentów systemowych została napisana w języku Rust, który zapewnia narzędzia do bezpiecznej pracy z pamięcią, umożliwiając uniknięcie podatności spowodowanych dostępem do obszaru pamięci po jego zwolnieniu, dereferencjonowaniem wskaźników zerowych oraz przekroczeniem granic bufora. Podczas domyślnej kompilacji stosuje się tryby kompilacji „—enable-default-pie” oraz „—enable-default-ssp” w celu włączenia randomizacji przestrzeni adresowej plików wykonywalnych (PIE) oraz ochrony przed przepełnieniem stosu poprzez podstawienie znaczników kanarkowych. Dla pakietów napisanych w języku C/C++ dodatkowo włączane są flagi „-Wall”, „-Werror=format-security”, „-Wp,-D_FORTIFY_SOURCE=2”, „-Wp,-D_GLIBCXX_ASSERTIONS” oraz „-fstack-clash-protection”.
W nowym wydaniu:
- Usunięto luki w narzędziach docker i runtime containerd (CVE-2021-41089, CVE-2021-41091, CVE-2021-41092, CVE-2021-41103), związane z niewłaściwym ustawieniem uprawnień, co umożliwiało nieuprzywilejowanym użytkownikom wyjście poza podstawowy katalog i uruchomienie zewnętrznych programów.
- W kubelet i pluto dodano wsparcie IPv6.
- Dostarczono możliwość ponownego uruchomienia kontenera po zmianie jego ustawień.
- W pakiecie eni-max-pods dodano wsparcie dla instancji Amazon EC2 M6i.
- W open-vm-tools dodano wsparcie dla filtrów urządzeń, zrealizowane na bazie narzędzi Cilium.
- Dla platformy x86_64 zrealizowano hybrydowy tryb uruchamiania (z obsługą EFI i BIOS).
- Zaktualizowano wersje pakietów i zależności dla języka Rust.
- Zaprzestano wsparcia dla wersji dystrybucji aws-k8s-1.17 opartej na Kubernetes 1.17. Zaleca się korzystanie z wersji aws-k8s-1.21 z obsługą Kubernetes 1.21. W wersjach k8s wykorzystano ustawienia cgroup runtime.slice i system.slice.
Źródło: opennet.ru
