V předchozích článcích jsem psal o obrázcích kontejnerů a runtimech. V tomto článku se podívám na to, jak jsou kontejnery umožněny na základě některých speciálních linuxových technologií, včetně jmenných prostorů a kontrolních skupin.
Linuxové kontejnery
- Co jsou kontejnery systému Linux?
- Úvod do terminologie kontejnerů
- Stáhnout:Containers Primer
- Operátoři Kubernetes:Automatizace platformy pro orchestraci kontejnerů
- eKniha:Vzory Kubernetes pro navrhování cloudových nativních aplikací
- Co je Kubernetes?
Linuxové technologie tvoří základy pro vytváření a provozování kontejnerového procesu ve vašem systému. Mezi technologie patří:
- Jmenné prostory
- Kontrolní skupiny (cgroups)
- Seccomp
- SELinux
Jmenné prostory
Jmenné prostory poskytuje kontejnerům vrstvu izolace tím, že kontejneru poskytuje pohled na to, co se zdá být jeho vlastním linuxovým souborovým systémem. To omezuje to, co proces může vidět, a proto omezuje zdroje, které má k dispozici.
V linuxovém jádře existuje několik jmenných prostorů, které používají Docker nebo Podman a další při vytváření kontejneru:
$ docker container run alpine ping 8.8.8.8
$ sudo lsns -p 29413
NS TYPE NPROCS PID USER COMMAND
4026531835 cgroup 299 1 root /usr/lib/systemd/systemd --
switched...
4026533105 mnt 1 29413 root ping 8.8.8.8
4026533106 uts 1 29413 root ping 8.8.8.8
4026533105 ipc 1 29413 root ping 8.8.8.8
[...]
Uživatel
Uživatelský jmenný prostor izoluje uživatele a skupiny v rámci kontejneru. Toho se dosáhne tím, že kontejnerům umožníte jiný pohled na rozsahy UID a GID ve srovnání s hostitelským systémem. Uživatelský jmenný prostor umožňuje, aby software běžel uvnitř kontejneru jako uživatel root. Pokud vetřelec zaútočí na kontejner a poté unikne do hostitelského počítače, je omezen pouze na identitu jiného uživatele než root.
Mnt
Jmenný prostor mnt umožňuje kontejnerům mít vlastní pohled na hierarchii systému souborů. Přípojné body pro každý proces kontejneru najdete v /proc/
UTS
Jmenný prostor Unix Timesharing System (UTS) umožňuje kontejnerům mít jedinečný název hostitele a název domény. Když spustíte kontejner, použije se náhodné ID jako název hostitele, i když použijete — name
štítek. Můžete použít unshare
příkaz, abyste získali představu, jak to funguje.
$ docker container run -it --name nived alpine sh
/ # hostname
9c9a5edabdd6
/ #
$ sudo unshare -u sh
# hostname isolated.hostname
# hostname
# exit
$ hostname
homelab.redhat.com
IPC
Jmenný prostor Inter-Process Communication (IPC) umožňuje různým procesům kontejneru komunikovat prostřednictvím přístupu ke sdílenému rozsahu paměti nebo pomocí sdílené fronty zpráv.
# ipcmk -M 10M
Shared memory id: 0
# ipcmk -M 20M
Shared memory id: 1
# ipcs
---- Message Queues ----
key msqid owner perms used-bytes messages
---- Shared Memory Segments
key shmid owner perms bytes nattch status
0xd1df416a 0 root 644 10485760 0
0xbd487a9d 1 root 644 20971520 0
[...]
PID
Jmenný prostor Process ID (PID) zajišťuje, že procesy běžící uvnitř kontejneru jsou izolované od vnějšího světa. Když spustíte ps
příkaz uvnitř kontejneru, uvidíte pouze procesy běžící uvnitř kontejneru a ne na hostitelském počítači kvůli tomuto jmennému prostoru.
Net
Síťový jmenný prostor umožňuje kontejneru mít vlastní pohled na síťové rozhraní, IP adresy, směrovací tabulky, čísla portů a tak dále. Jak může kontejner komunikovat s vnějším světem? Všechny kontejnery, které vytvoříte, se připojí ke speciálnímu rozhraní virtuální sítě pro komunikaci.
Kontrolní skupiny (cgroups)
Cgroups jsou základní bloky vytváření kontejneru. cgroup alokuje a omezuje zdroje, jako je CPU, paměť, síťové I/O, které kontejnery používají. Kontejnerový stroj automaticky vytvoří souborový systém cgroup každého typu a nastaví hodnoty pro každý kontejner, když je kontejner spuštěn.
SECCOMP
Seccomp v podstatě znamená zabezpečené výpočty . Je to funkce Linuxu, která se používá k omezení sady systémových volání, která může aplikace provádět. Výchozí profil seccomp pro Docker například zakáže přibližně 44 systémových volání (k dispozici je více než 300).
Cílem je poskytnout kontejnerům přístup pouze k těm zdrojům, které kontejner může potřebovat. Pokud například nepotřebujete kontejner ke změně času hodin na vašem hostitelském počítači, pravděpodobně nemáte využití pro clock_adjtime a clock_settime systémová volání a má smysl je blokovat. Podobně nechcete, aby kontejnery měnily moduly jádra, takže není potřeba, aby vytvořily create_module, delete_module systémová volání.
SELinux
SELinux znamená security-enhanced Linux . Pokud na svých hostitelích provozujete distribuci Red Hat, pak je SELinux ve výchozím nastavení povolen. SELinux vám umožňuje omezit aplikaci tak, aby měla přístup pouze k jejím vlastním souborům, a zabránit jiným procesům v přístupu k nim. Pokud je tedy aplikace kompromitována, omezilo by to počet souborů, které může ovlivnit nebo ovládat. Dělá to nastavením kontextů pro soubory a procesy a definováním zásad, které by vynutily, co může proces vidět a v čem provádět změny.
Zásady SELinux pro kontejnery jsou definovány container-selinux
balík. Ve výchozím nastavení jsou kontejnery spouštěny s container_t a mohou číst (r) a spouštět (x) pod /usr a číst většinu obsahu z /etc adresář. Štítek container_var_lib_t je běžné pro soubory týkající se kontejnerů.
Sbalit
Kontejnery jsou kritickou součástí dnešní IT infrastruktury a také docela zajímavou technologií. I když vaše role přímo nezahrnuje kontejnerizaci, pochopení několika základních konceptů a přístupů kontejnerů vám poskytne ocenění, jak mohou pomoci vaší organizaci. Skutečnost, že kontejnery jsou postaveny na open source linuxových technologiích, je činí ještě lepšími!
Tento článek je založen na článku techbeatly a byl upraven se svolením.