Multi-Level-Security

Multi-Level-Security wurde bereits in 3.3 beschrieben. Daher soll hier nicht erneut darauf eingegangen werden. SELinux hat immer schon MLS unterstützt, jedoch war der Einsatz lange Zeit experimentell und für kommerzielle Anwendungen nicht geeignet. Ab dem Kernel 2.6.12 ist ein neues und überarbeitetes Modell im Linux Kernel vorhanden, welches sowohl Multi-Level- als auch Multi-Category-Security (MCS) anbietet.

Die aktuellen SELinux-Implementierungen unterstützen die MLS und MCS. Wenn Sie prüfen möchten, ob dass auch für Ihr System zutrifft, können Sie das mit dem Befehl semanage oder id prüfen:

[root@supergrobi ~]# id -Z
root:staff_r:staff_t:SystemLow-SystemHigh
[root@supergrobi ~]$ /usr/sbin/semanage translation -l

Level                     Translation

s0
s0-s15:c0.c255            SystemLow-SystemHigh
s0:c0.c255                SystemHigh
Der Security-Context enthält dann ein zusätzliches Feld. Dieses Feld besteht in Wirklichkeit aus bis zu zwei Feldern: Sensitivity und Compartment (oder Category). Jedes Objekt besitzt nun genau eine MLS-Markierung. Diese Markierung ist für die meisten Objekte SystemLow oder auch s0. Besondere Objekte wie /dev/mem erhalten eine andere Markierung (z.B. SystemHigh):
[root@supergrobi ~]# ls -Z /dev/mem
crw-r-----  root kmem system_u:object_r:memory_device_t:SystemHigh /dev/mem

Jeder Prozess erhält einen MLS-Bereich (Range) zugewiesen. Dieser wird auch bei neuen Prozessen vererbt. Allerdings kann es zu Bereichstransitionen (range_transition) kommen.

Damit nun ein Prozess auf eine Ressource zugreifen darf, müssen die MLS-Eigenschaften des Prozesses und der Ressource ein bestimmtes Verhältnis aufweisen. Damit ein Prozess eine Datei lesen oder ausführen darf, gilt die folgende SELinux-Regel:

mlsconstrain { dir file lnk_file chr_file blk_file 
   sock_file fifo_file }
  { read getattr execute }
    (( l1 dom l2 ) or 
     (( t1 == mlsfilereadtoclr )
          and ( h1 dom l2 )) or 
     ( t1 == mlsfileread ) or
     ( t2 == mlstrustedobject ));
Diese Regel ist im Moment sicherlich noch nicht einfach nachzuvollziehen. Aber ich möchte dennoch versuchen, den wesentlichen Teil zu erläutern. Ein Constraint ist eine Einschränkung, die immer erfüllt sein muss, damit ein Zugriff erlaubt wird. Hier handelt es sich um den lesenden (read) oder ausführenden (execute) Zugriff auf Dateien (file) oder Verzeichnisse (dir). Dieser wird nur gewährt, wenn ( l1 dom l2 ). Die Platzhalter l1 und l2 stehen für den MLS-Wert des Subjektes und des Objektes. Von Dominanz (l1 dom l2) spricht man, wenn die Sicherheitstufe l1 höher oder gleich der Stufe l2 ist. Gelesen werden dürfen Dateien also nur von Prozessen, die mindestens dieselbe Sicherheitsstufe aufweisen. Umgekehrt ist ein Schreibzugriff nur erlaubt, wenn das Subjekt von dem Objekt dominiert wird. Die Sicherheitstufe des Objektes l2 ist also mindestens dieselbe Stufe. Ein Schreiben und Lesen ist damit nur möglich, wenn das Subjekt (Prozess) und das Objekt über identische Sicherheitsstufen verfügen.

Ralf Spenneberg 2007-11-13