2011-01-23 11 views
7

Todo,SecurityManager para un servicio en la nube "caja de arena"

estoy trabajando en el diseño de un servicio basado en la nube que proporcionará la opción de ejecutar algún código "plugin" presentado por los clientes. Para que esto funcione, es esencial que los complementos no amenacen la integridad del sistema ni tengan la capacidad de acceder a los datos de otros clientes.

Idealmente me gustaría que los clientes puedan enviar un archivo jar simple (que contenga una clase conforme a una interfaz predefinida) que luego se ejecutará dentro de un entorno limitado.

El código de cliente debe permitir que:

  • Tómese todo el tiempo de CPU, ya que necesita en un solo hilo
  • realiza ningún cálculo utilizando las clases de Java estándar (por ejemplo java.lang.Math, java. util.Random etc.)
  • llamar a cualquier bibliotecas agrupados en el frasco (pero que deben estar sujetos a las mismas restricciones)

pero necesitaría específicamente para no permitir lo siguiente:

  • desove nuevos temas (de modo que los recursos del servidor puede ser bastante logró!)
  • Cualquier acceso al sistema de archivos/IO/red
  • Cualquier acceso a código nativo
  • Cualquier acceso a los datos en el JVM que no sea el que se pasó a/creó el código de cliente
  • Cualquier acceso a la reflexión en clases que no sean las de .jar sandbox
  • Cualquier posibilidad de invocar métodos en objetos fuera de la zona de pruebas, que no sean las bibliotecas estándar de Java

¿Se puede lograr esto con una configuración personalizada de ClassLoader/SecurityManager? ¿O tendré que empezar a buscar una solución más sofisticada (por ejemplo, lanzar varias JVM?)

+0

@M ¿hay algún progreso para informar? –

Respuesta

4

La gestión de recursos y la limitación de recursos no es posible en Java. Puede evitar que el código malicioso de los recursos del sistema de acceso (disco/red Mínimo) o la propia JVM pero: ...

desove nuevos temas (de modo que los recursos del servidor puede ser bastante lograron!)

  • Si quiero ser malicioso estoy a hacer todo mi código en el subproceso finalizador y simplemente bloquear la máquina virtual. Lo mismo haciendo protected void finalize(synchronized(Thread.class) {for(;;) LockSupport.park();}} adiós hilos nuevos.
  • Comiendo toda la memoria, comiendo toda la memoria directa, etc.
  • Acceso a los archivos zip en mi propia frasco, y esperar que ellos consiguiendo se alejó, por lo que los accidentes de JVM (debido a fallo (s) en zlib)

Si uno deliberadamente quiere negar los recursos, es sólo no es una tarea factible para tratar de atrapar al hacker. Tendrá que saber qué buscar y comprobar/mejorar dinámicamente las clases en tiempo de ejecución para no permitir el comportamiento.

Cualquier posibilidad de llamar a métodos en los objetos fuera de la caja de arena, que no sean las bibliotecas estándar de Java

¿Cuáles son las bibliotecas estándar? ¿Sabes si/cuándo deben ejecutar algún código en un método privilegiado?


Cada cliente - máquina virtual separada con restricciones completas, proceso de afinidad/prioridad, incluye memoria/pila máxima y más.

+0

Eso es más o menos el modelo dalvik –

+0

@Chris Thompson: ¿Cómo funciona con los bloqueos de código nativo? – bestsss

+0

Sabes, esa es una excelente pregunta y no estoy seguro. Trataré de encontrarlo y lanzar otro comentario aquí. Por cierto, me refería a que su sugerencia de instancias de máquina virtual separadas es lo que hace Dalvik en caso de que no esté claro. –

1

Creo que todo lo que desea lograr se puede hacer a través de un SecurityManager personalizado. De hecho, es bastante simple, simplemente crea una clase que se extiende SecurityManager, implementa los dos métodos checkPermission(..) y en la primera iteración simplemente tira un SecurityException para todo lo que entra (y registra lo que acabas de negar). Luego, permite operaciones específicas hasta que se encuentre en la situación de que es posible crear complementos útiles y permitir que sus clientes jueguen con él. Ellos se quejarán. Luego debe juzgar si les permite hacer lo que pidieron o si desea cumplir con sus reglas. Aquí comienza la parte difícil ...

Cuestiones relacionadas