Ich möchte einige nicht verifizierte Skripte ausführen (geschrieben in einer noch zu bestimmenden Sprache, muss aber Java-basiert sein, JRuby, Groovy, Jython, BeanShell usw. sind alle Kandidaten). Ich möchte, dass diese Skripts einige Dinge tun und von anderen Dingen abgehalten werden können.Sicherheit mit Java Scripting (JRuby, Jython, Groovy, BeanShell, usw.)
Normalerweise würde ich einfach Java SecurityManager verwenden und damit fertig sein. Das ist ziemlich einfach und lässt mich den Datei- und Netzwerkzugriff einschränken, die Möglichkeit, die JVM herunterzufahren, usw. Und das wird gut für die High-Level-Sachen funktionieren, die ich blockieren möchte.
Aber es gibt einige Sachen, die ich erlauben will, aber nur über meine benutzerdefinierte API/Bibliothek, die ich zur Verfügung stelle. 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 gemacht wird. Das ist - es gibt eine Reihe von Methoden/Klassen, die ich zulassen will und dann alles andere, was ich nicht tun will.
Ich glaube nicht, dass diese Art von Sicherheit mit dem Standard-Java-Sicherheitsmodell durchgeführt werden kann, aber vielleicht kann es. Ich habe keine spezielle Anforderung für Leistung oder Flexibilität in der Skriptsprache selbst (die Skripts sind einfache prozedurale Aufrufe an meine API mit grundlegenden Schleifen/Verzweigungen). Selbst ein "großer" Overhead, der bei jedem Reflection Call eine Sicherheitskontrolle prüft, ist für mich in Ordnung.
Vorschläge?
Danke - das ist wirklich hilfreich. Übrigens - der Anwendungsfall für mich ist es, Leuten zu erlauben, Skripte für ihre Belastungstests hochzuladen, die auf http://browsermob.com laufen. Ich habe Rhino nicht angeschaut, aber das hört sich so an, als könnte es funktionieren, solange es keinen direkten Zugriff auf die Java-APIs wie Groovy erlaubt. –
Ja - Sie haben dort mehr Kontrolle, was aus Sicherheitsgründen gut ist. Möglicherweise müssen Sie Wrapper für bestimmte APIs erstellen und dann diese Objekte verfügbar machen. Zum Beispiel haben wir eine Workflow-Engine und haben ein Workflow-Objekt erstellt, das wir dann JavaScript zur Verfügung gestellt haben, wodurch gesteuert wird, was Sie tun können. –
Quick-Follow-up: Wie haben Sie sichergestellt, dass die Variable Packages nicht zugänglich war? Siehe http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/ –