Estoy buscando ejecutar algunas secuencias de comandos no verificadas (escritas en un lenguaje aún por determinar, pero debe estar basado en Java, entonces JRuby, Groovy, Jython, BeanShell, etc. son todos candidatos). Quiero que estos scripts puedan hacer algunas cosas y restringirse de hacer otras cosas.Seguridad con Java Scripting (JRuby, Jython, Groovy, BeanShell, etc.)
Normalmente, utilizaré el SecurityManager de Java y terminaré con él. Eso es bastante simple y me permite restringir el acceso a archivos y redes, la capacidad de apagar la JVM, etc. Y eso funcionará bien para las cosas de alto nivel que quiero bloquear.
Pero hay algunas cosas que quiero permitir, pero solo a través de mi API/biblioteca personalizada que he proporcionado. Por ejemplo, no quiero permitir el acceso directo a la red para abrir una URLConnection a yahoo.com, pero estoy de acuerdo si se hace con MyURLConnection. Es decir, hay un conjunto de métodos/clases que quiero permitir y luego todo lo demás que quiero que esté fuera de los límites.
No creo que este tipo de seguridad se pueda hacer con el modelo de seguridad estándar de Java, pero quizás sí. No tengo un requisito específico de rendimiento o flexibilidad en el lenguaje de scripts en sí (los scripts serán simples llamadas de procedimiento a mi API con bucle/ramificación básica). Así que incluso una sobrecarga "grande" que verifique un control de seguridad en cada llamada de reflexión está bien para mí.
Sugerencias?
Gracias - eso es realmente útil. Por cierto, el caso de uso para mí es permitir que las personas carguen scripts para que se ejecuten sus pruebas de carga en http://browsermob.com. No había mirado a Rhino, pero parece que podría funcionar, siempre y cuando no permita el acceso directo a las API de Java, como lo hace Groovy. –
Sí, tienes más control allí, lo cual es bueno desde la perspectiva de la seguridad. Puede que tenga que crear envoltorios para ciertas API y luego exponer esos objetos. Por ejemplo, tenemos un motor de flujo de trabajo y creamos un objeto de flujo de trabajo que luego expusimos a JavaScript, que controla lo que puede hacer. –
Seguimiento rápido: ¿cómo se aseguró de que la variable Packages no fuera accesible? Ver http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/ –