2011-01-23 7 views
7

All,SecurityManager cho một dịch vụ đám mây "sandbox"

Tôi đang làm việc trên thiết kế của một dịch vụ dựa trên đám mây sẽ cung cấp các tùy chọn để thực hiện một số mã "cắm" đệ trình bởi khách hàng. Để thực hiện công việc này, điều quan trọng là các plugin không thể đe dọa tính toàn vẹn của hệ thống hoặc có khả năng truy cập dữ liệu của các máy khách khác.

Lý tưởng nhất là tôi muốn khách hàng có thể gửi tệp jar đơn giản (có chứa một lớp phù hợp với một số giao diện được xác định trước) mà sau đó sẽ được chạy trong một hộp cát.

Mã khách hàng nên được phép:

  • Đi càng nhiều thời gian CPU như nó cần trên một sợi đơn
  • Thực hiện bất kỳ tính toán sử dụng các lớp java tiêu chuẩn (ví dụ java.lang.Math, java. util.Random vv)
  • Gọi bất kỳ thư viện đóng gói trong lọ (nhưng mà phải chịu sự hạn chế tương tự)

nhưng tôi đặc biệt sẽ cần phải không cho phép như sau:

  • đẻ trứng chủ đề mới (do đó tài nguyên máy chủ có thể được quản lý một cách công bằng!)
  • Bất kỳ quyền truy cập vào hệ thống tập tin/IO/mạng
  • Bất kỳ quyền truy cập vào mã nguồn gốc
  • Bất kỳ quyền truy cập vào dữ liệu trong JVM khác được chuyển đến/được tạo bởi mã máy khách
  • Bất kỳ quyền truy cập nào vào phản ánh trên các lớp khác với các lớp trong hộp cát .jar
  • Bất kỳ khả năng gọi phương thức nào trên các đối tượng bên ngoài hộp cát, trừ thư viện chuẩn Java

Có thể thực hiện điều này bằng thiết lập ClassLoader/SecurityManager tùy chỉnh không? Hoặc tôi sẽ cần phải bắt đầu tìm kiếm một giải pháp phức tạp hơn (ví dụ: khởi chạy nhiều JVM?)

+0

@M bất kỳ tiến trình nào để báo cáo? –

Trả lời

4

Quản lý tài nguyên và giới hạn tài nguyên là không thể trong java. Bạn có thể ngăn mã độc hại vào tài nguyên hệ thống truy cập (đĩa/mạng và như vậy) hoặc JVM riêng của mình nhưng: ...

đẻ trứng chủ đề mới (do đó tài nguyên máy chủ có thể được quản lý một cách công bằng!)

  • Nếu tôi muốn được độc hại Tôi sẽ làm tất cả các mã của tôi trong thread finalizer và chỉ chặn VM. Cùng làm protected void finalize(synchronized(Thread.class) {for(;;) LockSupport.park();}} bye-bye chủ đề mới.
  • Ăn tất cả bộ nhớ, ăn tất cả bộ nhớ trực tiếp, v.v.
  • Truy cập các file zip trong jar của riêng tôi, và mong đợi 'em bị chuyển đi nơi khác, do đó tai nạn JVM (do lỗi (s) trong zlib)

Nếu một cố muốn chối bỏ nguồn lực, nó chỉ là không phải là một nhiệm vụ khả thi để thử và bắt được hacker. Bạn sẽ cần phải biết những gì để tìm kiếm và tự động kiểm tra/tăng cường các lớp học trong thời gian chạy để không cho phép hành vi.

Bất kỳ khả năng gọi các phương thức trên các đối tượng bên ngoài sandbox, trừ các thư viện chuẩn của Java

các thư viện chuẩn là gì? Bạn có biết nếu/khi họ có thể phải thực thi một số mã trong một phương pháp đặc quyền.


Mỗi khách hàng - VM riêng biệt/hạn chế đầy đủ, quy trình liên quan/ưu tiên, bao gồm bộ nhớ tối đa/ngăn xếp, v.v.

+0

Đó là khá nhiều mô hình dalvik –

+0

@ Chris Thompson: Làm thế nào để nó đối phó w/tai nạn mã nguồn gốc? – bestsss

+0

Bạn biết đấy, đó là một câu hỏi tuyệt vời và tôi không chắc chắn. Tôi sẽ cố gắng tìm nó và đưa ra một bình luận khác ở đây. BTW Tôi có nghĩa là đề xuất của bạn về các cá thể VM riêng biệt là những gì Dalvik thực hiện trong trường hợp không rõ ràng. –

1

Tôi nghĩ mọi thứ bạn muốn đạt được đều có thể được thực hiện thông qua tùy chỉnh SecurityManager. Trong thực tế nó khá đơn giản, bạn chỉ cần tạo một lớp mở rộng SecurityManager, triển khai hai phương thức checkPermission(..) và trong lần lặp đầu tiên chỉ cần ném một số SecurityException cho mọi thứ xuất hiện (và ghi lại những gì bạn vừa từ chối). Sau đó, bạn cho phép hoạt động cụ thể cho đến khi bạn thấy mình trong tình huống có thể tạo các plugin hữu ích và cho phép khách hàng của bạn chơi với nó. Họ sẽ khiếu nại. Sau đó, bạn phải đánh giá xem liệu có cho phép họ làm bất cứ điều gì họ yêu cầu hoặc nếu bạn muốn tuân thủ các quy tắc của mình. Ở đây phần khó khăn bắt đầu ...