Vorgedanken

Jedes UML sollte unter einer eigenen Nutzer-ID laufen - also keinesfalls als root-Prozess.

Auf die Daten- und System-Images hat jeweils nur dieser Nutzer Zugriff.

Dies würde simplerweise folgendermaßen aussehen:

su - UMLUSER /uml/kernel/stable ubd0=SYSIMAGE ubd1=DATAIMAGE daemon,,unix,UMLNET_SOCKET 

Die Nutzer müssen in der Gruppe uml-net sein, damit sie den gemeinsamen Netzwerk-Socket, der vom uml_switch-Daemon verwaltet wird, nutzen können.

User-Mode-Linux wurde jedoch nicht vorrangig unter Sicherheitsaspekten entwickelt. Es bietet also eine gute, aber nicht ausreichende Sicherheit.

Eine chroot-Umgebung schützt das Host-System zusätzlich vor einem potentiellen UML-Eindringling.

Die folgenden Schritte stammen von http://uml.harlowhill.com/index.php/Chroot.

Verzeichnis-Struktur

Die chroot-Umgebung wird unter /uml/chrootjail/ liegen.

Im Unterverzeichnis guests befinden sich die Verzeichnisse der einzelnen User-Mode-Systeme.

Jedes dieser Verzeichnisse hat folgenden Inhalt:

UMLNAME-sys.img
das Betriebssystem-Abbild
UMLNAME-data.img
das Daten-Abbild
uml-UMLNAME
ein Link auf den verwendeten Kernel (sinnvoll, damit die Prozesse ver UMLs unterscheidbare Namen tragen)
.ssh

Schlüssel, authorized_keys und known_hosts

Rechte und Besitzer

Jedes UML-Verzeichnis gehört root und der Gruppe uml-net mit den Rechten 0710.

Die Daten- und System-Abbilder gehören dem UML-Nutzer und sind nur ihm zugänglich (0600).

Die ssh-Dateien id_rsa und id_rsa.pub gehören dem UML-Nutzer, jedoch ohne Schreibrechte (0400) - naja - vielleicht hilft's :)

Die übrigen Dateien und Verzeichnisse gehören root.

Externe Dateien

Für das UML in der chroot-Umgebung werden nur wenige Dinge benötigt:

/proc/mm
Zum Zugriff auf den Arbeitsspeicher
/proc/cpuinfo
wohl vor allem für ältere UML-Kernel nötig
/dev/net/tun
das Netzwerk-Device
/tmp
Terminals benötigen temporäre Dateien
/net-socket/uml-net.sock

der Socket des uml_switch-Daemon

/vmlinuz

der Kernel (er muss statisch kompiliert sein - also beispielsweise der debian-User-Mode-Kernel)

Einrichtung

einmalig

{{{mkdir /uml/chrootjail cd /uml/chrootjail mkdir -p dev/net proc net-socket tmp cp /proc/cpuinfo proc touch proc/mm (sonst klappt das mount-bind nachher nicht) mknod dev/net/tun c 10 200 chown -R root. . chgrp uml-net . dev/net/tun net-socket chmod 177 tmp chmod 660 dev/net/tun chmod 770 net-socket cp /usr/bin/linux vmlinuz }}}

bei jedem Booten des Hosts

mount --bind /proc/mm /uml/chrootjail/proc/mm 

Starten eines UML

Um gleichzeitig die Nutzer-ID zu wechseln und eine chroot-Umgebung zu erzeugen, gibt es beispielsweise folgende Programme:

Zum Starten verwenden wir das Skript /uml/scripts/starte_uml_guest.sh. Der einzige Parameter ist der Name des User-Mode-Systems.

Was fehlt?

Erzeugung ausführbarer Dateien

getrennte chroot-Umgebungen

Zur weiteren Isolierung der UML-Gastsysteme voneinander, wäre es sinnvoll, getrennte chroot-Umgebungen anzulegen. Allerdings würde dies sehr viele mount-Prozesse (für /proc/mm und den Netzwerk-Socket) erfordern.

UML-Sicherheit (zuletzt geändert am 2012-06-13 21:26:19 durch anonym)


Creative Commons Lizenzvertrag
This page is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.