Was ist eine Capability?

Wörtlich übersetzt bedeutet der Begriff ``Capability'' Fähigkeit. Es existieren viele verschiedene Definitionen für den Begriff Capability im Zusammenhang mit Computersystemen. Während man allgemein ein Token, der von einem Prozess verwendet wird, um den Zugriff auf ein Objekt zur erhalten, als Capability bezeichnen kann, betrachten wir unter diesem Begriff die Capability, wie sie bei der Definition der POSIX-Capabilities beschrieben wurde.

Bei den POSIX-Capabilities handelt es sich um den Versuch, die Allmacht von root in unterschiedliche Privilegien aufzuteilen. In dem POSIX Draft 1003.1e sollten die Capabilities standardisiert werden. Leider hat sich dieser Draft nie durchgesetzt.

Jeder Prozess besitzt nun drei Bitmaps, in denen die Capabilities gespeichert werden:

Jede einzelne Capability wird als Bit in diesen Bitmaps dargestellt. Möchte nun ein Prozess eine privilegierte Operation durchführen, so prüft der Kernel, ob der Prozess über die entsprechende Capability verfügt. Vor Einführung der Capabilities wurde lediglich geprüft, ob der Prozess die effektive UID 0 (root) hatte. Möchte ein Prozess beispielsweise die IP-Adresse ändern, so benötigt er die Capability CAP_NET_ADMIN.

Der Satz der erlaubten Capabilities definiert, welche Capabilities der Prozess aktiv nutzen darf. Ein Prozess kann eine Capability vorübergehend in dem Satz der effektiven Capabilities deaktivieren und später wieder aktivieren. Mehr Capabilities, als sich im Satz der erlaubten Capabilities befinden, kann er aber nicht benutzen.

Die vererbbaren Capabilities geben an, welche Capabilities der aktuelle Prozess auf neue Prozesse vererben kann. Dies bezieht sich lediglich auf Prozesse, die mit exec() aufgerufen werden. Prozesse, die mit fork() oder clone() gestartet werden, erhalten eine exakte Kopie der Capability-Sets des Elternprozesses.

Aktuell unterstützt Linux Capabilities nur für Prozesse. Die POSIX Capabilities forderten auch diese Funktion für ausführbare Dateien. Dies ist aktuell unter Linux nur mit einem Patch erreichbar (siehe 5.4).

Ralf Spenneberg 2007-11-13