Python код тюрьмы
У меня есть куча python-проектов с недоверенными WSGI-приложениями внутри них. Мне нужно запустить их одновременно и безопасно. Поэтому мне нужны ограничения для доступа к каталогу, использования модуля Python и ограничения для процессора и памяти.
Я рассматриваю два подхода:
Импортировать через imp-модуль WSGI-объект из определенного файла и запустить его с помощью pysandbox. Теперь у меня есть
SandboxError: Read only object
при выполнении: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)
Измените интерпретатор Python, исключите потенциально опасные модули, запустите параллельные процессы, обменивайтесь данными через сокеты ZMQ/Unix. Я даже не знаю, с чего начать.
Что бы вы могли порекомендовать?
1 ответ
Я бы запускал ваши приложения с gunicorn, с отдельным процессом и конфигурацией для каждого приложения и с разрешениями на уровне пользователя (каждое ненадежное приложение от другого пользователя). Каждый экземпляр gunicorn будет обслуживаться на локальном хосте через порт диапазона пользователя, и nginx или другой веб-сервер могут подключаться к ним для маршрутизации и обслуживания их в Интернете.
Heroku делает этот шаг дальше и помещает в песочницу каждый экземпляр gunicorn (или единорога, apache или произвольного другого сервера) на виртуальной машине. Это, вероятно, самый безопасный из возможных способов и, безусловно, лучший вариант для надежного ограничения использования процессора и памяти, но вам может не потребоваться заходить так далеко, в зависимости от ваших требований.
Одним из преимуществ такого подхода является то, что каждое приложение может работать на другой версии Python, если это необходимо; с песочницей виртуальной машины они могут даже работать на разных операционных системах.
Редактировать: чтобы ограничить использование памяти без использования песочницы VM, см. Этот вопрос. Чтобы ограничить использование процессора, измените настройки gunicorn - раскрутите по одному работнику в стиле gevent на ядро, которое может использовать приложение.
Снова отредактируйте: один совершенно другой подход заключается в использовании механизма песочницы PyPy, который должен быть намного более безопасным, чем CPython плюс модуль песочницы. Однако я бы предпочел подход guincorn или gunicorn + виртуальная машина.