Die herkömmliche Methode, um einen Prozess
einzuschränken, besteht in dem Systemaufruf
chroot()
. Dieser Aufruf
ändert das Wurzelverzeichnis, auf das sich alle
Pfadangaben des Prozesses und jegliche Kind-Prozesse beziehen.
Damit dieser Systemaufruf gelingt, muss der Prozess
Ausführungsrechte (Durchsuchungsrechte) für das
Verzeichnis haben, auf das er sich bezieht. Die neue Umgebung
wird erst wirksam, wenn Sie mittels
chdir()
in Ihre neue Umgebung wechseln.
Es sollte erwähnt werden, dass ein Prozess recht einfach
aus der chroot-Umgebung ausbrechen kann, wenn er root-Rechte
besitzt. Das kann man erreichen, indem man Gerätedateien
anlegt, um Kernel-Speicher zu lesen, oder indem man einen
Debugger mit einem Prozess außerhalb seiner
chroot(8)-Umgebung verbindet, oder auf viele andere
kreative Wege.
Das Verhalten des Systemaufrufs
chroot()
kann durch die
kern.chroot.allow_open_directories
sysctl
-Variable beeinflusst werden. Wenn
diese auf 0 gesetzt ist, wird chroot()
mit EPERM fehlschlagen, wenn irgendwelche Verzeichnisse
geöffnet sind. Wenn die Variable auf den Standardwert 1
gesetzt ist, wird chroot()
mit EPERM
fehlschlagen, wenn irgendwelche Verzeichnisse geöffnet
sind und sich der Prozess bereits in einer
chroot()
-Umgebung befindet. Bei jedem
anderen Wert wird die Überprüfung auf
geöffnete Verzeichnisse komplett umgangen.
Das Konzept einer Jail (Gefängnis) erweitert
chroot()
, indem es die Macht des
Superusers einschränkt, um einen echten 'virtuellen
Server' zu erzeugen. Wenn ein solches Gefängnis einmal
eingerichtet ist, muss die gesamte Netzwerkkommunikation
über eine bestimmte IP-Adresse erfolgen und die
"root-Privilegien" innerhalb der Jail sind sehr stark
eingeschränkt.
Solange Sie sich in einer Jail befinden, werden alle
Tests auf Superuser-Rechte durch den Aufruf von
suser()
fehlschlagen. Allerdings wurden
einige Aufrufe von suser()
abgeändert, um die neue
suser_xxx()
-Schnittstelle zu
implementieren. Diese Funktion ist dafür verantwortlich,
festzustellen, ob bestimmte Superuser-Rechte einem
eingesperrten Prozess zur Verfügung stehen.
Ein Superuser-Prozess innerhalb einer Jail darf folgendes:
setuid
,
seteuid
,
setgid
,
setegid
,
setgroups
,
setreuid
,
setregid
,
setlogin
setrlimit
chroot()
chflags
,
fchflags
Jail
s sind ein mächtiges
Werkzeug, um Anwendungen in einer sicheren Umgebung
auszuführen, aber sie haben auch ihre Nachteile.
Derzeit wurden die IPC-Mechanismen noch nicht an
suser_xxx
angepasst, so dass Anwendungen
wie MySQL nicht innerhalb einer Jail ausgeführt werden
können. Der Superuser-Zugriff hat in einer Jail nur eine
sehr eingeschränkte Bedeutung, aber es gibt keine
Möglichkeit zu definieren was
"sehr eingeschränkt" heißt.
POSIX® hat einen funktionalen Entwurf (Working Draft) herausgegeben, der Ereignisüberprüfung, Zugriffskontrolllisten, feiner einstellbare Privilegien, Informationsmarkierung und verbindliche Zugriffskontrolle enthält.
Dies ist im Moment in Arbeit und das Hauptziel des TrustedBSD-Projekts. Ein Teil der bisherigen Arbeit wurde in FreeBSD-CURRENT übernommen (cap_set_proc(3)).
Wenn Sie Fragen zu FreeBSD haben, schicken Sie eine E-Mail an
<de-bsd-questions@de.FreeBSD.org>.
Wenn Sie Fragen zu dieser Dokumentation haben, schicken Sie eine E-Mail an
<de-bsd-translators@de.FreeBSD.org>.