Capability-based security

aus Wikipedia, der freien Enzyklopädie

Capability-based security (deutsch Berechtigungsbasierte Sicherheit[-srichtlinien]) ist ein Sicherheitskonzept aus dem Bereich der Computeradministration.

Eine Fähigkeit / eine Berechtigung (englisch capability), die auch in manchen Systemen als Schlüssel bekannt ist, ist ein kommunizierbarer und unveränderbarer Authentifizierungstoken. Dieser bezieht sich auf einen Wert, der ein Objekt und ein dazu passendes Set von Zugriffsrechten darstellt. Ein Computerprogramm des Benutzers, das auf einem Fähigkeiten-basierenden Betriebssystem läuft, muss dementsprechende Fähigkeiten/Rechte haben, um auf Objekte zugreifen zu können.

Berechtigungsbasierte Sicherheit bezieht sich auf das Prinzip, dass Computerprogramme nach dem Prinzip der „minimalen Rechte“ (engl. principle of least privilege) untereinander kommunizieren und sich dementsprechend Fähigkeiten bzw. Berechtigungen zuweisen und dass das Betriebssystem die passende Infrastruktur hat, um effektiv und sicher arbeiten zu können. Fähigkeitsbasierte Sicherheit steht im Gegensatz zu der Ring- bzw. Domain-Methode (engl. hierarchical protection domains).

Die meisten Betriebssysteme implementieren Hilfsmittel, die diesen Fähigkeiten ähneln. Diese bieten oft nicht genügend Support an, um Fähigkeiten bzw. Berechtigungen zwischen dem Betriebssystem und unbekannten Instanzen auszutauschen, um damit die primäre Stelle für Zugriffsrechte zu sein. Im Gegensatz dazu ist ein fähigkeitsbasiertes System darauf ausgerichtet.

Die Fähigkeiten bzw. Berechtigungen, um die es in diesem Artikel geht, sollten nicht mit POSIX verwechselt werden.

Berechtigungen und berechtigungsbasierte Sicherheit

Berechtigungen verbessern die Systemsicherheit, indem sie anstelle von veränderbaren Referenzen verwendet werden. Eine veränderbare Referenz (z. B. ein Pfadname) identifiziert ein Objekt, gibt aber nicht an, welche Zugriffsrechte für dieses Objekt vorhanden sind, und das Anwenderprogramm, das diese Referenz enthält. Daher muss jeder Zugriff auf das referenzierte Objekt vom Betriebssystem auf der Grundlage der Berechtigungen des anfragenden Programms validiert werden, das typischerweise über die Verwendung einer Zugriffssteuerungsliste (ACL) passiert. Im Gegenteil dazu, ist in einem System mit Rechten der reine Besitz gewisser Berechtigungen ausreichend, um auf referenzierte Objekte zugreifen zu können. Theoretisch sind in einem solchen System keine Zugriffssteuerungslisten oder ähnlichen Technologien vonnöten, da alle Entitäten nur diejenigen Fähigkeiten besitzen, die sie tatsächlich benötigen.

Eine Berechtigung bzw. eine Fähigkeit wird typischerweise als eine privilegierte Datenstruktur implementiert, die aus zwei Teilen besteht, der eine spezifiziert Zugriffsrechte und der andere identifiziert das zuzuordnende Objekt eindeutig. Der Benutzer greift nicht direkt auf die Datenstruktur oder das Objekt zu, sondern über einen Handle. In der Praxis gleicht die Verwendung oftmals der eines Dateihandles in einem traditionellen Betriebssystem (ein traditioneller Handle) verwendet, betrifft aber dem Zugriff auf jedes Objekt des Systems. Die Fähigkeiten werden typischerweise vom Betriebssystem in einer Liste gespeichert, wobei eine Sicherheit implementiert ist, um zu verhindern, dass das Programm den Inhalt der Fähigkeit direkt ändert. Einige Systeme basieren ebenfalls auf einer fähigkeitsorientierten Adressierung (in etwa gleichbedeutend mit einer Hardwareunterstützung für Fähigkeiten), wie das Plessey System 250.

Programme, die Fähigkeiten besitzen, können Funktionen auf diesen durchführen, wie z. B. diese an andere Programme weitergeben, sie in eine weniger privilegierte Version umwandeln oder sie löschen. Das Betriebssystem muss sicherstellen, dass nur bestimmte Operationen für die Fähigkeiten im System auftreten können, um die Integrität der Sicherheitspolitik aufrechtzuerhalten.

Einführung in berechtigungsbasierte Sicherheit

Eine Fähigkeit bzw. ein eine Berechtigung ist definiert als eine geschützte Objektreferenz, die aufgrund ihrer Eigenschaft einem Prozess die Erlaubnis bzw. Fähigkeit gibt, mit einem Objekt zu interagieren. Dies könnten das Lesen von Daten, die mit einem Objekt verbunden sind, das Ändern des Objekts, das Ausführen der Daten und andere denkbare Zugriffsrechte betreffen. Die Fähigkeit besteht daher logischerweise aus einer Referenz, die ein bestimmtes Objekt eindeutig identifiziert und eine oder mehrerer dieser Berechtigungen besitzt.

