In früheren Artikeln habe ich über Container-Images und Laufzeiten geschrieben. In diesem Artikel betrachte ich, wie Container durch eine Grundlage einiger spezieller Linux-Technologien, einschließlich Namespaces und Kontrollgruppen, ermöglicht werden.
1linuxtechs.png
Abbildung 1: Linux-Technologien, die zu Containern beitragen
(Nived Velayudhan, CC BY-SA 4.0)
Linux-Technologien bilden die Grundlage für den Aufbau und die Ausführung eines Containerprozesses auf Ihrem System. Zu den Technologien gehören:
- Namensräume
- Kontrollgruppen (cgroups)
- Seccomp
- SELinux
Namensräume
Namensräume Bieten Sie eine Isolationsschicht für die Container, indem Sie dem Container eine Sicht auf ein scheinbar eigenes Linux-Dateisystem geben. Dies schränkt die Sichtbarkeit eines Prozesses und damit die ihm zur Verfügung stehenden Ressourcen ein.
Es gibt mehrere Namespaces im Linux-Kernel, die von Docker oder Podman und anderen beim Erstellen eines Containers verwendet werden:
$ 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
[...]
Benutzer
Der Benutzernamensraum isoliert Benutzer und Gruppen innerhalb eines Containers. Dies wird erreicht, indem Containern eine andere Ansicht der UID- und GID-Bereiche im Vergleich zum Hostsystem ermöglicht wird. Der Benutzernamensraum ermöglicht die Ausführung der Software innerhalb des Containers als Root-Benutzer. Wenn ein Eindringling den Container angreift und dann zum Host-Rechner entkommt, ist er nur auf eine Nicht-Root-Identität beschränkt.
Mnt
Der mnt-Namespace ermöglicht es den Containern, ihre eigene Ansicht der Dateisystemhierarchie des Systems zu haben. Die Mount-Punkte für jeden Containerprozess finden Sie im /proc/
UTS
Der Unix Timesharing System (UTS)-Namespace ermöglicht es Containern, einen eindeutigen Hostnamen und Domänennamen zu haben. Wenn Sie einen Container ausführen, wird eine zufällige ID als Hostname verwendet, auch wenn Sie den — name
Schild. Du kannst den … benutzen unshare
Befehl, um eine Vorstellung davon zu bekommen, wie das funktioniert.
$ docker container run -it --name nived alpine sh
/ # hostname
9c9a5edabdd6
/ #
$ sudo unshare -u sh
# hostname isolated.hostname
# hostname
# exit
$ hostname
homelab.redhat.com
IPC
Der Namespace Inter-Process Communication (IPC) ermöglicht verschiedenen Containerprozessen die Kommunikation, indem sie auf einen gemeinsam genutzten Speicherbereich zugreifen oder eine gemeinsam genutzte Nachrichtenwarteschlange verwenden.
# 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
Der Namespace Process ID (PID) stellt sicher, dass die Prozesse, die in einem Container ausgeführt werden, von der Außenwelt isoliert sind. Wenn du läufst ps
Befehl innerhalb eines Containers sehen Sie nur die Prozesse, die innerhalb des Containers und nicht auf dem Host-Rechner aufgrund dieses Namensraums ausgeführt werden.
Netz
Der Netzwerk-Namespace ermöglicht dem Container eine eigene Ansicht der Netzwerkschnittstelle, IP-Adressen, Routing-Tabellen, Portnummern usw. Wie kann ein Container mit der Außenwelt kommunizieren? Alle von Ihnen erstellten Container werden zur Kommunikation an eine spezielle virtuelle Netzwerkschnittstelle angehängt.
Kontrollgruppen (cgroups)
Cgroups sind grundlegende Bausteine für die Erstellung eines Containers. Eine Kontrollgruppe ordnet und begrenzt Ressourcen wie CPU, Speicher, Netzwerk-E/A, die von Containern verwendet werden. Die Container-Engine erstellt automatisch ein Kontrollgruppen-Dateisystem jedes Typs und legt Werte für jeden Container fest, wenn der Container ausgeführt wird.
SECCOMP
Seccomp steht im Grunde für sicheres Rechnen. Es ist eine Linux-Funktion, die verwendet wird, um die Menge der Systemaufrufe einzuschränken, die eine Anwendung ausführen darf. Das Standardprofil seccomp für Docker beispielsweise deaktiviert etwa 44 Systemaufrufe (über 300 sind verfügbar).
Die Idee hier ist, Containern nur Zugriff auf die Ressourcen zu gewähren, die der Container möglicherweise benötigt. Wenn Sie beispielsweise den Container nicht benötigen, um die Uhrzeit auf Ihrem Host-Rechner zu ändern, haben Sie wahrscheinlich keine Verwendung für die clock_adjtime und clock_settime Systemaufrufe, und es ist sinnvoll, sie zu blockieren. Ebenso möchten Sie nicht, dass die Container die Kernel-Module ändern, also müssen sie nicht gemacht werden create_module, delete_module Systemaufrufe.
SELinux
SELinux steht für sicherheitsoptimiertes Linux. Wenn Sie auf Ihren Hosts eine Red Hat-Distribution ausführen, ist SELinux standardmäßig aktiviert. Mit SELinux können Sie eine Anwendung auf den Zugriff auf ihre eigenen Dateien beschränken und verhindern, dass andere Prozesse darauf zugreifen. Wenn also eine Anwendung kompromittiert wird, würde dies die Anzahl der Dateien einschränken, die sie beeinflussen oder kontrollieren kann. Dazu werden Kontexte für Dateien und Prozesse eingerichtet und Richtlinien definiert, die erzwingen, was ein Prozess sehen und ändern kann.
SELinux-Richtlinien für Container werden von der container-selinux
Paket. Standardmäßig werden Container mit dem container_t Label und dürfen lesen (r) und ausführen (x) unter dem /usr Verzeichnis und lesen Sie die meisten Inhalte aus dem /etc Verzeichnis. Das Etikett container_var_lib_t ist bei Dateien im Zusammenhang mit Containern üblich.
Einpacken
Container sind ein wichtiger Bestandteil der heutigen IT-Infrastruktur und auch eine ziemlich interessante Technologie. Auch wenn Ihre Rolle nicht direkt die Containerisierung umfasst, können Sie durch das Verständnis einiger grundlegender Containerkonzepte und -ansätze erkennen, wie sie Ihrem Unternehmen helfen können. Die Tatsache, dass Container auf Open-Source-Linux-Technologien basieren, macht sie noch besser!
Dieser Artikel basiert auf einem Techbeatly-Artikel und wurde mit Genehmigung angepasst.