Hardware- und Softwareentwicklung, Java, Softwarearchitektur

Java Security – Absicherung der Java VM

Java-Applikationen zurück in den Sandkasten

Die Security von Anwendungen nimmt einen immer stärkeren Stellenwert in der Softwareentwicklung ein. Neben der Absicherung des Betriebssystems (Principle of least privilege) und der Netzinfrastruktur (Firewalls und N-Tier-Architekturen) kann man auch die Anwendung selber absichern.

Im Java-Umfeld werden Anwendungen innerhalb der Java Virtual Machine (JVM) ausgeführt. Diese stellt neben Laufzeitumgebung eine API bereit, die aus einem plattformunabhängigen Teil (Java Code) und einem plattformabhängigen Teil (native Code) besteht. Beide Teile werden per JNI. Der native Code kapselt den Zugriff auf Systemressourcen (z.B. Sockets und FileIO).

 

In Java Applets ist der Zugriff aus der JVM auf Systemressourcen komplett untersagt. Die Anwendung läuft in einer sogenannten Sandbox. Dafür verantwortlich ist der SecurityManager, der Bestandteil des Java Security Models ist. In jeder Java-Methode, die Zugriff auf Systemressourcen hat, werden zuvor die entsprechenden Berechtigungen geprüft. Der SecurityManager delegiert die Berechtigungsprüfung an den AccessController, der per Policy-Dateien konfiguriert wird.

 

Im folgenden 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 aktiviert werden.

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

Eine entsprechende Policy-Datei kann mit dem Tool JAVA_HOME/bin/ policytool.exe erstellt werden. Im folgenden Beispiel wurden die JAR-Dateien entsprechend signiert und anschließenden 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ändisch gemacht werden. Für die gängigsten Server gibt es bereits fertige Policy-Dateien, die bei Bedarf angepasst werden können. Im Tomcat befindet sich diese Police-Datei unter $CATALINA_BASE/conf/catalina.policy.

Share on FacebookTweet about this on TwitterPin on Pinterest