Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden

Java Security – Absicherung der Java VM

Java-Applikationen zurück in den Sandkasten

Die Security von Anwendungen nimmt einen immer stär­ke­ren Stellenwert in der Softwareentwicklung ein. Neben der Absicherung des Betriebssystems (Principle of least pri­vi­lege) und der Netzinfrastruktur (Firewalls und N-Tier-Architekturen) kann man auch die Anwendung sel­ber absichern.

Im Java-Umfeld wer­den Anwendungen inner­halb der Java Virtual Machine (JVM) aus­ge­führt. Diese stellt neben Laufzeitumgebung eine API bereit, die aus einem platt­form­un­ab­hän­gi­gen Teil (Java Code) und einem platt­form­ab­hän­gi­gen Teil (native Code) besteht. Beide Teile wer­den per JNI. Der native Code kap­selt den Zugriff auf Systemressourcen (z.B. Sockets und FileIO).

In Java Applets ist der Zugriff aus der JVM auf Systemressourcen kom­plett unter­sagt. Die Anwendung läuft in einer soge­nann­ten Sandbox. Dafür ver­ant­wort­lich ist der SecurityManager, der Bestandteil des Java Security Models ist. In jeder Java-Methode, die Zugriff auf Systemressourcen hat, wer­den zuvor die ent­spre­chen­den Berechtigungen geprüft. Der SecurityManager dele­giert die Berechtigungsprüfung an den AccessController, der per Policy-Dateien kon­fi­gu­riert wird.

Im fol­gen­den Beispiel ist der Calltree in der Methode File#read zu sehen. Der Java-Prozess hat hier nicht die ReadPermission auf die Datei address.txt.

Exception in thread "main" java.security.AccessControlException: access denied (java.io.FilePermission c:\address.txt read) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:270) 
at java.security.AccessController.checkPermission(AccessController.java:401) 
at java.lang.SecurityManager.checkPermission(SecurityManager.java:542) 
at java.lang.SecurityManager.checkRead(SecurityManager.java:887) 
at java.io.File.length(File.java:790)

Die Security-Option kann per JVM-Parameter akti­viert werden.

java -Djava.security.manager -Djava.security.policy=app.policy

Eine ent­spre­chende Policy-Datei kann mit dem Tool JAVA_HOME/bin/ policytool.exe erstellt wer­den. Im fol­gen­den Beispiel wur­den die JAR-Dateien ent­spre­chend signiert und anschlie­ßen­den dafür Berechtigungen erteilt.

keytool -genkey -alias [USER] -storepass [PWD] -keystore [PFAD]/keystore/ca
jarsigner -keystore keystore/ca -storepass [PWD] -signedjar ../socket_signed.jar ../socket.jar [USER]
Beispiel Policy-File:
keystore "file:///[PFAD]/keystore/ca", "jks";
grant signedBy "[USER] " {
  permission java.io.FilePermission "<>", "write";
  permission java.net.SocketPermission "10.151.147.135:8080",
  "connect, accept, listen, resolve";
};

Das Erstellen der Policy-Datei für einen Web-Container muss nicht hän­disch gemacht wer­den. Für die gän­gigs­ten Server gibt es bereits fer­tige Policy-Dateien, die bei Bedarf ange­passt wer­den kön­nen. Im Tomcat befin­det sich diese Police-Datei unter $CATALINA_BASE/conf/catalina.policy.

Related Posts

Pin It on Pinterest