5.3 EJB Security Client/Server-Komponententechnologie basierend auf Java. Enterprise Java Beans sind Komponenten der Geschäftsapplikation. Applikations-Server führen EJBs in Containern aus. Applikations-Server interagiert mit Systemressourcen (z.B. Datenbank) und verteilten Beans auf anderen Servern. Der Applikations-Server handhabt die Sicherheitseinstellungen. Enterprise Java Beans (EJB) sind eine Client/Server-Komponententechnologie für die Entwicklung und das Deployment verteilter Komponenten basierend auf der Java-Plattform. Enterprise Java Beans sind Komponenten der Geschäftsapplikation, z.B. Kunde, Auftrag, Rechnung etc und werden von Applikations-Servern in Containern ausgeführt. Der Applikationsserver bzw. der Container interagiert mit den Systemressourcen (z.B. Datenbank) und übernimmt auch die Interaktion mit verteilten Beans in anderen Servern. Außerdem kontrolliert der Applikationsserver die Sicherheitseinstellungen. 1 5.3 EJB Security Es gibt drei Arten von EJBs Session Bean: Bearbeitet Anfragen eines Clients in einer Session. Ist nicht persistent. Es wird zwischen Stateless Session Beans ( keinem speziellen Client zugeordnet) und Stateful Session Beans (einem Client zugeordnet) unterschieden. Entity Bean: Geschäftsobjekt-Komponente die persistent gehalten wird (z.B. in Datenbank) Message-Driven Bean: Reagiert auf Nachrichten und wird erst beim Eintreffen einer Nachricht aktiv. Es gibt prinzipiell drei Arten von Enterprise Java Beans: Session Bean: Führt Anfragen eines Clients während einer Session aus und beschäftigt sich ausschließlich mit dem Client. Es existiert nur für die Zeit der Session (nicht persistent). Es kann Schritte und Daten der Interaktion zwischenspeichern (z.B. Einkaufswagen). Entity Bean: Eine Geschäftslogik-Komponente, die persistent gehalten werden muss (meist mit Datenbanken über JDBC). Message-Driven Beans: Werden nicht über Schnittstellen angesprochen, sondern reagieren auf Nachrichten. Die Bean wird nur beim Eintreffen einer Nachricht aktiv. 2 5.3 EJB Security Zum Erstellen eines EJBs ist folgendes zu tun: Remote Interface Schnittstelle mit den Operationen, die ein Client aufrufen kann. Home Interface Operationen zum Lifecycle-Management (Erzeugen, Zerstören etc.). Dient als Factory. Bean Implementation Implementiert die Operationen des Remote Interface. Deployment-Deskriptor (in XML) Defniert das Bean mit den Informationen, die für das Deployment des Bean relevant sind. Um eine EJB zu erstellen, müssen folgende Java-Dateien erstellt werden: • Remote Interface definiert die Operationen die von Clienten aufgerufen werden können. • Das Home Interface dient als Factory. Es enthält beispielsweise Operationen für das Lifecycle-Management der Bean wie seine Erzeugung oder Zerstörung. Der EJB Container erzeugt dann die Instanzen der Bean. • Die Bean implementation implementiert die Operationen, die im Remote Interface spezifiziert sind. Außerdem muss die Bean im XML-Deployment-Deskriptor definiert werden. Der Deployment-Deskriptor enthält relevante Informationen für das Deployment der Bean auf dem EJB-Server. Der Deskriptor ist als XML-Datei implementiert. 3 5.3 EJB Security 3: erzeuge EJB Object Client 1: frage nach Home Object Reference Home Interface 5: EJB Reference 6: Methodenaufruf EJB Container/Server Home Object 4: erzeuge EJB Object Remote Interface EJB Object 2:Home Object Reference Naming Service Die Folie zeigt den grundlegenden Aufbau für den Aufruf von EJB Komponenten. Eine ClientAnwendung benutzt einen Namensservice (naming service) zum Aufruf eines EJBs, welches sich in einem EJB-Container befindet. Der EJB-Container stellt eine Laufzeitumgebung für EJBs zur Verfügung. Der Standard-Ablauf beim Aufruf eines EJBs auf dem Server sieht wie folgt aus: 1. Der Client erhält die EJB Home Object Reference mittels des Naming Service, der üblicherweise vom Applikationsserver zur Verfügung gestellt wird. 2. Der Naming Service gibt die EJB Home Object Reference zurück, die vom Client benötigt wird, um eine EJB Instanz zu erzeugen. 3. Nachdem das EJB Home Object bekannt ist, erzeugt der Client eine Instanz des EJBs durch einen Aufruf der entsprechenden Operation des Home Interfaces. 4. Das EJB Home Object erzeugt das EJB Object. 5. Eine Referenz auf das EJB Home Object wird dem Clienten zurückgeliefert. 6. Nachdem das EJB Object erzeugt wurde, kann der Client die Methoden des EJBs mittels des EJB Object Remote Interfaces aufrufen. 4 5.3 EJB Security Remote Interface – HelloWorld.java package helloworld; import javax.ejb.EJBObject; import java.rmi.RemoteException; // remote interface for `HelloWorld' EJB. public interface HelloWorld extends EJBObject { public void sayHello() throws RemoteException; } Auf den folgenden Folien ist ein „Hello World“ Beispiel gezeigt, welches die Schritte zur Erstellung eines Stateless Session Beans zeigt. Zunächst wird das Remote Interface definiert. In diesem Beispiel gibt es eine Schnittstellenoperation sayHello(). Remote Interfaces sind immer von EJBObject abgeleitet. 5 5.3 EJB Security Home Interface – HelloWorldHome.java package helloworld; import java.io.Serializable; import java.rmi.RemoteException; import javax.ejb.CreateException; import javax.ejb.EJBHome; // Home interface for the HelloWorld EJB. public interface HelloWorldHome extends EJBHome { // Creates an instance of the HelloWorldBean class on the server. HelloWorld create() throws RemoteException, CreateException; } Das Home Interface enthält nur eine Operation zum Erzeugen eines HelloWorld-Beans. Das Home Interface erweitert immer EJBHome. 6 5.3 EJB Security Bean Implementation - HelloWorldBean.java package helloworld; import java.rmi.RemoteException; import javax.ejb.SessionBean; import javax.ejb.SessionContext; public class HelloWorldBean implements SessionBean { public void sayHello() { System.out.println("Hello World"); } .... Die Operationen des Remote Interfaces werden in der Bean Implementation Klasse implementiert. Da wir nur die Operation sayHello() im Remote Interface haben, ist auch nur diese zu implementieren. Wir implementieren die Bean als Session Bean. Das die Session Bean stateless ist, wird erst im Deployment Descriptor angegeben. Neben den Operationen im Remote Interface müssen möglicherweise weitere Operationen implementiert werden (z.B. muss für jede create() Operation im Home Interface die Operation ejbCreate() und ejbPostCreate() implementiert werden). 7 5.3 EJB Security Deployment Descriptor – ejb-jar.xml <ejb-jar> <description>HelloWorld example EJB</description> <display-name>HelloWorld EJB</display-name> <enterprise-beans> <session> <ejb-name>HelloWorld</ejb-name> <home>helloworld.HelloWorldHome</home> <remote>helloworld.HelloWorld</remote> <ejb-class>helloworld.HelloWorldBean</ejb-class> <session-type>Stateless</session-type> </session> </enterprise-beans> </ejb-jar> Der Deployment Descriptor (ejb-jar-xml) ist eine XML-Datei, die die Informationen zu den Enterprise Beans zusammenfasst, die zum Deployment auf dem Applikations-Server notwendig sind. Die Informationen zu einem EJB werden innerhalb des Elements <enterprisebean> spezifiziert. Dazu gehört der Name, unter dem die Bean im Container bekannt sein soll (<ejb-name>), das Home Interface (<home>), das Remote Interface (<remote>) und die Implementierung der Bean (<ejb-class>). Bei session beans kann auch der Session-Typ angegeben werden (als Wert des Elements <session-type>, entweder stateless oder stateful). 8 5.3 EJB Security Client package helloworld; import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; import helloworld.HelloWorld; import helloworld.HelloWorldHome; public class HelloWorldClient { public static void main(String[] args) { try { // Get a naming context InitialContext jndiContext = new InitialContext(); Nachdem die Bean auf dem Applikations-Server installiert wurde, können sich Clienten an den Server wenden und auf die Bean zugreifen. Dazu muss sich der Client erst den Namenskontext holen, um von dort eine Referenz auf das Bean Home Interface zu erfragen. 9 // Get a reference to the Bean's Home interface Object ref = jndiContext.lookup("HelloWorld"); HelloWorldHome home = (HelloWorldHome) PortableRemoteObject.narrow(ref, HelloWorldHome.class); // Invoke creation of remote Bean-instance HelloWorld helloworld = home.create(); // call the method sayHello() helloworld.sayHello(); } catch (Exception e) { System.out.println(e.toString()) }; Nachdem der Client den Namenskontext hat, fragt er nach der Referenz auf das Home Interface der Bean. Dazu benutzt der Client den Namen der Bean, der im Deployment Descriptor im Element <ejb-name> angegeben ist. Da der Namenskontext nur eine Referenz vom Typ Object liefert, wird diese noch zum richtigen Typ umgewandelt. Auf dem Home Interface kann der Client dann die Operation zum Erzeugen einer Bean-Instanz aufrufen. Auf dieser Instanz können dann die Operationen des Remote Interface aufgerufen werden. In diesem Beispiel ruft der Client die Operation sayHello() auf. 10 5.3 EJB Security Beteiligte am Lebenszyklus eines EJBs: Bean Provider: Programmiert das Bean. Application Assember: Stellt aus Beans eine Anwendung zusammen. Bean Deployer: Konfiguriert einen Applikationsserver mit dem Bean Beteiligte haben verschiedene Aufgaben bzgl. Sicherheit. Die EJB-Spezifikation sieht prinzipiell drei Beteiligte am Lebenszyklus eines EJBs vor. Der Bean Provider programmiert die Bean, der Application Assembler stellt aus den Beans eine Anwendung zusammen und der Bean Deployer legt die Bean auf einen Applikationsserver, auf dem sie ausgeführt werden kann. Diese drei Beteiligten haben verschiedene Aufgabengebiete in Bezug auf die Systemsicherheit. 11 5.3 EJB Security EJB Sicherheitsarchitektur hat eine Trennung zwischen Sicherheitsund Anwendungslogik. Application Assembler definiert Rollen (security roles) für die Anwendung und weist Methoden-Aufrufrechte (method permissions) zu ‡ deklarativ im Deployment-Deskriptor Deployer ordnet den Rollen Principals zu. Ein Principal ist ein Serverseitiges Objket, das an authentifizierte Benutzer gebunden wird. Client darf Methode eines EJBs aufrufen, wenn der zugeordnete Principal eine entsprechende Rolle hat. Container Provider muss die Sicherheitsstrategie durchsetzen. Generell kann man sagen, dass die EJB-Architektur die Sicherheitslogik von der Anwendungslogik trennt, d.h. der Bean Provider soll die Sicherheitsstrategie nicht in die Anwendungslogik integrieren. Der Application Assembler definiert die Sicherheits-Rollen der EJB-Anwendung. Eine Rolle ist (wie im RBAC-Modell definiert) eine Gruppierung von Rechten, die ein Benutzer braucht, um die Anwendung auszuführen. Der Application Assembler definiert (deklarativ in einem Deployment Descriptor) die Methoden-Erlaubnisse (method permissions) für jede Rolle. Der Deployer ist dafür verantwortlich die Principals (oder Gruppen von Principals) zu den vom Application Assembler definierten Rollen zuzuordnen. Ein Principal ist ein Server-seitiges Objekt, dass mit dem authentifizierten Benutzer verbunden wird. Der Principal ist in der Regel der Aufrufer (caller) der Methode. Zur Laufzeit wird einem Clienten nur dann erlaubt eine Methode aufzurufen, wenn der mit dem Clienten verbundene Principal mindestens eine Rolle hat, die ihm die Erlaubnis zum Aufruf der Methode gibt bzw. der Application Assembler hat keine Zugriffsschutzbeschränkungen für die Methode spezifiziert. Der Container Provider ist dafür verantwortlich die Sicherheitsstrategie zur Laufzeit durchzusetzen. 12 5.3 EJB Security Sicherheitsaufgaben des Bean Provider Soll möglichst wenig mit Sicherheit konfrontiert werden, Konzentration auf Geschäftslogik. Sicherheitslogik soll nicht hart im Code eingebettet werden. Aber: Einfache Schnittstellen zum Zugriff auf den Sicherheitskontext des EJBs. Der Bean Provider soll so wenig wie möglich mit Sicherheitsfragen belangt werden und die Sicherheitspolitik soll nicht hart im Code des Beans eingebettet werden. Der Bean Provider soll sich auf die Umsetzung der Geschäftsabläufe konzentrieren. In bestimmten Fällen kann es jedoch vorkommen, dass Sicherheitsaspekte im Bean implementiert werden müssen. Für diesen Fall ist es dem Bean Provider über einfache Schnittstellen möglich, auf den Sicherheitskontext eines EJBs zuzugreifen. 13 5.3 EJB Security Schnittstelle javax.ejb.EJBContext besitzt zwei Methoden zum Zugriff auf Sicherheitsmethoden public interface javax.ejb.EJBContext { java.security.Principal getCallerPrincipal(); boolean isCallerInRole( String roleName ); } Die Schnittstelle javax.ejb.EJBContext besitzt zwei Methoden, die es dem Bean Provider erlauben, Sicherheitsinformationen über den Aufrufer (caller) des EJBs zu erlangen. Mit dem Aufrufen der Methode getCallerPrincipal() innerhalb einer EJB-Methode kann der Principal bestimmt werden, der die EJB-Methode aufgerufen hat. Mittels der Methode getName() des Objektes java.security.Principal kann dann der Name des Principals bestimmt werden. Eine EJB-Methode kann mit der Methode isCallerInRole() testen, ob der Aufrufer der EJB-Methode eine bestimmte Rolle besitzt. 14 5.3 EJB Security Beispiel für getCallerPrincipal() public class EmployeeServiceBean implements SessionBean { EJBContext ejbContext; public void changePhoneNumber(...) { ... Context initCtx = new InitialContext(); Object result = initCtx.lookup("java:comp/env/ejb/EmplRecord"); EmployeeRecordHome emplRecordHome = (EmployeeRecordHome) javax.rmi.PortableRemoteObject.narrow(result, EmployeeRecordHome.class); // obtain the caller principal. callerPrincipal = ejbContext.getCallerPrincipal(); Ein Beispiel für den Einsatz der Operation getCallerPrincipal() zeigt diese Folie. Im Beispiel wird die Telefonnummer des Aufrufers der Methode geändert. Zunächst wird mit der Operation getCallerPrincipal() der Principal des Aufrufers der Methode betsimmt. 15 // obtain the caller principal’s name. callerKey = callerPrincipal.getName(); // use callerKey as primary key to EmployeeRecord finder EmployeeRecord myEmployeeRecord = emplRecordHome.findByPrimaryKey(callerKey); // update phone number myEmployeeRecord.changePhoneNumber(...); ...}} Danach wird der Name des Principals mittels der Operation getName() ermittelt. Dieser Name dient als primärer Schlüssel in einer Datenbank und ein Bean für das zum primären Schlüssel gehörende Datenbank-Tupel wird erzeugt. Auf diesem kann dann die Operation zum Ändern der Telefonnummer aufgerufen werden. 16 5.3 EJB Security Beispiel für isCallerInRole() public class PayrollBean ... { EntityContext ejbContext; public void updateEmployeeInfo(EmplInfo info) { oldInfo = ... read from database; // The salary field can be changed only by callers // who have the security role "payroll" if (info.salary != oldInfo.salary && !ejbContext.isCallerInRole("payroll")) { throw new SecurityException(...); } }} Ein Beispiel für den Einsatz der Operation isCallerInRole() zeigt diese Folie, bei dem der Wert für das Gehalt geändert werden kann. Dies ist nur möglich, wenn der Principal die Rolle payroll hat. 17 5.3 EJB Security Bean Provider kennt keine systemweiten Rollen, da er die Anwendung nicht kennt, in der die Beans eingesetzt werden. Bean Provider muss die im Code benutzten Rollen im Deployment-Deskriptor deklarieren Application Assembler bildet diese Rollen später auf die tatsächlichen Rollen der Anwendung ab. Da vom Standpunkt des Bean Providers aus noch keine systemweiten Rollen eingeführt wurden, muss der Bean Provider alle im Code des EJBs benutzten Rollen im Deployment Descriptor deklarieren. Dies geschieht mit den <security-role-ref >-Elementen. Dies erlaubt dem Application Assembler oder dem Deployer, diese Namen später mit den Rollen zu verbinden, die in der Anwendung definiert werden. 18 5.3 EJB Security <enterprise-beans> ... <entity> <ejb-name>AardvarkPayroll</ejb-name> <ejb-class>com.aardvark.payroll.PayrollBean</ejb-class> ... <security-role-ref> <description> This security role should be assigned to the employees of the payroll department who are allowed to update employees’ salaries. </description> <role-name>payroll</role-name> </security-role-ref> ... </entity> Die Folie zeigt ein Beispiel für die Spezifikation einer Rollenreferenz im Deployment Descriptor. Das Element <security-role-ref> enthält den Namen der Rollenreferenz (<rolename>) und eine optionale Beschreibung (<description>). Im <role-name>-Element muss der Name der Rolle stehen, wie sie als Parameter in der Methode isCallerInRole() benutzt wurde. In unserem Gehalts-Beispiel einige Folien zuvor war dies die Rolle payroll. 19 5.3 EJB Security Sicherheitsaufgaben des Application Assemblers Definiert Sicherheitssicht auf die EJBs mittels eine Menge von Sicherheits-Rollen (security roles) Für jede Sicherheits-Rolle definiert er die zugehörigen Rechte (method permissions). Bildet die vom Bean Provider definierten RollenReferenzen auf Sicherheits-Rollen ab. Der Application Assembler definiert eine Sicherheitssicht auf die EJBs im Deployment Descriptor. Die Sicherheitssicht besteht aus einer Menge von Sicherheits-Rollen, welche eine semantische Gruppierung von Erlaubnissen zum Aufruf von EJB-Methoden sind. Der Application Assembler definiert die Erlaubnisse (method permissions) für jede SicherheitsRolle. Wenn der Bean Provider Rollen mittels der <security-role-ref>-Elemente im Deployment-Deskriptor beschrieben hat, muss der Application Assembler diese RollenReferenzen auf die von ihm definierten Sicherheits-Rollen abbilden. 20 5.3 EJB Security Definition von Sicherheitsrollen ist optional. (Es gibt dann keine Sicherheitsinstruktionen an den Deployer) Sicherheitsrolle wird im Deployment-Deskriptor definiert. <security-role>: definiert eine Sicherheitsrolle <role-name>: Definiert den Namen der Rolle <description>: Die Rolle kann optional eine Beschreibung bekommen. Die Definition von Sicherheitsrollen im Deployment-Deskriptor ist optional für den Application Assembler. Definiert er keine Sicherheitsrollen, so entschließt sich der Application Assembler dazu, keine Sicherheits-Deployment-Instruktionen an den Deployer zu übergeben. Wenn der Application Assembler jedoch eine Sicherheitsrolle definiert, so muss er/sie folgendes tun: • Definiere die Sicherheitsrolle mittels des <security-role> Elements. • Benutze das <role-name> Element, um den Namen der Sicherheitsrolle zu spezifizieren. • Optional kann das <description>-Element benutzt werden, um eine Beschreibung der Sicherheitsrolle zu geben. 21 5.3 EJB Security <security-role> <description> This role includes the employees of the enterprise who are allowed to access the employee self-service application. This role is allowed only to access his/her own information. </description> <role-name>employee</role-name> </security-role> <security-role> <description> This role includes the employees of the payroll department. The role is allowed to view and update the payroll entry for any employee. </description> <role-name>payroll-department</role-name> </security-role> Die Folie zeigt ein Beispiel der Sicherheitsrollendefinition im Deployment Descriptor. 22 5.3 EJB Security Method Permission definiert eine Erlaubnis zum Aufruf einer EJB-Methode. Method Permission werden im DeploymentDeskriptor als binäre Relation Sicherheitsrollen x EJB-Methoden definiert. Paar (R,M) bedeutet, dass die Sicherheitsrolle R die EJB-Methode M aufrufen darf. Nachdem der Application Assembler die Sicherheitsrollen definiert hat, kann er/sie die Erlaubnisse (method permissions) für die Aufrufe von EJB-Methoden den Rollen zuordnen. Die Method Permissions werden im Deployment Descriptor als binäre Relation auf der Menge der Sicherheitsrollen und der Menge der EJB-Methoden definiert. Ein Paar (R,M) in der Method-Permission-Relation bedeutet dann, dass die Rolle R die Methode M aufrufen darf. 23 5.3 EJB Security Method Permissions werden wie folgt definiert: <method-permission>: Definiert eine Liste von Sicherheitsrollen und EJB-Methoden. Sicherheitsrollen werden mittels <role-name> identifiziert. EJB-Methoden werden mittels <method> identifiziert, welches den EJB-Namen (<ejb-name>) und den Methodennamen (<method-name>) enthält. Alle aufgelisteten Rollen dürfen alle Methoden aufrufen. Eine optionale Beschreibung kann hinzugefügt werden (<description>) Die Method Permissions werden im Deployment Descriptor mit dem Element <methodpermission> definiert. Jedes <method-permission> -Element definiert eine Liste einer oder mehrerer Sicherheitsrollen und eine Liste von einer oder mehreren EJB-Methoden. Alle aufgelisteten Sicherheitsrollen dürfen alle aufgelisteten Methoden aufrufen. Jede Sicherheitsrolle in der Liste wird mittels des <role-name>-Elements identifiziert und jede EJBMethode wird über das <method>-Element identifiziert. Eine optionale Beschreibung kann dem <method-permission>-Element zugeordnet werden (mit dem <description>-Element). 24 5.3 EJB Security <method-permission> <role-name>employee</role-name> <method> <ejb-name>AardvarkPayroll</ejb-name> <method-name>findByPrimaryKey</method-name> </method> <method> <ejb-name>AardvarkPayroll</ejb-name> <method-name>getEmployeeInfo</method-name> </method> </method-permission> <method-permission> <role-name>employee</role-name> <method> <ejb-name>EmployeeService</ejb-name> <method-name>*</method-name> </method> </method-permission> Die Folie zeigt ein Beispiel für eine <method-permission>-Spezifikation. Für die Methodennamen können auch Platzhalter (z.B. *) benutzt werden. Dies bedeutet, dass die Rolle alle Methoden der Bean aufrufen darf. 25 5.3 EJB Security Method-Permission-Relation ist die Vereinigung aller methodpermission Elemente Sicherheitsrolle oder EJB-Methode kann in mehreren methodpermission Elementen auftreten. Mit <exclude-list> können Verbote spezifiziert werden. Bei Konflikten (d.h. Methode steht in exclude-list und methodpermission) haben Verbote Priorität. Sind für EJB-Methoden keine Zugriffsrechte spezifiziert, muss der Deployer die Zuordnung zu Sicherheitsrollen vornehmen oder sie als unchecked deklarieren. Die Method-Permission-Relation ergibt sich dann als die Vereinigung aller Method Permissions in den <method-permission>-Elementen. Eine Sicherheitsrolle oder EJBMethode kann in mehreren <method-permission>-Elementen auftreten. Der Application Assembler kann zusätzlich mittels des <exclude-list>-Elements eine Menge von EJBMethoden definieren, die nicht aufgerufen werden dürfen. Der Deployer muss dann dafür sorgen, dass kein Zugriff auf eine Methode erfolgt, die in der exclude-list enthalten ist. Wenn eine EJB-Methode sowohl in der exclude-list als auch in der Method-Permission-Relation steht, so muss der Deployer dafür sorgen, dass kein Zugriff erlaubt ist (d.h. Verbote haben eine höhere Priorität als Erlaubnisse). Sind Methoden weder einer Sicherheitsrolle zugeordnet noch in der exclude-list, liegt es in der Verantwortung des Deployers, Method Permissions zu definieren. Dies kann durch Zuordnung der unspezifizierten Methoden zu Sicherheitsrollen geschehen oder der Deployer entschließt sich dazu, dass diese Methoden bei einem Zugriff nicht auf Autorisierung geprüft werden müssen (spezifiziert durch unchecked). 26 5.3 EJB Security Application Assembler ordnet die Rollenreferenzen Sicherheitsrollen zu. Spezifiziert im Deployment-Deskriptor mittels <rolelink> Wert von <role-link> muss ein Wert eines <rolename> Elements sein. Muss auch gesetzt werden, wenn die Werte für <rolelink> und <role-name> identisch sind. Definiert der Application Assembler Sicherheitsrollen im Deployment Descriptor, so muss er/sie allen Rollenreferenzen in den <security-role-ref>-Elementen eine Sicherheitsrolle zuweisen. Dies erfolgt mittels des <role-link>-Elements. Der Wert des <role-link>-Elements muss dabei der Name einer Sicherheitsrolle sein (d.h. der Name muss in einem <role-name>Element auftreten). Ein <role-link>-Element muss auch dann explizit benutzt werden, wenn die Werte für <role-name> und <role-link> identisch sind. 27 <enterprise-beans> ... <entity> <ejb-name>AardvarkPayroll</ejb-name> <ejb-class>com.aardvark.payroll.PayrollBean</ejb-class> ... <security-role-ref> <description> This role should be assigned to the employees of the payroll department. Members of this role have access to anyone’s payroll record. The role has been linked to the payroll-department role. </description> <role-name>payroll</role-name> <role-link>payroll-department</role-link> </security-role-ref> ... </entity> ... </enterprise-beans> Die Folie zeigt ein Beispiel. Hier wird die vom Bean Provider definierte Rollenreferenz payroll der vom Application Assembler definierten Sicherheits-Rolle payroll department zugeordnet. 28 5.3 EJB Security Sicherheitsaufgaben des Deployers Abbilden der Sicherheitssicht auf die Zielumgebung. Zuweisen von Principals zu Sicherheitsrollen. Rollenreferenzen (benutzt im Bean Code) sind über den Link zu Sicherheitsrollen Principals zugeordnet. Muss die fehlenden (optionalen) Aufgaben des Application Assemblers ausführen (z.B. Sicherheitsrollen und Method Permissions definieren) Der Deployer muss die vom Application Assembler definierte Sicherheitsicht auf die Zielumgebung abbilden. Dies beinhaltet die Zuweisung von Principals zu den im Deployment Descriptor definierten Sicherheitsrollen. Der Application Assembler hatte alle Sicherheitsrollen-Referenzen, die im Bean Code benutzt wurden, mit Sicherheitsrollen verbunden. Der Deployer weist daher keine Principals zu Rollen-Referenzen, da die zu den Sicherheitsrollen zugewiesenen Principals automatisch zu den verbundenen RollenRefenrenzen zugeordnet sind. Da die Sicherheitsinformationen im Deployment Descriptor für den Application Assembler teilweise optional sind (z.B. die Definition der Sicherheitsrollen), muss der Deployer die vom Application Assembler nicht durchgeführten Aufgaben übernehmen (z.B. Definition der Sicherheitsrollen und Method Permissions). 29 5.3 EJB Security Das Rollenmodell von EJB entspricht RBAC0 RBAC0 User EJB Rollen Principals, denen autorisierte Benutzer zugeordnet sind. Sicherheitsrollen Rechte Method Permissions Sessions Client/Server-Aufruf, bei dem ein Benutzer einem Principal zugeordnet wird und damit Sicherheitsrollen besitzt. Abschließend kann man feststellen, dass das bei EJBs verwendete Rollenmodell am ehesten dem RBAC0 Modell entspricht. Die Benutzer (User) im RBAC0 Modell entsprechen den Principals in EJB, welche einem autorisierten Benutzer zugeordnet werden. Die Rollen im RBAC0 Modell sind die vom Application Assembler definierten Sicherheitsrollen und die Rechte im RBAC0 Modell sind die Method Permissions, die Rollen zugewiesen werden. Bei den RBAC0 Sessions ist die Zuordnung nicht ganz so offensichtlich. Man kann aber einen Client-Aufruf als Session ansehen, bei dem dem Clienten ein Principal zugeordnet wird. Dieser Principal bekommt dann eine Menge von Rollen zugeordnet, die zur Ausführung der Anfragen des Clienten an den Server ausgewertet werden. 30 5.3 EJB Security Es gibt bei EJBs keine Rollenhierachien und keine Constraints. Daher weder RBAC1 noch RBAC2. EJBs bieten jedoch weder die Möglichkeit Rollenhierarchien zu definieren noch Constraints aufzustellen. Daher ist das in EJB verwendete Rollenmodell weder RBAC1 noch RBAC2 (und damit auch nicht RBAC3). 31 5.4 CORBA Security CORBA (Common Object Request Broker Architecture) ist eine Spezifikation der OMG (Object Management Group) Ziel ist die Integration von Anwendungen in heterogenen Umgebungen und die Förderung von Objektorientierung. CORBA ist nur eine Spezifikation, keine eigene Implementierung. CORBA (Common Object Request Broker Architecture) wurde von der OMG (Object Management Group) spezifiziert. Die CORBA-Spezifikation hat die Integration von Anwendungen in heterogenen Umgebungen unter Verwendung der Objektorientierung zum Ziel. Grundvoraussetzung für dieses Ziel ist die Interoperabilität der Softwarekomponenten und der Objekte, aus denen sich Anwendungen zusammensetzen. 32 5.4 CORBA Security CORBA Objektmodell Objekte haben eine Identität, eine Lebenszeit und eine Schnittstelle (bestehend aus Methoden und Attributen). Objektaufrufe sind nur über definierte Schnittstellen möglich. Trennung schafft Unabhängigkeit von der Implementierung. Im CORBA-Objektmodell haben Objekte eine Identität und eine Lebenszeit (d.h. Objekte werden erzeugt und können auch wieder zerstört werden). Objekte werden über Schnittstellen beschrieben, die aus Attributen und Methoden bestehen. Die Kommunikation zwischen den Objekten erfolgt dann nur über diese definierten Schnittstellen. Dies schafft eine Unabhängigkeit von der Implementierung der Objekte, was in heterogenen Systemen eine wichtige Anforderung ist. 33 5.4 CORBA Security Object Management Architecture Applikationsobjekte CORBA Services Common Facilities ORB (Object Request Broker) Domain Objects Die in der CORBA-Spezifikation vorgestellte Architektur, die sogenannte Object Management Architecture (OMA), besteht aus dem Object Request Broker (ORB), Domain-Objekten, CORBA Services, Common Faciclities und Applikations-Objekten. 34 5.4 CORBA Security Verteilte Objekte kommunizieren über den ORB plattformunabhängig. Schnittstellen der CORBA-Objekte werden in programmiersprachenunabhängigen Schnittstellenbeschreibungssprache (Interface Definition Language, IDL) beschrieben. ORB sucht die passende Objekt-Implementierung zu einer Client-Anfrage, überträgt die Aufrufparameter, ruft die zur Anfrage passende Methode auf dem ServerObjekt auf und liefert die Ergebnisse zurück. Der ORB bildet das Rückgrat einer verteilten CORBA-Anwendung. Ein ORB ist ein SoftwareBus, auf dem sich CORBA-Objekte registrieren lassen können, um so ihr Dienste anderen Objekten zur Verfügung zu stellen. CORBA-Objekte kommunizieren über den ORB plattformunabhängig, d.h. die von einem CORBA-Objekt angebotenen Dienste werden in einer programmiersprachenunabhängigen Interface Definition Language (IDL) beschrieben. Der ORB ist verantwortlich für das Auffinden des zur Anfrage passenden Server-Objekts, für die Übertragung der Aufrufparameter, für den Aufruf der Methode auf dem Server-Objekt und die Rückgabe des Ergebnisses zum Client. 35 5.4 CORBA Security CORBA Services: Allgemeine Hilfs- und Infrastrukturdienste (z.B. Naming Service, LifeCycle, Transaction, Security Service,...) Domain Objects: Anwendungsnahe „vertikale“ Dienste: adressieren spezielle Branchen (z.B. Gesundheitswesen, Finanzen,...) Common Facilities: Anwendungsnahe „horizontale“ Dienste (z.B. System Management, Information Management,....) Applikationsobjekte: Bestandteil von Anwendungen (nicht von der OMG spezifiziert) CORBA Services standardisieren wesentliche Dienste, die von eigentlich jedem Objekt benötigt werden, wie z.B. Lifecycle- oder Naming-Services. Unter die CORBA Services fällt auch der Security Service. Die Domain Objects sind anwendungsnahe Dienste, die in speziellen Branchen gebraucht werden. Beispiele solcher Branchen sind das Finanzwesen oder das Gesundheitswesen. Die Common Facilities sind ebenfalls anwendungsnahe Dienste, die aber weniger spezifisch für eine Branche sind, sondern vielmehr übergreifend in vielen Anwendungen gebraucht werden könnten. Beispiele solcher Dienste sind Dienste zum Systemoder Informations-Management. Applikationsobjekte bieten Dienste spezieller Anwendungen, die im Gegensatz zu den vorherigen Diensten nicht von der OMG spezifiziert werden. 36 5.4 CORBA Security Folgende Schritte sind für die Implementierung einer CORBAAnwendung durchzuführen. 1. 2. schreibe eine IDL-Spezifikation. Übersetze die Spezifikation mit dem IDL-Compiler (Java Interfaces, Helper und Holder Klassen, Stubs and Skeletons). 3. Implementiere die generierten Java-Interfaces 4. Schreibe eine “Main”-Klasse, die die eine Instanz der Server-Implementierung erzeugt und mit dem ORB registriert 5. Schreibe einen Client, welcher eine Referenz zum ServerObjekt erhält und einen entfernten Aufruf macht. Um eine CORBA-Anwendung zu erstellen, sind folgende Schritte notwendig: 1. Zunächst müssen die Schnittstellen beschrieben werden. Dies geschieht programmiersprachenunabhängig mittels der Interface Definition Language (IDL). 2. Die IDL-Beschreibung wird dann mit einem IDL-Compiler (der dann spezifisch für eine Programmiersprache ist) übersetzt. Der IDL-Compiler erzeugt mehrere Klassen. 3. Dann müssen die generierten Schnittstellen implementiert werden. 4. Danach muss ein Server implementiert werden, der eine Instanz des CORBA-Objekts erzeugt, mit dem ORB registriert und somit für Clienten zur Verfügung stellt. 5. Ein Client kann dann eine Referenz auf das CORBA-Objekt erfragen und einen Aufruf durchführen. 37 5.4 CORBA Security 1. Schreibe eine IDL-Spezifikation module HelloApp { interface Hello { string sayHello(); }; }; Im folgenden stellen wir eine kleine HeloWorld-CORBA-Anwednung vor. Dazu wird zunächst die IDL-Spezifikation erstellt. Wir haben in diesem Beispiel nur eine Schnittstelle Hello mit einer Operation sayHello(). 38 5.4 CORBA Security 2. Übersetze die Spezifikation mit dem IDL-Compiler _HelloStub.java HelloPOA.java HelloOperations.java Hello.java HelloHelper.java Vertreter-Objekt auf Client-Seite Server-Objekt zum Bearbeiten von Client Requests Java-Version der IDL Erweitert HelloOperations.java Typ-Operationen, narrow() HelloHolder.java CORBA Input uns Output Streams Übersetzen wir diese IDL-Spezifikation mit einem IDL-Compiler für Java, bekommen wir mehrere Klassen generiert. Die Klasse _HelloStub.java repräsentiert das Vertreter-Objekt des Server-Objekts auf der Client-Seite. Der Client ruft dann die Operation auf dem VertreterObjekt auf und der ORB vermittelt den Aufruf auf das Server-Objekt, welches die Anfrage bearbeitet. Der ORB gibt dann das Ergebnis über das Vertreter-Objekt an den Clienten zurück. Die Klasse HelloPOA.java repräsentiert das Server-Objekt, welches den Dienst zur Verfügung stellt. Die Klasse HelloOperations.java ist die Java-Schnittstelle zum IDL-Interface und Hello.java erweitert HelloOperations.java . Die Klassen HelloHelper.java und HelloHolder.java sind Hilfsklassen, die für die Kommunikation gebraucht werden. 39 5.4 CORBA Security 3. Implementiere die generierten Java-Interfaces class HelloImpl extends HelloPOA { public String sayHello() { return System.out.println(“Hello!”); } } Die generierten Java-Schnittstellen müssen dann implementiert werden. In unserem HelloWorld-Beispiel müssen wir nur die eine Operation sayHello() implementieren. Die Implementierung erweitert die Klasse HelloPOA. 40 5.4 CORBA Security 4. Schreibe eine “Main”-Klasse, die eine Instanz der Server-Implementierung erzeugt und mit dem ORB registriert public class Server { public static void main( String[] args ) { ORB orb = ORB.init(args, null); //initialisiere ORB try { POA poa = POAHelper.narrow( orb.resolve_initial_references("RootPOA")); poa.the_POAManager().activate(); Zum Schreiben des Servers, muss man zunächst den ORB initialisieren. Nachdem dies geschehen ist, holt man sich vom ORB eine Referenz zum Object Adapter (POA). Der ORB kennt einige initiale Referenzen, die über Namen ermittelt werden können (z.B. „RootPOA“). Die zurückgelieferte Referenz ist ein ungetyptes CORBA-Objekt, so dass es zunächst zum richtigen Typ umgewandelt werden muss (mit der narrow() Operation der entsprechenden Helper-Klasse) . Danach wird der POA aktiviert, so dass er eine Objektreferenz für eine Instanz der Objet-Implementierung HelloImpl() erzeugen kann. 41 // Objektreferenz von der Objekt-Implementierung org.omg.CORBA.Object o = poa.servant_to_reference(new HelloImpl()); // mit dem Naimg Service registrieren NamingContextExt nc = NamingContextExtHelper.narrow( orb.resolve_initial_references("NameService")); nc.bind( nc.to_name(„hello.example"), o); } catch ( Exception e ) { e.printStackTrace(); } orb.run(); } } Damit dieses neue erzeugte CORBA-Objekt für Clients erreichbar ist, muss die Objektreferenz verfügbar gemacht werden. Dies geschieht über den Naming Service. Eine Referenz zum Naming Service wird mittels orb.resolve initial references("NameService") erlangt. Danach wird das CORBA-Objekt mittels der bind()-Operation mit einem Namen im Naming Service gebunden. 42 5.4 CORBA Security 5. Schreibe einen Client, welcher eine Referenz zum Server-Objekt erhält und einen entfernten Aufruf macht. public class Client { public static void main(String args[]) { try { ORB orb = ORB.init(args,null); Ein CORBA-Client muss ebenfalls zunächst den ORB initialisieren. 43 //Referenz zum Naming Service NamingContextExt nc = NamingContextExtHelper.narrow( orb.resolve_initial_references("NameService")); //Löse Objektreferenz auf Hello hello = HelloHelper.narrow( nc.resolve(nc.to_name(„hello.example"))); //rufe Methoden des CORBA-Objekts auf System.out.println( hello.sayHello() ); } ..... Außerdem braucht der Client eine Referenz zum Namensservice, um Referenzen von ServerObjekten zu erfragen. Die Referenz zum Namensservice wird wie beim Server mittels orb.resolve initial references("NameService") erlangt. Danach kann sich der Client über den registrierten Namen des CORBA-Objekts eine Referenz auf das CORBA-Objekt beim Namensservice erfragen. Die Objektreferenz muss dann noch in den richtigen Typ umgewandelt werden (mittels der narrow()-Operation), bevor die Operationen des CORBAObjekts vom Clienten aufgerufen werden können. 44 5.4 CORBA Security CORBA Security Service Nach der erfolgreichen Authentifizierung wird ein Benutzer innerhalb des Systems durch Principals repräsentiert. Der Principal-Authenticator weist dem Principal Credentials zu, die u.a. die für den Zugriffsschutz benötigten Privileg-Attribute enthalten. unauthentifizierte Attribute (public) Credentials authentifizierten Attribute PrivilegAttribute IdentityAttribute Wir betrachten nun das im CORBA Security Service spezifizierte Zugriffsschutzmodell. Zunächst müssen sich Benutzer (bzw. Clienten) am System authentifizieren (z.B. durch ein Passwort). Bei einer erfolgreichen Authentifizierung wird der Benutzer dann mittels eines Principals im System repräsentiert, der mit Zugriffsberechtigungen ausgestattet wird. Die zuständige Komponente zur Authentifizierung ist der PrincipalAuthenticator, welcher einen Principal mit Credentials ausstattet. CORBA entscheidet den Zugriff eines Principals auf der Basis dieser Credentials . Credentials enthalten unauthentifizierte Attribute (werden beim Zugriffsschutz nicht berücksichtigt) und authentifizierte Attribute, die beim Zugriffsschutz relevant sind. Authentifizierte Attribute sind Privileg-Attribute (z.B. Rollen, Gruppen etc.) und Identity-Attribute, die die Identität des Principals genauer beschreiben. Welche Attribute nun genau unter Privileg-Attributen zu verstehen und somit zugriffsschutzrelevant sind, schreibt die Spezifikation des CORBA Security Services nicht vor. Neben den Credentials des Principals basiert die Zugriffsschutzentscheidung auch auf den Zugriffsschutzregeln des Zielobjekts. 45 5.4 CORBA Security Zugriffsschutzregeln für CORBA-Objekte CORBA-Objekte kontrollieren den Zugriff auf ihre Operationen mittels Rechten. Jede Operation im Interface erfordert bestimmte Rechte (required rights). Standard-Rechtefamilie: g (get), s (set), m (manage), u (use) Weitere Rechtefamilien können vom Anwendungsentwickler bei Bedarf definiert werden. Der Zugriff der Principals mit ihren Privileg-Attributen auf CORBA-Objekte wird mittels Rechten kontrolliert. Für jede Operation im Interface eines CORBA-Objekts sind bestimmte Rechte erforderlich (required right). Ein Aufrufer einer Operation muss diese Rechte haben. Die Spezifikation stellt eine Standardmenge von Rechten zur Verfügung, die vier Rechte enthält: “g” (“get”), “s” (“set”), “m” (“manage”) und “u” (“use”). Anwendungsentwickler können jedoch weitere Rechtefamilien definieren. 46 5.4 CORBA Security Rechte – Operationen: requiredRights: Operation ‡ Menge von Rechten Festlegung durch den Anwendungsentwickler. Rechte sind generisch und nicht a priori an bestimmte Operationen gebunden. Rechte – Subjekte: effectiveRights: Subjekt ‡ Menge von Rechten Teil der Privileg-Attribute Zugriffschutz ist im wesentlichen systembestimmt. Zusammenfassend lässt sich somit sagen, dass der Anwendungsentwickler jede Operation mit einer Menge von Rechten belegt, die zur Ausführung der Operation benötigt werden (required rights). Diese Rechte sind generisch in Rechtefamilielen definiert und sind nicht a priori an bestimmte Operationen gebunden. Subjekte (bzw. Principals) können Rechte besitzen, die in ihren Privileg-Attributen enthalten sind (effective rights). Die Zuordnung von Rechten zu Operationen und Subjekten wird im wesentlichen vom System bestimmt. 47 5.4 CORBA Security Beispiel: EffectiveRights und Required Rights effective effective rights rights required required rights rights operation operation id:alice id:alice corba:g-ucorba:g-u- corba:--ucorba:--u- resolve resolve group:admin group:admin corba:gsum corba:gsum corba:g-ucorba:g-u- list list group:programmers group:programmers corba:gsucorba:gsu- corba:gsucorba:gsu- bind bind corba:gsum corba:gsum new_context, new_context, bind_new_context bind_new_context unbind, unbind, rebind, rebind, destroy destroy corba:gsum corba:gsum interface interface NamingNamingContext Context Diese Folie zeigt ein Beispiel für die Schnittstelle Naming-Context mit den Operationen resolve, list, bind, new context, bind new context, unbind, rebind und destroy. In den obigen Tabellen werden die Rechte der CORBA-Standardfamilie (gennant corba) zum Definieren des Zugriffsschutzes verwendet. In der linken Tabelle stehen die Rechte in den PrivelegAttributen eines Principals. Die Principal-Identität alice hat die Rechte g (get) und u (use), die Gruppe admin hat alle Rechte, der Gruppe programmers fehlt nur das Recht m (manage). Die für die Operationen benötigten Rechte sind in der rechten Tabelle aufgelistet. So kann alice beispielsweise die Operation resolve aufrufen (da sie das benötigte Recht u besitzt), aber sie kann nicht die Operation destroy aufrufen (ihr fehlen die Rechte s und m). 48 5.4 CORBA Security Allgemeines Zugriffsschutzmodell basiert auf Zugriffsentscheidungsfunktionen (access decision function) Access Decision Function betrachtet Privileg-Attribute des Aufrufers Zugriffsschutzregeln des Zielobjekts möglicherweise weitere Informationen (Kontext, Zeit etc.) Kontext-Info Privileg-Attribute Zugriffschutzregeln des Ziel-Objekts Access Decision Function (setzt Zugriffsschutzregeln durch) Zugriff erlaubt? ja/nein Das allgemeine Zugriffsschutzmodell basiert auf Zugriffentscheidungsfunktionen (access decision function), die entscheiden, ob ein Zugriff auf eine CORBA-Operation erlaubt ist. Für die Zugriffschutzentscheidung werden betrachtet: die Privileg-Attribute des Aufrufers, die Zugriffsschutzregeln des Zielobjektes und möglicherweise weitere Kontext-Informationen wie beispielsweise die Zeit. 49 5.4 CORBA Security Nachteile des CORBA-Standard-Zugriffsschutzmodells Beschränkte Rechtemenge, low-level(“Object rwx”) Alle Objekte eines Typs werden gleich behandelt Keine dynamischen Rechteänderungen Keine Verbote Das Standard-CORBA-Zugriffsschutzmodell hat einige Nachteile. Durch die beschränkte Rechtemenge lassen sich nur sehr beschränkte Zugriffsschutzanforderungen auf den Objekten modellieren. Die Rechte sind sehr generisch und daher nicht für jede Anwendung passend. Außerdem bekommen alle Instanzen eines Typs die gleichen Rechte. Es ist nicht möglich, zwischen Instanzen zu unterscheiden, d.h. einer Instanz andere Rechte zu geben als einer anderen. Die Zugriffsschutzpolitik kann zur Laufzeit nicht mehr geändert werden und es besteht keine Möglichkeit, explizit Verbote zum Aufruf von CORBA-Operationen auszusprechen. Aufgrund dieser Nachteile gibt es Erweiterungen des CORBAZugriffsschutzmodells, die diese Nachteile beheben (siehe 5.5. RACCOON). 50 5.4 CORBA Security CORBA und RBAC CORBA-Security Spezifikation bietet die Möglichkeit, Rollen für die Zugriffsschutzentscheidung zu berücksichtigen (PrivilegAttribute). Spezifikation lässt das RBAC-Modell offen. Es liegt im Ermessen des Implementierers der CORBA-Security Spezifikation, welches RBAC-Modell genommen wird. Muss in der Access Decision Function implementiert werden. Die Unterstützung von rollenbasiertem Zugriffsschutz in CORBA ist in der Spezifikation nicht explizit vorgesehen. Die Spezifikation bietet jedoch die Möglichkeit, rollenbasierten Zugriffsschutz zu integrieren. Dazu müssen in die Privileg-Attribute Rollen aufgenommen werden, die von den Access Decision Funktionen bei der Zugriffsschutzentscheidung berücksichtigt werden. Diese Integration eines Rollenmodells unterliegt demjenigen, der die Spezifikation des CORBA Security Service implementiert. Dieser kann auch entscheiden, welche Mächtigkeit das Rollenmodell haben soll (RBAC0, RBAC1, RBAC2 oder RBAC3). 51 5.5 RACCOON RACCOON = Rigourous Access Control in Object-Oriented Networks (http://www.inf.fu-berlin.de/Raccoon/) Forschungsprojekt an der FU als Teil des DFGSchwerpunktprogramms „Sicherheit in der Informations- und Kommunikationstechnik“ (http://www.telematik.uni-freiburg.de/spps/index.php) Thema: Spezifikation und das Management objektorientierter Zugriffsschutzpolitiken im Netz RACCOON-Annahme: Erhöhte Handhabbarkeit führt direkt zu mehr Sicherheit! RACCOON (Rigourous Access Control in Object-Oriented Networks) ist ein Forschungsprojekt an der FU Berlin, das im Jahr 1999 gestartet wurde. RACCOON ist Teil des DFG-Schwerpunktprogramms „Sicherheit in der Informationsund Kommunikationstechnik“, an dem mehrere Projekte an unterschiedlichen Universitäten in Deutschland teilnehmen, die alle an einen bestimmten Aspekt von Sicherheit forschen. Das Thema von RACCOON ist die Spezifikation und das Management objektorientierter Zugriffsschutzpolitiken im Netz. Die Arbeiten in RACCOON stehen unter der Annahme, dass Sicherheitskonzepte- und werkzeuge nicht eingesetzt werden, wenn sie für den Anwender zu kompliziert sind. Dadurch entstehen vermeidbare Sicherheitslücken. RACCOON versucht nun handhabbare Konzepte und Werkzeuge zur Verfügung zu stellen, so dass Sicherheitslücken, die aufgrund von Verwaltungsfehlern entstehen, reduziert werden. 52 5.5 RACCOON – VBAC RACCOON bietet: Handhabbares Zugriffsschutzmodell (View-based Access Control, VBAC) mit zugehöriger Politiksprache (View Policy Language, VPL) CORBA-basierte Infrastruktur zur technischen Realisierung der Zugriffsschutzstrategien Graphische Werkzeuge für den Sicherheitsadministrator. Innerhalb des RACCOON-Projekts wurde ein Zugriffschutzmodell für verteilte Objektsysteme und dazugehöriger Politiksprache entwickelt. Das Zugriffsschutzmodell nennt sich View-based Access Control (VBAC), die zugehörige Politiksprache View Policy Language (VPL). Grundlegendes Konzept des Modells sind Views als Gruppierungskonzept von Rechten auf Operationen. In RACCOON wurde eine auf CORBA-basierte Infrastruktur entwickelt, die sich mit einer in VPL spezifizierten Politik konfigurieren lässt und die Zugriffe dann aufgrund der VPL-Politik im System zur Laufzeit kontrolliert. Graphische Managementwerkzeuge erlauben es dem Administrator eine Modifikation der Politik zur Laufzeit. 53 5.5 RACCOON – VBAC View-based Access Control (Brose, 1999) Erweiterung von rollenbasiertem Zugriffsschutz auf objektorientierte Systeme. Skalierbarkeit durch Gruppen, Rollen, Views, Typen, Domains Rolle 1 Benutzer 1 View 1 Gruppe 1 Rolle 2 Benutzer 2 View 2 Gruppe 2 Benutzer 3 Rolle 3 CORBAInterface 1 CORBAInterface 2 CORBAInterface 3 View-based Access Control (VBAC) ist eine Erweiterung von rollenbasietrem Zugriffsschutz auf objekt-orientierte Systeme. Grundlegende Erweiterung ist das Konzept einer View, welche eine Menge von Rechten zum Aufrufen von Operationen einer CORBA-Schnittstelle zusammenfasst. Views dienen als Vermittler zwischen Rollen und Objekten (in diesem Fall CORBA-Schnittstellen). Gruppen dienen als Gruppierungskonzept von Benutzern und verbinden die Benutzer mit Rollen. Man kann Rechte an Typen von Objekten geben (d.h. alle Exemplare eines Objekttyps haben dieses Recht) und man kann Objekte in Domänen zusammenfassen, für die dann dieselbe Politik gilt. 54 5.5 RACCOON – VBAC Bietet eine deklarative Politiksprache (View Policy Language) zur Spezifikation einer VBAC-Politik – Wiederverwendung, Dokumentation, Kommunikation – Fixes Objektmodell (CORBA-IDL) erlaubt statische Konsistenzprüfung – Feinkörniger Schutz – Dynamische Rechteänderungen VBAC-Politiken werden in der deklarativen View Policy Language (VPL) spezifiziert. Die in VPL spezifizierte Politik dient dann als Dokumentation der Zugriffsschutzanforderungen, zur Kommunikation und zur Wiederverwendung. Die VPL basiert auf einem festen Objektmodell (CORBA-IDL) und erlaubt somit statische Konsistenzprüfungen. VPL bietet einen feinkörnigen Schutz auf der Ebene einzelner Schnittstellenoperationen und die Möglichkeit Rechteänderungen dynamisch zur Laufzeit durchzuführen. 55 5.5 RACCOON – VBAC Views • gruppieren Rechte auf Operationen (Teilmenge eines Interfaces) • Können Constraints enhalten • Beziehung zwischen Views (z.B. View-Erweiterung) • Erlaubnisse und Verbote interface Document { { void read(out string s); void write(in string s); void append(in string s); void correct(in string s); }; view Reading controls Document allow read } view Writing: Reading restricted_to Author { allow write append } Zentrales Konzept des VBAC-Modells sind Views. Eine View gruppiert eine Menge von Rechten, welche Erlaubnisse oder Verbote zum Aufrufen von Operationen eines CORBAObjekts sind. Eine View bezieht sich immer auf genau eine Schnittstelle, d.h. eine View kann keine Rechte für Operationen verschiedener Schnittstellen geben. Die VPL bietet die Möglichkeit Views zu erweitern (Notation erweiterte View:Basisview) , so dass die erweiterte View alle Rechte der Basisview besitzt. Außerdem können Constraints definiert werden, z.B. dass eine View nur an bestimmte Rollen vergeben werden kann (Notation restricted_to Rollenname). 56 5.5 RACCOON – VBAC Object Role Employee Secretary TechAuthor NamingCtx resolve Resolving bind Binding bind_new_ctx. o2:Paper o3:Review read resolve list append read correct read resolve list, bind, read write read Schutzmatrix-Modell hat Views als Einträge o4:T view Resolving controls NamingContext { allow resolve; } view Binding : Resolving { allow bind; bind_new_context; } Das VBAC-Modell basiert auf einer Zugriffsschutzmatrix, in der die Matrixeinträge Views sind. Ein Eintrag V in der Zeile S und der Spalte O bedeutet dann, dass das Subjekt S die View V auf dem Objekt O besitzt. 57 5.5 RACCOON – VBAC Rollen gemäß RBAC3, d.h. hierarchische Rollen-Strukturen und Constraints roles Examiner Head: Examiner // Head is senior to // examiner President: Head maxcard 1 Lecturer: Examiner Candidate excludes Examiner Rollen können in der VPL gemäß RBAC3 definiert werden. Das heißt, es ist möglich Rollen hierarchisch zu ordnen (Notation erweiterte Rolle: Basisrolle) und Constraints bzgl. Rollen zu definieren (z.B. das zwei Rollen nicht demselben Benutzer zugeordnet werden dürfen (excludes) oder dass eine Rolle nur einem Benutzer zugeordnet ist (maxcard 1)). 58 5.5 RACCOON – VBAC Schemas beschreiben dynamische Rechteänderungen als Folge der Ausführung von Operationen IDL: interface Paper { Review submitReview( in string text ); }; VPL: schema SubmitSchema observes Paper { submitReview assigns Modifying on result to caller assigns ReviewReading on this to caller removes ReviewSubmitting on this from caller } Um dynamische Rechteänderungen zur Laufzeit durchführen zu können, bietet VPL das Konzept eines Schemas. Rechteänderungen werden durch den Aufruf von Operationen initiiert. Das Schema beschreibt bei welcher Operation eine Rechteänderung geschieht und in welcher Weise. Dabei können Views hinzugefügt oder entfernt werden. Mit dem Ausdruck assigns View on Object to Subject wird eine View auf ein Object einem Subject zugeordnet. Mit removes View on Object from Subject wird eine View auf ein Object einem Subject entzogen. Die Schlüsselwörter result, this und caller sind das Ergebnisobjekt der Operation, das Objekt, auf dem die Operation aufgerufen wurde und der Principal, der die Operation aufgerufen hat. 59 5.5 RACCOON – VBAC Vollständige Zugriffsschutzstrategie mit VPL policy College roles Author.... view... view Updating : Reading restricted_to Author virtual view Managing schema .... Eine vollständige VPL-Spezifikation definiert die Rollen, Views und Schemas. 60 5.5 RACCOON – VBAC CORBA-Infrastruktur zum Durchsetzen einer in VPL spezifizierten Zugriffsschutzpolitik Development: VPL Compiler zum Umwandeln in XML und zum Entdecken von Konflikten. Deployment: Verifier prüft auf Konflikte mit vorhandenen Politiken und aktualisiert die Repositories Management: View/Role/Domain Server und Management Tools Um eine VPL-Spezifikation in einem CORBA-System durchzusetzen, wurde im Projekt RACCOON eine entsprechende Infrastruktur entwickelt. Es gibt Werkzeuge für die verschiedenen Phasen: Ein VPL-Compiler übersetzt die VPL-Politik in eine XML-Datei und führt einige Konsistenzchecks durch. Beim Deployment wird diese XML-Datei benutzt, um die Repositories für Views und Rollen zu konfigurieren. Zur Laufzeit werden dem Sicherheitsadministrator graphische Managementwerkzeuge zur Verfügung gestellt, mit der die Politik dynamisch geändert werden kann. 61 5.5 RACCOON - VBAC VPL Precompiler XML XML Verifier Policy Descriptor IR IR Development Deployment IR IR XML Verifier VR VR RR RR Die VPL-Politik wird zunächst von einem Precompiler in eine XML-Datei transformiert. Ein Verifier überprüft dann die Korrektheit der Spezifikation und liefert einen Policy Descriptor. Dieser dient als Grundlage des Deployments. Auch hier gibt es einen Verifier, der die Politik auf Konflikte mit bereits existierenden Politiken im System überprüft. Gibt es keine Konflikte, werden die Views und Schemas im View Repository (VR) und die Rollen im Role Repository (RR) gespeichert. 62 5.5 RACCOON – VBAC Domänenhierarchien • Strukturierung und Generalisierung (Politiken gemäß Organisationsstruktur, Zuständigkeiten) • Geltungsbereich der Elterndomäne umfasst Mitgliedsobjekte der Kinddomänen Hype Inc. Europe Europe R&D R&D AnwendungsAnwendungsdomäne domäne11 US USBranch Branch Sales Sales AnwendungsAnwendungsdomäne domäne22 ... AnwendungsAnwendungsdomäne domänenn RACCOON bietet die Möglichkeit Objekte in Domänen zu organisieren. Die Domänen ergeben sich beispielsweise aus der Organisationsstruktur oder Zuständigkeiten. Jeder Domäne wird eine Politik zugeordnet, so dass diese Politik für alle Objekte dieser Domäne und alle Kinddomänen gilt. Objekte können auch in zwei Domänen liegen (wie das Beispiel mit Anwendungsdomäne 1 und 2 zeigt). 63 5.5 RACCOON – VBAC Konflikte zwischen Politiken für ein Objekt sind möglich, da Domänen hierarchisch angeordnet sind bzw. gemeinsame Mitglieder haben. Metapolitiken zur Konfliktauflösung Auflösung semantikabhängig fi Metapolitiken spezifisch für Politiktypen Metapolitiken werden Domänen zugeordnet Keine Meta-Metapolitiken: – erste anwendbare Metapolitik gilt (= Metapolitik passenden Typs in der nächsten gemeinsamen Elterndomäne) Es kann vorkommen, dass für ein Objekt mehrere Politiken anwendbar sind. Um diese Konflikte aufzulösen lassen sich Metapolitiken spezifizieren, die diese Konflikte semantikabhängig auflösen. Auch die Metapolitiken werden Domänen zugeordnet. Es gibt jedoch keine Meta-Metapolitiken, falls auf ein Objekt zwei Meta-Politiken anwendbar sein sollten. In diesem Fall wird die erste anwendbare Metapolitik genommen. 64 Raccoon-Laufzeitumgebung Role Mgmt. Domain Mgmt. Policy Mgmt. Policy Server Domain Server Role Server Policy Policy Domain Domain Roles Client request() Target Interceptor Access Decision Server Die RACCOON-Laufzeitumgebung besteht aus einem Role-Server, einem Domain-Server und einem Policy-Server. Auf dem Role-Server werden die Rollen verwaltet, auf dem Domain-Server die Domänen und auf dem Politik-Server die Views und Schemas. Möchte ein Client einen Operation auf einem Zielobjekt ausführen, holt sich der Client seine Rollen vom Role-Server und fügt sie dem Aufruf der Operation zu. Ein Interceptor fängt den Aufruf ab, ermittelt die Rollen des Aufrufers und leitet diese an ein Access Decision Object weiter. Dieses ermittelt, in welcher Domäne das Zielobjekt ist und holt sich die anwendbare Politik. Anhand der Politik und der gesendeten Rollen wird dann der Zugriff entschieden. Ist er erlaubt, wird der Aufruf ans Zielobjekt weitergeleitet, ansonsten wird eine SicherheitsAusnahme an den Clienten geliefert. Alle Server können mit graphischen Managementwerkzeugen administriert werden. 65