Question

Je suis à la recherche d'exécuter des scripts un-vérifié (écrit dans une langue encore à être déterminé, mais il doit être basé sur Java, donc JRuby, Groovy, Jython, BeanShell, etc sont tous les candidats). Je veux que ces scripts pour pouvoir faire des choses et restreint de faire d'autres choses.

Normalement, je voudrais juste aller utiliser Java SecurityManager et être fait avec elle. C'est assez simple et me permet de limiter le fichier et l'accès au réseau, la capacité d'arrêter la machine virtuelle Java, etc. Et cela fonctionne bien pour les choses de haut niveau que je veux bloquer.

Mais il y a des choses que je veux permettre, mais seulement via mon API personnalisée / bibliothèque que j'ai fournir. Par exemple, je ne veux pas permettre un accès direct au réseau d'ouvrir un URLConnection à yahoo.com, mais je suis OK si elle est faite avec MyURLConnection. C'est -. Il y a un ensemble de méthodes / classes que je veux permettre et tout ce que je veux être hors limites

Je ne crois pas que ce type de sécurité peut être fait avec le modèle de sécurité Java standard, mais peut-être il peut. Je n'ai pas une exigence spécifique pour la performance ou la flexibilité dans le langage de script lui-même (les scripts seront simples appels de procédure à mon API avec looping de base / branchement). Ainsi, même une surcharge « grande » qui vérifie un contrôle de sécurité à chaque appel de réflexion est bien pour moi.

Suggestions?

Était-ce utile?

La solution

Disclaimer: Je ne suis pas un expert sur les API Java de sécurité, donc il peut y avoir une meilleure façon de le faire.

Je travaille pour Alfresco, basé sur Java Enterprise Open Source CMS, et nous avons mis quelque chose de semblable à ce que vous décrire. Nous voulions autoriser des scripts, mais seulement d'exposer un sous-ensemble de nos API Java pour le moteur de script.

Nous avons choisi Rhino Engine pour les scripts JavaScript. Il vous permet de contrôler les API sont exposées à JavaScript, ce qui nous permet de choisir quelles sont les classes disponibles, et qui ne sont pas. Les frais généraux, selon nos ingénieurs, est de l'ordre de 10% - pas trop mal.

En plus de cela, et cela peut être utile pour vous aussi, du côté Java, nous utilisons Acegi (maintenant Spring Security), et utiliser AOP pour donner un contrôle basé sur les rôles sur les méthodes un utilisateur peut appeler. Cela fonctionne assez bien pour l'autorisation. Donc, en effet, un utilisateur accédant à notre application via JavaScript d'abord une API restreint dont il dispose en premier lieu, et que l'API peut être restreint encore plus basé sur l'autorisation. Donc, vous pouvez utiliser les techniques AOP pour restreindre davantage les méthodes peuvent appeler, permettant ainsi d'exposer cela dans d'autres langages de script tels que Groovy, etc. Nous sommes en train d'ajouter ceux aussi bien, ayant la confiance que notre Java sous-jacente API protéger les utilisateurs contre tout accès non autorisé.

Autres conseils

Vous pourrez peut-être utiliser un chargeur de classe personnalisée qui fait Vets un lien vers les classes avant de déléguer à son parent.

Vous pouvez créer vos propres autorisations, vérifiez les dans vos API sensibles de sécurité et ensuite utiliser AccessController.doPrivileged pour restaurer les privilèges appropriés tout en appelant l'API sous-jacente.

Vous devez vous assurer que le moteur de script lui-même est sécurisé. La version de Rhino dans le Sun JDK doit être correct, mais aucune garantie. Il est évident que vous devez vous assurer que tout à la disposition du script est sécurisé.

Groovy, vous pouvez faire exactement ce que vous avez mentionné. En fait, très facile. Vous pouvez facilement limiter les autorisations de scripts non sécurisés exécutés dans un environnement de confiance, permettre l'utilisation de votre propre api, qui à son tour peut faire des choses non fiables.

http://www.chrismoos.com / 2010/03/24 / groovy-scripts et jvm-sécurité /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top