Angenommen, in dem Speicherplatz eines Programmes existiert der folgende String:

/etc/passwd

Obwohl dies ein eindeutiges Objekt auf dem System identifiziert, gibt es keine Zugriffsrechte an und ist daher keine Fähigkeit. Angenommen, es gibt stattdessen die folgenden zwei Werte:

/etc/passwd
O_RDWR

Dies identifiziert ein Objekt zusammen mit dessen Zugriffsrechten. Es ist jedoch noch keine Fähigkeit, weil ein Besitz dieser Werte nichts darüber sagt, ob dieser Zugang tatsächlich legitim wäre.

Nehmen wir nun an, dass das Anwenderprogramm die folgende Anweisung erfolgreich ausführt:

int fd = open("/etc/passwd", O_RDWR);

Die Variable fd enthält nun den Index eines Dateihandles in der Dateihandletabelle des Prozesses. Dieser Dateihandle ist eine Fähigkeit. Seine Existenz in der Dateihandletabelle des Prozesses reicht aus, um zu wissen, dass der Prozess tatsächlich einen legitimen Zugriff auf das Objekt hat. Ein wesentliches Merkmal dieser Anordnung ist, dass sich die Dateihandletabelle im Kernspeicher befindet und nicht direkt vom Anwenderprogramm manipuliert werden kann.

Austausch von Fähigkeiten zwischen Prozessen

In traditionellen Betriebssystemen kommunizieren Programme oft miteinander, indem Pfadnamen als Befehlszeilenparameter übergeben oder über Sockets gesendet werden. Diese Referenzen sind keine Fähigkeiten und müssen validiert werden, bevor sie verwendet werden können. In diesen Systemen ist die zentrale Frage, nach welcher Autorität eine gegebene Referenz zu beurteilen ist. Dies wird ein kritisches Thema bei Prozessen, die von zwei unterschiedlichen Entitäten mit verschiedenen Rechten ausgeführt werden. Dies kann zu einem häufig auftretenden Programmierfehler führen, der als Confused deputy problem (deutsch Problem des verwirrten Stellvertreters) bezeichnet wird und zu Sicherheitslücken führen kann.

In einem fähigkeitsbasierten System werden die Fähigkeiten zwischen Prozessen und der Speicherung über einen Mechanismus übergeben, der vom Betriebssystem bekannt ist, um die Integrität dieser Fähigkeiten aufrechtzuerhalten.

Ein neuartiger Ansatz zur Lösung dieses Problems beinhaltet die Verwendung eines orthogonal persistierenden Betriebssystems. (Dies wurde in der Flex-Maschine realisiert.) In einem solchen System besteht keine Notwendigkeit, Entitäten zu verwerfen und ihre Fähigkeiten ungültig zu machen und benötigen daher einen ACL-ähnlichen Mechanismus, um diese Fähigkeiten zu einem späteren Zeitpunkt wiederherstellen zu können. Das Betriebssystem behält die Integrität und Sicherheit der Fähigkeiten, die im gesamten Speicher enthalten sind, sowohl flüchtige als auch nichtflüchtige; zum Teil durch die Durchführung aller Serialisierungsaufgaben, anstatt die Benutzerprogramme dies machen zu lassen, wie dies bei den meisten Betriebssystemen der Fall ist. Da die Anwenderprogramme von dieser Verantwortung entlastet werden, besteht keine Notwendigkeit ihre Rechte und Fähigkeiten noch ihre Zugangsanfragen zu validieren.

POSIX vs. Capsicum Fähigkeiten

POSIX draft 1003.1e spezifiziert ein Konzept der Berechtigungen mit dem Namen "Fähigkeiten". Allerdings unterscheiden sich POSIX-Fähigkeiten von den Fähigkeiten in diesem Artikel. Eine POSIX-Fähigkeit ist nicht mit einem Objekt verbunden; Ein Prozess mit CAP_NET_BIND_SERVICE-Fähigkeit kann auf den TCP-Port 1024 zugreifen. Im Gegensatz dazu verbinden Capsicum-Fähigkeiten auf FreeBSD und Linux ein echtes Fähigkeiten-System mit dem UNIX-Design und der POSIX API. Capsicum-Fähigkeiten sind eine verfeinerte Form des Dateihandles. Ein delegierbares Recht zwischen Prozessen und zusätzlichen Objekttypen, das über das klassische POSIX (z. B. Prozess) ragt, können über Fähigkeiten referenziert werden. Im Capsicum-Fähigkeitsmodus können Prozesse nicht globale Namensräume (wie z. B. den Dateinamen des Dateisystems) verwenden, um Objekte zu finden, und müssen stattdessen vererbt werden oder sie bekommen die Objekte von anderen Prozessen.

Forschung und kommerzielle Systeme

Siehe auch

Literatur

Weblinks

Einzelnachweise