Konfiguration | |
---|---|
Von:
Thorsten Kamann <thorsten.kamann@planetes.de> |
|
Die Konfiguration des SecurityWatchers befinden sich in einer XML-Datei. Hier haben sie verschiedene Möglichkeiten die Sicherheitsregeln einzelner Host und Kontexte (Anwendungen) zu bestimmen. |
Inhalt:
|
Die kompletten Sicherheitsregeln eines ganzen Profils der Centaurus-Platform befinden sich in einer XML-Datei. Diese finden Sie unter ${centaurus.base}/conf/security.xml.
Die Konfiguration enthält mehrere Typen von Permissions:
system | Dieser Type Permissions definiert regeln die für alle Elemente und Komponenten innerhalb der gesamten Centaurus-Platform gelten. |
---|---|
engine | Mit diesem Typ bestimmen Sie Regeln, die für alle Engines gelten sollen. Mit dem Attribute name können Sie diesen Eintrag für bestimmte Engines filtern. |
host | Wenn Sie Regeln bestimmen wollen, die für jeden installierten Host gelten sollen,
dann können Sie das mit diesem Typ machen. Sollen die Regeln nur für einen bestimmten
Host gelten, dann fügen Sie das Attribute name hinzu.
Wenn die Regel nur für einen Host in einer bestimmten Regel gelten soll, dann können Sie noch das Attribute engine hinzu. |
context |
Regeln können Sie natürlich auch auf Basis des Kontexts (Anwendungsebene) bestimmt werden.
Auch hier können Sie auf bestimmte Kontexte filtern (Attribute name).
Natürlich kann hier noch feiner gefiltert werden, z.B. auf einen Host (host) und/oder eine Engine (engine). |
Innerhalb der Permissions können Sie beliebig viele Regeln definieren (Element grant). Sehen Sie dazu auch die Basiskonfiguration.
Regeln können nur innerhalb eines Permission-Elements definiert werden. Es gibt allerdings keine
Einschränkungen in Bezug auf die Anzahl der Regeln innerhalb eines Permission-Elements.
Eine Sicherheitsregel wird mit dem Element grant definiert. Die Konfiguration
einer solchen Regel wird durch ein oder mehrere Attribute bestimmt. Folgende Atrribute können
Sie verwenden:
codebase | Bestimmt die codebase für die diese Regel gelten soll.
Bedenken Sie dass die codebase immer mit dem Prefix
file: beginnen sollte.
Auch Platzhalter werden unterstützt:
|
---|---|
permission |
Bestimmt den Namen der Permission. Mögliche Werte sind hier:
|
name |
Mit diesem Attribut bestimmen Sie die Regel etwas genauer. Als Beispiel nehmen wir die
3 Permissions:
Die Platzhalter für die codebase gelten für die java.io.FilePermission genauso. |
action |
Hiermit können Sie die Aktionen, die erlaubt sein sollen, bestimmen.
Nicht alle Regeln benötigen unbedingt dieses Attribute. Wenn Sie dieses Attribute einsetzen müssen Sie auch ebenfalls das Attribute name setzen. Mögliche Aktionen für die obigen 3 Permissions aus dem obigen Beispiel sind:
|
Ein häufiger Anwendungsfall ist es, dass Webanwendungen Dateien schreiben müssen. Das ist standardmässig nicht erlaubt. Damit der Administrator nicht bei jeder Webanwendung aktiv eingreifen muss, gibt es die Möglichkeit eigene Sichereitsregeln im WAR-Archiv oder DocBase abzulegen. Der Name einer solchen Datei ist security.xml und muss sich im Verzeichnis /META-INF der Webanwendung befinden.
Diese Regeln werden - bevor Sie zu dem SecurityWatcher hinzugefügt werden - gefiltert, damit
nur bestimmte Regeln erlaubt sind. Der Filter befindet sich in
${centaurus.base}/conf/xsl/webapps_security.xsl.
Standardmässig sind das:
- java.io.FilePermission - nur innerhalb des AppBase des Hosts
- java.net.SocketPermission - nur die Aktionen connect und resolve sind erlaubt
- java.util.PropertyPermission - Es sit nur lesender Zugriff erlaubt
Die Struktur weicht etwas von der Konfigurationsdatei des SecurityWatchers ab:
<?xml version="1.0" encoding="UTF-8"?> <security> <permissions> <grant permission="java.io.FilePermission" name="temp/" action="read,write,delete"/> </permissions> </security>
Eine codebase ist nicht zwingend vorgeschrieben. Wenn diese fehlt wird das
DocBase des Kontexts als codebase verwendet. Wenn Sie die Regel nur einem
bestimmten Teil der Anwendung zukommen lassen wollen können Sie dies so tun:
codebase="/WEB-INF/lib/special.jar"
Dateiberechtigungen können Sie nur innerhalb des eigenen DocBase vornehmen. Werden
mehr Berechtigung gebraucht, dann muss dies in der Konfigurationsdatei vorgenommen werden.
Wenn Sie für die Erstellung neuer Hosts das HostCreator-Plugin nutzen, dann baruchen Sie keine weiteren Anpassungen vornehmen.
Wenn Sie manuell die ${centaurus.base}/conf/server.xml verändern, kontrollieren Sie die folgenden Elemente:
- Engine
- Host
Alle diese Einträge müssen einen Listener haben:
<Listener className="de.centaurus.platform.plugins.security.SecurityWatcherLifecycleListener"/>
Beim nächsten Release wird dieser Bereich sicher verfügbar sein.
Nach einer Neuinstallation der Centaurus-Platform sieht die ${centaurus.base}/conf/security.xml so aus:
<security> <!-- Here are the permissions for the System and Server Code--> <permissions type="system"> <grant codebase="file:${java.home}/lib/-" permission="java.security.AllPermission"/> <grant codebase="file:${java.home}/jre/lib/ext/-" permission="java.security.AllPermission"/> <grant codebase="file:${java.home}/../lib/-" permission="java.security.AllPermission"/> <grant codebase="file:${java.home}/lib/ext/-" permission="java.security.AllPermission"/> <grant codebase="file:${catalina.home}/common/-" permission="java.security.AllPermission"/> <grant codebase="file:${catalina.home}/shared/-" permission="java.security.AllPermission"/> <grant codebase="file:${catalina.home}/server/-" permission="java.security.AllPermission"/> <grant codebase="file:${catalina.base}/lib/-" permission="java.security.AllPermission"/> <grant codebase="file:${catalina.base}/plugins/-" permission="java.security.AllPermission"/> <grant codebase="file:${catalina.base}/hosts/localhost/webapps/-" permission="java.security.AllPermission"/> <!-- Here are all java.util.PropertyPermissions --> <grant permission="java.util.PropertyPermission" name="java.home" action="read"/> <grant permission="java.util.PropertyPermission" name="java.naming.*" action="read"/> <grant permission="java.util.PropertyPermission" name="javax.sql" action="read"/> <grant permission="java.util.PropertyPermission" name="javax.sql.DataSource.Factory" action="read"/> <grant permission="java.util.PropertyPermission" name="os.name" action="read"/> <grant permission="java.util.PropertyPermission" name="os.version" action="read"/> <grant permission="java.util.PropertyPermission" name="os.arch" action="read"/> <grant permission="java.util.PropertyPermission" name="file.separator" action="read"/> <grant permission="java.util.PropertyPermission" name="path.separator" action="read"/> <grant permission="java.util.PropertyPermission" name="line.separator" action="read"/> <grant permission="java.util.PropertyPermission" name="java.version" action="read"/> <grant permission="java.util.PropertyPermission" name="java.vendor" action="read"/> <grant permission="java.util.PropertyPermission" name="java.vendor.url" action="read"/> <grant permission="java.util.PropertyPermission" name="java.class.version" action="read"/> <grant permission="java.util.PropertyPermission" name="java.specification.version" action="read"/> <grant permission="java.util.PropertyPermission" name="java.specification.vendor" action="read"/> <grant permission="java.util.PropertyPermission" name="java.specification.name" action="read"/> <grant permission="java.util.PropertyPermission" name="java.vm.specification.version" action="read"/> <grant permission="java.util.PropertyPermission" name="java.vm.specification.vendor" action="read"/> <grant permission="java.util.PropertyPermission" name="java.vm.specification.name" action="read"/> <grant permission="java.util.PropertyPermission" name="java.vm.version" action="read"/> <grant permission="java.util.PropertyPermission" name="java.vm.vendor" action="read"/> <grant permission="java.util.PropertyPermission" name="java.vm.name" action="read"/> <grant permission="java.util.PropertyPermission" name="file.encoding" action="read"/> <grant permission="java.util.PropertyPermission" name="jaxp.debug" action="read"/> <grant permission="java.util.PropertyPermission" name="user.home" action="read"/> <grant permission="java.util.PropertyPermission" name="user.name" action="read"/> <grant permission="java.util.PropertyPermission" name="user.dir" action="read"/> <grant permission="java.util.PropertyPermission" name="java.library.path" action="read"/> <grant permission="java.util.PropertyPermission" name="java.io.tmpdir" action="read"/> <grant permission="java.util.PropertyPermission" name="java.ext.dirs" action="read"/> <grant permission="java.util.PropertyPermission" name="java.compiler" action="read"/> <grant permission="java.util.PropertyPermission" name="java.class.path" action="read"/> <grant permission="java.util.PropertyPermission" name="catalina.home" action="read"/> <grant permission="java.util.PropertyPermission" name="catalina.base" action="read"/> <grant permission="java.util.PropertyPermission" name="OJB.*" action="read"/> <grant permission="java.util.PropertyPermission" name="centaurus.*" action="read"/> <!-- Here are all java.lang.RuntimePermissions --> <grant permission="java.lang.RuntimePermission" name="getAttribute"/> <grant permission="java.lang.RuntimePermission" name="accessDeclaredMembers"/> <grant permission="java.lang.RuntimePermission" name="setContextClassLoader"/> <grant permission="java.lang.RuntimePermission" name="accessClassInPackage.org.apache.jasper.runtime"/> <grant permission="java.lang.RuntimePermission" name="accessClassInPackage.org.apache.jasper.runtime.*"/> <grant permission="java.lang.RuntimePermission" name="accessClassInPackage.org.apache.catalina"/> <grant permission="java.lang.RuntimePermission" name="accessClassInPackage.org.apache.catalina.*"/> <grant permission="java.lang.RuntimePermission" name="accessClassInPackage.org.apache.tomcat.util.http"/> <grant permission="java.lang.RuntimePermission" name="accessClassInPackage.org.apache.tomcat.util.http.*"/> <grant permission="java.lang.RuntimePermission" name="accessClassInPackage.org.apache.tomcat.util.net"/> <grant permission="java.lang.RuntimePermission" name="accessClassInPackage.org.apache.tomcat.util.net.*"/> <!-- Here are the java.net.SocketPermissions --> <grant permission="java.net.SocketPermission" name="localhost:*" action="listen, connect, resolve, accept"/> <grant permission="java.net.SocketPermission" name="127.0.0.1:32000" action="connect, resolve"/> <grant permission="java.net.SocketPermission" name="*:21" action="listen, connect, resolve, accept"/> <grant permission="java.net.SocketPermission" name="*:25" action="listen, connect, resolve, accept"/> <grant permission="java.net.SocketPermission" name="*:80" action="listen, connect, resolve, accept"/> <grant permission="java.net.SocketPermission" name="*:443" action="listen, connect, resolve, accept"/> <!-- Here are the other Permissions --> <grant permission="java.lang.reflect.ReflectPermission" name="suppressAccessChecks"/> </permissions> </security>