8

信頼できない WSGI アプリを内部に含む python プロジェクトがたくさんあります。それらを同時に安全に実行する必要があります。そのため、ディレクトリ アクセスの制限、Python モジュールの使用、CPU とメモリの制限が必要です。

私は2つのアプローチを考えています:

  1. 定義されたファイルから imp-module WSGI-object を介してインポートし、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 ソケット経由で通信します。ここからどこから始めればよいかさえわかりません。

何をお勧めしますか?

4

1 に答える 1

3

アプリごとに個別のプロセスと構成を使用し、ユーザーレベルのアクセス許可 (信頼されていない各アプリを別のユーザーに) を使用して、gunicorn を使用してアプリケーションを実行します。各 gunicorn インスタンスは、ユーザー範囲ポートの localhost でサービスを提供し、nginx または別の Web サーバーに接続してルーティングし、Web にサービスを提供できます。

Heroku はこれをさらに一歩進めて、各 Gunicorn インスタンス (またはユニコーン、Apache、または任意の他のサーバー) を仮想マシンでサンドボックス化します。これはおそらく最も安全な方法であり、CPU とメモリの使用を確実に制限するための最良のオプションですが、要件によってはそこまでする必要がない場合もあります。

この種のアプローチの利点の 1 つは、必要に応じて各アプリケーションを異なるバージョンの Python で実行できることです。仮想マシン サンドボックスを使用すると、異なるオペレーティング システムで完全に実行することさえできます。

編集: VM サンドボックス アプローチを使用せずにメモリ使用量を制限するには、この質問を参照してください。CPU の使用を制限するには、gunicorn の設定を微調整します。アプリケーションが使用できるコアごとに 1 つの gevent スタイルのワーカーをスピンアップします。

もう一度編集: 1 つの完全に異なるアプローチは、CPython とサンドボックス モジュールよりもはるかに安全なPyPy のサンドボックス メカニズムを使用することです。ただし、guincorn または gunicorn + 仮想マシンのアプローチをお勧めします。

于 2012-05-14T17:25:43.300 に答える