Python код тюрьмы

У меня есть куча python-проектов с недоверенными WSGI-приложениями внутри них. Мне нужно запустить их одновременно и безопасно. Поэтому мне нужны ограничения для доступа к каталогу, использования модуля Python и ограничения для процессора и памяти.

Я рассматриваю два подхода:

  1. Импортировать через 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)
    
  2. Измените интерпретатор Python, исключите потенциально опасные модули, запустите параллельные процессы, обменивайтесь данными через сокеты ZMQ/Unix. Я даже не знаю, с чего начать.

Что бы вы могли порекомендовать?

1 ответ

Решение

Я бы запускал ваши приложения с gunicorn, с отдельным процессом и конфигурацией для каждого приложения и с разрешениями на уровне пользователя (каждое ненадежное приложение от другого пользователя). Каждый экземпляр gunicorn будет обслуживаться на локальном хосте через порт диапазона пользователя, и nginx или другой веб-сервер могут подключаться к ним для маршрутизации и обслуживания их в Интернете.

Heroku делает этот шаг дальше и помещает в песочницу каждый экземпляр gunicorn (или единорога, apache или произвольного другого сервера) на виртуальной машине. Это, вероятно, самый безопасный из возможных способов и, безусловно, лучший вариант для надежного ограничения использования процессора и памяти, но вам может не потребоваться заходить так далеко, в зависимости от ваших требований.

Одним из преимуществ такого подхода является то, что каждое приложение может работать на другой версии Python, если это необходимо; с песочницей виртуальной машины они могут даже работать на разных операционных системах.

Редактировать: чтобы ограничить использование памяти без использования песочницы VM, см. Этот вопрос. Чтобы ограничить использование процессора, измените настройки gunicorn - раскрутите по одному работнику в стиле gevent на ядро, которое может использовать приложение.

Снова отредактируйте: один совершенно другой подход заключается в использовании механизма песочницы PyPy, который должен быть намного более безопасным, чем CPython плюс модуль песочницы. Однако я бы предпочел подход guincorn или gunicorn + виртуальная машина.

Другие вопросы по тегам