2009-02-09 40 views
11

我正在運行一些未經驗證的腳本(用尚未確定的語言編寫,但需要基於Java,所以JRuby,Groovy,Jython,BeanShell等都是候選人)。我希望這些腳本能夠做一些事情,並限制做其他事情。使用Java腳本編寫的安全性(JRuby,Jython,Groovy,BeanShell等)

通常,我只是去使用Java的SecurityManager並完成它。這很簡單,讓我限制文件和網絡訪問,關閉JVM的能力等等。這對於我想阻止的高層次的東西來說很好。

但有一些東西我想允許,但只能通過我提供的自定義API /庫。例如,我不想允許直接網絡訪問來打開yahoo.com的URLConnection,但如果使用MyURLConnection完成操作,則可以。那就是 - 我想要允許的一組方法/類,然後我想要禁止其他任何方法。

我不相信這種類型的安全性可以用標準的Java安全模型完成,但也許可以。我對腳本語言本身的性能或靈活性沒有具體的要求(腳本將通過基本的循環/分支對我的API進行簡單的程序調用)。所以,即使是每次反射電話都檢查安全檢查的「大」開銷也沒有問題。

對此提出建議?

回答

4

聲明:我不是Java安全API的專家,因此可能有更好的方法來做到這一點。

我爲Alfresco,基於Java的開源企業CMS工作,我們實現了類似於您所描述的內容。我們希望允許使用腳本,但只能將一部分Java API暴露給腳本引擎。

我們選擇了Rhino Engine for JavaScript腳本。它允許您控制哪些API暴露給JavaScript,從而允許我們選擇哪些類可用,哪些不可用。據我們的工程師稱,開銷爲10%左右 - 不算太壞。除此之外,這也可能與你有關,在Java方面,我們使用Acegi(現在稱爲Spring Security),並使用AOP來對某個用戶可以調用的方法進行基於角色的控制。這對於授權非常有效。因此,實際上,首先通過JavaScript訪問我們的應用的用戶首先有一個受限制的API,然後基於授權可以進一步限制該API。因此,您可以使用AOP技術來進一步限制可以調用哪些方法,從而允許以其他腳本語言(例如Groovy等)公開此類方法。我們正在添加這些方法,並且相信我們的基礎Java API保護用戶免受未經授權的訪問。

+0

謝謝 - 這真的很有幫助。順便說一句 - 我的使用案例是允許人們上傳腳本,以便他們的負載測試在http://browsermob.com上運行。我沒有看過Rhino,但只要它不允許像Groovy那樣直接訪問Java API,就好像它可以工作。 – 2009-02-09 21:35:45

+0

是的 - 你有更多的控制權,從安全角度來看這是很好的。您可能必須爲某些API創建包裝,然後公開這些對象。例如,我們有一個工作流引擎,並創建了一個工作流對象,然後我們可以使用JavaScript來控制您可以執行的操作。 – 2009-02-09 21:41:14

3

您可能可以使用自定義類加載器在委派給其父級之前執行獸醫鏈接到類的自定義類加載器。

您可以創建自己的權限,檢查安全敏感API中的權限,然後使用AccessController.doPrivileged在調用基礎API時恢復相應的權限。

您需要確保腳本引擎本身是安全的。 Sun JDK的版本應該沒問題,但沒有保證。很顯然,您需要確保腳本的所有可用內容都是安全的。