Was sind die Vor- und Nachteile von nichtprivilegierten Containern?

Antworten:

14

Das Ausführen von nicht privilegierten Containern ist die sicherste Möglichkeit, Container in einer Produktionsumgebung auszuführen. Container werden in Bezug auf die Sicherheit schlecht publiziert, und einer der Gründe ist, dass einige Benutzer festgestellt haben, dass es auch auf dem Host möglich ist, Root zu werden, wenn ein Benutzer Root in einem Container erhält. Grundsätzlich maskiert ein nicht privilegierter Container die Benutzer-ID vom Host. Bei nichtprivilegierten Containern können Nicht-Root-Benutzer Container erstellen und werden im Container als Root angezeigt, sie werden jedoch beispielsweise auf dem Host als Benutzer-ID 10000 angezeigt (unabhängig davon, wie Sie die Benutzer-IDs zuordnen). Ich habe kürzlich einen Blog-Beitrag dazu geschrieben, der auf Stephane Grabers Blog- Serie über LXC basiert (einer der brillanten Köpfe / Hauptentwickler von LXC und jemand, dem man definitiv folgen sollte). Ich sage es noch einmal, extrem brillant.

Aus meinem Blog:

Aus dem Container:

lxc-attach -n ubuntu-unprived
root@ubuntu-unprived:/# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 04:48 ?        00:00:00 /sbin/init
root       157     1  0 04:48 ?        00:00:00 upstart-udev-bridge --daemon
root       189     1  0 04:48 ?        00:00:00 /lib/systemd/systemd-udevd --daemon
root       244     1  0 04:48 ?        00:00:00 dhclient -1 -v -pf /run/dhclient.eth0.pid
syslog     290     1  0 04:48 ?        00:00:00 rsyslogd
root       343     1  0 04:48 tty4     00:00:00 /sbin/getty -8 38400 tty4
root       345     1  0 04:48 tty2     00:00:00 /sbin/getty -8 38400 tty2
root       346     1  0 04:48 tty3     00:00:00 /sbin/getty -8 38400 tty3
root       359     1  0 04:48 ?        00:00:00 cron
root       386     1  0 04:48 console  00:00:00 /sbin/getty -8 38400 console
root       389     1  0 04:48 tty1     00:00:00 /sbin/getty -8 38400 tty1
root       408     1  0 04:48 ?        00:00:00 upstart-socket-bridge --daemon
root       409     1  0 04:48 ?        00:00:00 upstart-file-bridge --daemon
root       431     0  0 05:06 ?        00:00:00 /bin/bash
root       434   431  0 05:06 ?        00:00:00 ps -ef

Vom Gastgeber:

lxc-info -Ssip --name ubuntu-unprived
State:          RUNNING
PID:            3104
IP:             10.1.0.107
CPU use:        2.27 seconds
BlkIO use:      680.00 KiB
Memory use:     7.24 MiB
Link:           vethJ1Y7TG
TX bytes:      7.30 KiB
RX bytes:      46.21 KiB
Total bytes:   53.51 KiB

ps -ef | grep 3104
100000    3104  3067  0 Nov11 ?        00:00:00 /sbin/init
100000    3330  3104  0 Nov11 ?        00:00:00 upstart-udev-bridge --daemon
100000    3362  3104  0 Nov11 ?        00:00:00 /lib/systemd/systemd-udevd --daemon
100000    3417  3104  0 Nov11 ?        00:00:00 dhclient -1 -v -pf /run/dhclient.eth0.pid -lf /var/lib/dhcp/dhclient.eth0.leases eth0
100102    3463  3104  0 Nov11 ?        00:00:00 rsyslogd
100000    3516  3104  0 Nov11 pts/8    00:00:00 /sbin/getty -8 38400 tty4
100000    3518  3104  0 Nov11 pts/6    00:00:00 /sbin/getty -8 38400 tty2
100000    3519  3104  0 Nov11 pts/7    00:00:00 /sbin/getty -8 38400 tty3
100000    3532  3104  0 Nov11 ?        00:00:00 cron
100000    3559  3104  0 Nov11 pts/9    00:00:00 /sbin/getty -8 38400 console
100000    3562  3104  0 Nov11 pts/5    00:00:00 /sbin/getty -8 38400 tty1
100000    3581  3104  0 Nov11 ?        00:00:00 upstart-socket-bridge --daemon
100000    3582  3104  0 Nov11 ?        00:00:00 upstart-file-bridge --daemon
lxc       3780  1518  0 00:10 pts/4    00:00:00 grep --color=auto 3104

