11 Stimmen

Sicherheit mit Java Scripting (JRuby, Jython, Groovy, BeanShell, usw.)

Ich möchte einige nicht verifizierte Skripte ausführen (die in einer noch zu bestimmenden Sprache geschrieben sind, aber auf Java basieren müssen, also sind JRuby, Groovy, Jython, BeanShell usw. allesamt Kandidaten). Ich möchte, dass diese Skripte einige Dinge tun können und andere Dinge nicht tun dürfen.

Normalerweise würde ich einfach den SecurityManager von Java verwenden und damit fertig sein. Das ist ziemlich einfach und ermöglicht es mir, den Datei- und Netzwerkzugriff einzuschränken, die JVM herunterzufahren, usw. Und das wird gut funktionieren für die High-Level-Sachen, die ich abblocken will.

Aber es gibt einige Dinge, die ich zulassen möchte, aber nur über meine benutzerdefinierte API/Bibliothek, die ich bereitgestellt habe. Zum Beispiel möchte ich keinen direkten Netzwerkzugriff erlauben, um eine URLConnection zu yahoo.com zu öffnen, aber ich bin OK, wenn es mit MyURLConnection getan wird. Das heißt, es gibt eine Reihe von Methoden/Klassen, die ich zulassen möchte, und alles andere soll tabu sein.

Ich glaube nicht, dass diese Art von Sicherheit mit dem Standard-Java-Sicherheitsmodell möglich ist, aber vielleicht ist es möglich. Ich habe keine besonderen Anforderungen an die Leistung oder Flexibilität der Skriptsprache selbst (die Skripte werden einfache prozedurale Aufrufe meiner API mit einfachen Schleifen/Verzweigungen sein). Selbst ein "großer" Overhead, der bei jedem Reflection-Aufruf eine Sicherheitsüberprüfung durchführt, ist für mich also kein Problem.

Vorschläge?

4voto

Jean Barmash Punkte 4760

Haftungsausschluss: Ich bin kein Experte für Java-Sicherheits-APIs, daher kann es einen besseren Weg geben, dies zu tun.

Ich arbeite für Alfresco , Java-basiertes Open Source Enterprise CMS, und wir haben etwas Ähnliches implementiert, wie Sie es beschreiben. Wir wollten Skripting zulassen, aber nur eine Teilmenge unserer Java-APIs der Skripting-Engine zur Verfügung stellen.

Wir haben uns für Rhino Engine für JavaScript-Scripting entschieden. Sie ermöglicht es, zu steuern, welche APIs für JavaScript zugänglich sind, wodurch wir wählen können, welche Klassen verfügbar sind und welche nicht. Der Overhead liegt laut unseren Ingenieuren in der Größenordnung von 10 % - gar nicht so schlecht.

Darüber hinaus, und das könnte auch für Sie relevant sein, verwenden wir auf der Java-Seite Acegi (jetzt Spring Security) und nutzen AOP, um rollenbasierte Kontrolle darüber zu geben, welche Methoden ein bestimmter Benutzer aufrufen kann. Das funktioniert ziemlich gut für die Autorisierung. Einem Benutzer, der über JavaScript auf unsere Anwendung zugreift, steht also zunächst eine eingeschränkte API zur Verfügung, und dann kann diese API auf der Grundlage der Autorisierung noch weiter eingeschränkt werden. Man könnte also die AOP-Techniken verwenden, um weiter einzuschränken, welche Methoden aufgerufen werden können, und dies in anderen Skriptsprachen, wie Groovy usw., verfügbar machen. Wir sind dabei, auch diese zu integrieren, da wir darauf vertrauen, dass unsere zugrundeliegenden Java-APIs die Benutzer vor unberechtigtem Zugriff schützen.

3voto

Tom Hawtin - tackline Punkte 142461

Möglicherweise können Sie einen benutzerdefinierten Klassenlader verwenden, der die Verknüpfung mit Klassen überprüft, bevor er an die übergeordnete Klasse delegiert wird.

Sie können Ihre eigenen Berechtigungen erstellen, in Ihren sicherheitsrelevanten APIs nach diesen suchen und dann mit AccessController.doPrivileged um beim Aufruf der zugrunde liegenden API die entsprechenden Berechtigungen wiederherzustellen.

Sie müssen sicherstellen, dass die Skripting-Engine selbst sicher ist. Die Version von Rhino im Sun JDK sollte in Ordnung sein, aber es gibt keine Garantien. Natürlich müssen Sie sicherstellen, dass alles, was dem Skript zur Verfügung steht, sicher ist.

0voto

sulai Punkte 4918

In Groovy können Sie genau das tun, was Sie erwähnt haben. Eigentlich sehr einfach. Sie können ganz einfach die Berechtigungen von nicht vertrauenswürdigen Skripten, die in einer vertrauenswürdigen Umgebung laufen, einschränken und die Verwendung Ihrer eigenen API erlauben, die wiederum nicht vertrauenswürdige Dinge tun kann.

http://www.chrismoos.com/2010/03/24/groovy-scripts-and-jvm-security/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X