2009-02-09 31 views
11

Tôi đang tìm cách chạy một số tập lệnh chưa được xác minh (được viết bằng ngôn ngữ chưa được xác định, nhưng cần phải dựa trên Java, vì vậy JRuby, Groovy, Jython, BeanShell, vv là tất cả các ứng cử viên). Tôi muốn các kịch bản này có thể thực hiện một số việc và hạn chế làm những việc khác.Bảo mật bằng Java Scripting (JRuby, Jython, Groovy, BeanShell, v.v ..)

Thông thường, tôi chỉ sử dụng SecurityManager của Java và được thực hiện với nó. Điều đó khá đơn giản và cho phép tôi hạn chế quyền truy cập vào tệp và mạng, khả năng tắt JVM, v.v. Và điều đó sẽ làm việc tốt cho những thứ cấp cao mà tôi muốn chặn.

Nhưng có một số nội dung tôi muốn cho phép, nhưng chỉ qua API/thư viện tùy chỉnh mà tôi đã cung cấp. Ví dụ, tôi không muốn cho phép truy cập mạng trực tiếp để mở một URLConnection đến yahoo.com, nhưng tôi OK nếu nó được thực hiện với MyURLConnection. Đó là - có một tập hợp các phương thức/lớp mà tôi muốn cho phép và sau đó mọi thứ khác tôi muốn được giới hạn.

Tôi không tin rằng loại bảo mật này có thể được thực hiện với mô hình bảo mật Java chuẩn, nhưng có lẽ nó có thể. Tôi không có yêu cầu cụ thể về hiệu suất hoặc tính linh hoạt trong chính ngôn ngữ kịch bản lệnh (các tập lệnh sẽ là các lệnh gọi thủ tục đơn giản tới API của tôi với vòng lặp/phân nhánh cơ bản). Vì vậy, ngay cả một "lớn" trên đầu mà kiểm tra một kiểm tra an ninh trên mỗi cuộc gọi phản ánh là tốt của tôi.

Đề xuất?

Trả lời

4

Tuyên bố từ chối trách nhiệm: Tôi không phải là chuyên gia về API bảo mật Java, vì vậy có thể có cách tốt hơn để thực hiện việc này.

Tôi làm việc cho Alfresco, CMS doanh nghiệp nguồn mở dựa trên Java và chúng tôi đã triển khai một cái gì đó tương tự như những gì bạn mô tả. Chúng tôi muốn cho phép tập lệnh, nhưng chỉ để hiển thị một tập hợp con các API Java của chúng tôi cho công cụ tạo tập lệnh.

Chúng tôi đã chọn Rhino Engine cho JavaScript scripting. Nó cho phép bạn kiểm soát các API nào được tiếp xúc với JavaScript, cho phép chúng ta chọn các lớp nào có sẵn và các lớp nào không có. Chi phí, theo các kỹ sư của chúng tôi, là theo thứ tự 10% - không quá tệ. Thêm vào đó, và điều này có thể liên quan đến bạn, ở phía Java, chúng tôi sử dụng Acegi (bây giờ là Spring Security), và sử dụng AOP để kiểm soát dựa trên vai trò mà một người dùng nhất định có thể gọi . Điều đó hoạt động khá tốt để ủy quyền. Vì vậy, thực tế, người dùng truy cập ứng dụng của chúng tôi thông qua JavaScript trước tiên có API bị hạn chế có sẵn cho anh ấy ngay từ đầu và sau đó API đó có thể bị hạn chế hơn nữa dựa trên ủy quyền. Vì vậy, bạn có thể sử dụng các kỹ thuật AOP để hạn chế hơn nữa các phương thức có thể được gọi, do đó cho phép hiển thị các phương thức này bằng các ngôn ngữ kịch bản khác, chẳng hạn như Groovy, v.v. API bảo vệ người dùng khỏi bị truy cập trái phép.

+0

Cảm ơn - điều đó thực sự hữu ích. Btw - trường hợp sử dụng cho tôi là cho phép mọi người tải lên tập lệnh cho các bài kiểm tra tải của họ để chạy trên http://browsermob.com. Tôi đã không nhìn vào Rhino, nhưng có vẻ như nó có thể hoạt động miễn là nó không cho phép truy cập trực tiếp vào các API Java như Groovy. –

+0

Vâng - bạn có nhiều quyền kiểm soát ở đó, điều này tốt từ quan điểm bảo mật. Bạn có thể phải tạo trình bao bọc cho một số API nhất định và sau đó hiển thị các đối tượng đó. Ví dụ, chúng ta có một công cụ dòng công việc, và tạo ra một đối tượng dòng công việc mà sau đó chúng ta tiếp xúc với JavaScript, điều khiển những gì bạn có thể làm. –

+0

Theo dõi nhanh: làm cách nào bạn đảm bảo rằng biến Gói không thể truy cập? Xem http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/ –

3

Bạn có thể sử dụng trình tải lớp tùy chỉnh không hỗ trợ liên kết đến các lớp học trước khi ủy quyền cho cấp độ gốc.

Bạn có thể tạo quyền của riêng mình, kiểm tra các quyền trong API nhạy cảm bảo mật của mình và sau đó sử dụng AccessController.doPrivileged để khôi phục các đặc quyền thích hợp trong khi gọi API cơ bản.

Bạn cần đảm bảo rằng chính công cụ tạo tập lệnh đó là an toàn. Phiên bản Rhino trong JDK mặt trời sẽ không sao, nhưng không đảm bảo. Rõ ràng bạn cần đảm bảo mọi thứ có sẵn cho tập lệnh đều an toàn.

+0

Tom - cảm ơn lời khuyên. Có vẻ như tôi cũng cần nghiên cứu mô hình bảo mật Java hơn một chút - Tôi không biết về doPriveleged –

0

Trong Groovy, bạn có thể làm chính xác những gì bạn đã đề cập. Trên thực tế rất dễ dàng. Bạn có thể dễ dàng hạn chế quyền truy cập của các tập lệnh không đáng tin cậy đang chạy trong một môi trường đáng tin cậy, cho phép sử dụng api của riêng bạn, từ đó có thể làm những việc không đáng tin cậy.

http://www.chrismoos.com/2010/03/24/groovy-scripts-and-jvm-security/

Các vấn đề liên quan