Wie Sie sehen, werden im Container Prozesse als Root ausgeführt, die jedoch nicht als Root, sondern als 100000 vom Host angezeigt werden.

Fazit: Vorteile - Mehr Sicherheit und mehr Isolation für mehr Sicherheit. Nachteil - Es ist etwas verwirrend, zuerst den Kopf herumzureißen, nicht für Anfänger.

Geekbass
quelle
3
Wenn ich das richtig verstehe, sind Container für sich genommen nicht 100% sicher. Egal in welchem ​​Container Sie sich befinden, es besteht die Möglichkeit, dass das Tier entkommt. Und nur hier, wenn der Behältertyp wichtig wird. Für privilegierte Container läuft das Biest wild unter root, pflanzt Rootkits und kaut wertvolle SSL-Schlüssel. Für Unprivilegierte ist es nur auf das Benutzerkonto beschränkt, das den Container erstellt hat, oder? Diebstahl seiner SSH-Schlüssel usw. Ist das wirklich sicherer? Kann man das mit einem Bild von vier verschachtelten Kästen erklären?
anatoly techtonik
2
Kurz gesagt, Container selbst sind für den produktiven Einsatz nicht sicher. Behandeln Sie Ihre LXC-Umgebung wie jede andere Linux-Umgebung. Sie würden Ihre Linux-Box auch nicht offen lassen, oder ?! Ja, Ihr Container ist nur auf den beschränkt, dem das Benutzerkonto zugeordnet ist. Schauen Sie sich Grabers Beitrag zu nicht-gedruckten Containern an: Ich denke, das größte Problem ist die Möglichkeit, den Kernel und die Systemaufrufe auszunutzen, da jeder Container denselben Kernel verwendet. Es gibt verschiedene Möglichkeiten, die Sicherheit durch Cgroups und andere Anwendungen wie Selinux, Apparmor und Seccomp zu verbessern.
Geekbass
Erstellen Sie daher einen separaten eingeschränkten Benutzer zum Ausführen von Containern. Scheint fair zu sein. Ich akzeptiere das als Antwort. Vielen Dank.
anatoly techtonik
4

Sie sind sehr wertvolle Werkzeuge zum Testen, Sandboxen und Einkapseln. Möchten Sie, dass ein Webserver sicher in seiner eigenen Arbeitsumgebung gesperrt ist und nicht auf vertrauliche private Dateien zugreifen kann? Verwenden Sie einen Behälter. Sie haben eine Anwendung, für die alte Bibliotheksversionen und bestimmte Konfigurationsdateien erforderlich sind, die nicht mit anderen Anwendungen kompatibel sind? Auch ein Container. Es ist im Grunde chroot richtig gemacht. Auf diese Weise können Sie die Dienste so weit voneinander trennen, dass die Wartung erheblich vereinfacht wird. Sie können auf einen anderen Computer verschoben oder kopiert werden, ohne dass das vorhandene System gestört werden muss.

Der Nachteil ist, dass Sie sich den Namespace merken müssen, da fast alles lokal für den Container ist. Sie müssen wissen, wo Sie sich befinden, und die Kommunikation zwischen Containern ist nicht trivial. Dies ist eine gute Idee, wenn Sie Modularität benötigen, aber nicht den Overhead virtueller Maschinen möchten und die Dinge, die Sie in Containern aufbewahren, nicht viel miteinander zu tun haben.

Für einen "normalen" Benutzer können Sie Container verwenden, um eine einzelne Maschine für zwei Personen zu verwenden, während Sie diese so aufbewahren, als befänden sie sich auf völlig unterschiedlichen Maschinen. Zum Beispiel Mitbewohner.

orion
quelle
3
Eine gute menschliche Beschreibung dessen, wofür Container gedacht sind, erklärt den Unterschied zwischen privilegierten und nichtprivilegierten Containern nicht.
anatoly techtonik
1

Nun, mit einem gemeinsam genutzten Kernel sind ungeachtet dessen, dass die Anforderungen des Gegners, sich in gewisser Weise zu befreien (oder besser gesagt, die Angriffsfläche zu begrenzen), erhöht werden, nicht alle nicht privilegierten Container vollständig von geraden Hacks isoliert, die Host-Root-Status erlangen .

Aus diesem Grund ist es eine falsche Annahme / Behauptung. Das Niveau der technischen Eignung vieler Benutzer im Internet wird jedoch weiterhin inet-Dienste auf eine Vielzahl von Wegen ausführen, zu denen sie technisch nicht in der Lage sind, also hey. :)

Malina Salina
quelle