{"id":85,"date":"2012-06-27T16:00:48","date_gmt":"2012-06-27T14:00:48","guid":{"rendered":"http:\/\/marko-seifert.de\/blog\/?p=85"},"modified":"2020-01-15T12:23:37","modified_gmt":"2020-01-15T10:23:37","slug":"java-security-absicherung-der-java-vm","status":"publish","type":"post","link":"http:\/\/marko-seifert.de\/blog\/?p=85","title":{"rendered":"Java Security \u2013 Absicherung der Java VM"},"content":{"rendered":"<h2>Java-Applikationen zur\u00fcck in den Sandkasten<\/h2>\n<p>Die Security von Anwendungen nimmt einen immer st\u00e4rkeren Stellenwert in der Softwareentwicklung ein. Neben der Absicherung des Betriebssystems (<a href=\"http:\/\/en.wikipedia.org\/wiki\/Principle_of_least_privilege\">Principle of least privilege<\/a>) und der Netzinfrastruktur (Firewalls und N-Tier-Architekturen) kann man auch die Anwendung selber absichern.<\/p>\n<p><!--more--><\/p>\n<p>Im Java-Umfeld werden Anwendungen innerhalb der Java Virtual Machine (JVM) ausgef\u00fchrt. Diese stellt neben Laufzeitumgebung eine API bereit, die aus einem plattformunabh\u00e4ngigen Teil (Java Code) und einem plattformabh\u00e4ngigen Teil (native Code) besteht. Beide Teile werden per <a href=\"http:\/\/de.wikipedia.org\/wiki\/JNI%20verbunden\">JNI<\/a>. Der native Code kapselt den Zugriff auf Systemressourcen (z.B. Sockets und FileIO).<\/p>\n<p><a href=\"http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jvm1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-88\" title=\"jvm1\" src=\"http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jvm1-145x300.png\" alt=\"\" width=\"145\" height=\"300\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>In Java Applets ist der Zugriff aus der JVM auf Systemressourcen komplett untersagt. Die Anwendung l\u00e4uft in einer sogenannten Sandbox. Daf\u00fcr 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\u00fcft. Der SecurityManager delegiert die Berechtigungspr\u00fcfung an den AccessController, der per Policy-Dateien konfiguriert wird.<\/p>\n<p><a href=\"http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jsm.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-87\" title=\"jsm\" src=\"http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jsm-221x300.png\" alt=\"\" width=\"221\" height=\"300\" srcset=\"http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jsm-221x300.png 221w, http:\/\/marko-seifert.de\/blog\/wp-content\/uploads\/2012\/06\/jsm.png 633w\" sizes=\"auto, (max-width: 221px) 100vw, 221px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Im folgenden Beispiel ist der Calltree in der Methode <code>File#read<\/code> zu sehen. Der Java-Prozess hat hier nicht die ReadPermission auf die Datei <code>address.txt<\/code>.<\/p>\n<pre>Exception in thread \"main\" java.security.AccessControlException: access denied (java.io.FilePermission c:\\address.txt read) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:270)\r\nat java.security.AccessController.checkPermission(AccessController.java:401)\r\nat java.lang.SecurityManager.checkPermission(SecurityManager.java:542)\r\nat java.lang.SecurityManager.checkRead(SecurityManager.java:887)\r\nat java.io.File.length(File.java:790)<\/pre>\n<p>Die Security-Option kann per JVM-Parameter aktiviert werden.<\/p>\n<pre>java -Djava.security.manager -Djava.security.policy=app.policy<\/pre>\n<p>Eine entsprechende Policy-Datei kann mit dem Tool <code>JAVA_HOME\/bin\/ policytool.exe<\/code> erstellt werden. Im folgenden Beispiel wurden die JAR-Dateien entsprechend signiert und anschlie\u00dfenden daf\u00fcr Berechtigungen erteilt.<\/p>\n<pre>keytool -genkey -alias [USER] -storepass [PWD] -keystore [PFAD]\/keystore\/ca\r\njarsigner -keystore keystore\/ca -storepass [PWD] -signedjar ..\/socket_signed.jar ..\/socket.jar [USER]<\/pre>\n<pre><strong>Beispiel Policy-File:<\/strong>\r\nkeystore \"file:\/\/\/[PFAD]\/keystore\/ca\", \"jks\";\r\ngrant signedBy \"[USER] \" {\r\n  permission java.io.FilePermission \"&lt;&gt;\", \"write\";\r\n  permission java.net.SocketPermission \"10.151.147.135:8080\",\r\n  \"connect, accept, listen, resolve\";\r\n};<\/pre>\n<p>Das Erstellen der Policy-Datei f\u00fcr einen Web-Container muss nicht h\u00e4ndisch gemacht werden. F\u00fcr die g\u00e4ngigsten Server gibt es bereits fertige Policy-Dateien, die bei Bedarf angepasst werden k\u00f6nnen. Im Tomcat befindet sich diese Police-Datei unter <code>$CATALINA_BASE\/conf\/catalina.policy<\/code>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Java-Applikationen zur\u00fcck in den Sandkasten Die Security von Anwendungen nimmt einen immer st\u00e4rkeren 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.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11,4,10],"tags":[27,6,8,28,29,30,31,32],"class_list":["post-85","post","type-post","status-publish","format-standard","hentry","category-development","category-java","category-softwarearchitektur","tag-j2ee","tag-java","tag-jvm","tag-permission","tag-policy","tag-sandbox","tag-security","tag-securitymanager"],"_links":{"self":[{"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/85","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=85"}],"version-history":[{"count":4,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/85\/revisions"}],"predecessor-version":[{"id":339,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=\/wp\/v2\/posts\/85\/revisions\/339"}],"wp:attachment":[{"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=85"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=85"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/marko-seifert.de\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=85"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}