2012-05-14 5 views
8

Tôi có một loạt các dự án python với các ứng dụng WSGI không đáng tin cậy bên trong chúng. Tôi cần phải chạy chúng một cách simulatiously và an toàn. Vì vậy, tôi cần hạn chế cho việc truy cập thư mục, sử dụng mô-đun python và giới hạn cho CPU và bộ nhớ.Mã Python chửi rủa

tôi xem xét hai phương pháp:

  1. nhập qua imp-mô-đun WSGI đối tượng từ tập tin xác định, và chạy nó với pysandbox. Bây giờ tôi có SandboxError: Read only object khi thực hiện:

    self.config = SandboxConfig('stdout') 
    self.sandbox = Sandbox(self.config) 
    self.s = imp.get_suffixes() 
    wsgi_obj = imp.load_module("run", open(path+"/run.py", "r"), path, self.s[2]).app 
    … 
    return self.sandbox.call(wsgi_obj, environ, start_response) 
    
  2. Sửa Python phiên dịch, loại trừ các module có khả năng nguy hiểm, chạy trong các quá trình song song, giao tiếp qua ổ cắm ZMQ/Unix. Tôi thậm chí không biết bắt đầu từ đâu.

Bạn có thể đề xuất điều gì?

+0

Quá trình tách chắc chắn là một ý tưởng hay. Thậm chí tốt hơn là sử dụng ảo hóa. Tôi không biết về pysandbox, nhưng tôi nghe nói rằng các giải pháp hiện tại cho mã sandboxing Python không phải là đặc biệt tốt. –

+1

Sandboxing trong CPython không phải là rất tốt, nhưng thông dịch viên Python khác, đặc biệt là PyPy, có hỗ trợ sandboxing hoàn chỉnh hơn. –

+0

Tôi đã thử hộp cát PyPy. Nó quá phức tạp. – sashab

Trả lời

3

Tôi sẽ chạy ứng dụng của bạn bằng gunicorn, với quy trình và cấu hình riêng cho mỗi ứng dụng và với quyền cấp người dùng (mỗi ứng dụng không đáng tin cậy trên một người dùng khác). Mỗi cá thể gunicorn sẽ phục vụ trên localhost trên một cổng người dùng, và nginx hoặc một máy chủ web khác có thể kết nối vào chúng để định tuyến và phục vụ chúng trên web.

Heroku thực hiện bước này thêm một bước nữa và hộp cát mỗi phiên bản gunicorn (hoặc unicorn hoặc apache hoặc máy chủ khác tùy ý) trong máy ảo. Đây có lẽ là cách an toàn nhất có thể để làm mọi thứ, và chắc chắn là lựa chọn tốt nhất để hạn chế đáng tin cậy việc sử dụng CPU và bộ nhớ, nhưng bạn có thể không cần phải đi xa đến mức đó tùy thuộc vào yêu cầu của bạn.

Một trong những ưu điểm của loại phương pháp này là mỗi ứng dụng có thể chạy trên một phiên bản Python khác nếu thích hợp; với sandbox máy ảo, chúng thậm chí có thể chạy hoàn toàn trên các hệ điều hành khác nhau.

Chỉnh sửa: Để giới hạn mức sử dụng bộ nhớ mà không cần sử dụng phương pháp tiếp cận hộp cát VM, hãy xem this question. Để hạn chế sử dụng CPU, hãy chỉnh sửa cài đặt gunicorn - quay lên một nhân viên theo phong cách gevent trên mỗi lõi một ứng dụng được phép sử dụng.

Chỉnh sửa lại: Một cách tiếp cận hoàn toàn khác sẽ là sử dụng PyPy's sandboxing mechanism nên an toàn hơn nhiều so với CPython cộng với mô-đun hộp cát. Tuy nhiên, tôi thích phương pháp tiếp cận máy guincorn hoặc gunicorn + virtual.

+0

Bạn có thể đề xuất giải pháp nào cho định tuyến? Nó phải nhanh và không đồng bộ, và vì một số nginx logic bổ sung không phải là giải pháp. Vòi rồng? – sashab

+0

Hmmmm, tôi không chắc chắn, tôi sử dụng nginx như một mặt trận cho gunicorn bản thân mình và đã không thử nghiệm nhiều với một phần của ngăn xếp. Liệu logic bổ sung có yêu cầu bạn viết mã tùy chỉnh không? Trong trường hợp đó có thể Tornado sẽ là tốt nhất. Gunicorn có một số loại hỗ trợ Tornado nhưng tôi tin rằng nó cho một mục đích khác với những gì bạn có trong tâm trí. –

+0

Vâng, về cơ bản tôi cần định tuyến tên miền phụ cho ứng dụng và thực hiện động (số lượng ứng dụng có thể thay đổi). – sashab