12

機能を簡単に拡張できるように、「プラグイン」を実行できる Python ベースの Web サーバーを作成しています。

このために、いくつかのフォルダー (プラグインごとに 1 つ) と、発生する可能性のあるさまざまなイベントの定義済みの名前にちなんで名付けられた多数のシェル/Python スクリプトを用意するアプローチを検討しました。

1 つの例としてon_pdf_uploaded.py、PDF がサーバーにアップロードされたときに実行されるファイルがあります。これを行うには、Python のサブプロセスツールを使用します。

利便性とセキュリティのために、Unix 環境変数を使用して詳細情報を提供し、プロセスの作業ディレクトリ (cwd) を設定して、場所を見つけなくても適切なファイルにアクセスできるようにします。

プラグイン コードは信頼できないソースからのものであるため、できるだけ安全にしたいと考えています。私のアイデアは、サブプロセスでコードを実行することでしたが、サーバー上の他のリソースにアクセスできないように、別のユーザーで chroot 監獄に入れました。

残念ながら、これについては何も見つけることができませんでした。また、信頼できないスクリプトに依存して自分自身を刑務所に入れたくありません。

さらに、サーバーが他のリクエストに応答している間にプラグインコードが複数のプロセスで同時に実行される可能性があるため、メイン/呼び出しプロセスをchroot監獄に入れることもできません。

そこで質問があります: chroot 刑務所でサブプロセス/スクリプトを最小限の権限で実行して、サーバーの残りの部分が欠陥のある信頼できないコードによって損傷を受けるのを防ぐにはどうすればよいでしょうか?

ありがとうございました!

4

2 に答える 2

5

おそらくこのようなものですか?

# main.py
subprocess.call(["python", "pluginhandler.py", "plugin", env])

それで、

# pluginhandler.py
os.chroot(chrootpath)
os.setgid(gid) # Important! Set GID first! See comments for details.
os.setuid(uid)
os.execle(programpath, arg1, arg2, ..., env)
# or another subprocess call 
subprocess.call["python", "plugin", env])

編集: fork() を使いたかったのですが、それが何をするのかよくわかりませんでした。調べた。新しいコード!

# main.py
import os,sys
somevar = someimportantdata
pid = os.fork()
if pid:
    # this is the parent process... do whatever needs to be done as the parent
else:
    # we are the child process... lets do that plugin thing!
    os.setgid(gid) # Important! Set GID first! See comments for details.
    os.setuid(uid)
    os.chroot(chrootpath)
    import untrustworthyplugin
    untrustworthyplugin.run(somevar)
    sys.exit(0)

これは便利で、私はほとんどそのコードを盗んだだけなので、まともな例を提供してくれたその人を称賛します。

于 2012-07-30T17:05:42.957 に答える
3

jail を作成したらos.chroot、Python ソースから呼び出してそこに入ります。しかし、その場合でも、インタープリターによって既に開かれている共有ライブラリまたはモジュール ファイルは引き続き開かれos.closeます。私はそれを試したことがない。

これが機能したとしても、chroot の設定は大変なので、価格に見合ったメリットがあることを確認してください。最悪の場合、使用する予定のすべてのモジュールを含む Python ランタイム全体と、依存するすべてのプログラム、共有ライブラリ、および などのその他のファイルが/bin/lib各監獄ファイルシステム内で利用可能であることを確認する必要があります。もちろん、これを行っても他のタイプのリソース、つまりネットワーク宛先、データベースは保護されません。

別の方法として、信頼できないコードを文字列として読み込み、信頼できないコードに公開するシンボルのみを定義する辞書をexec code in mynamespacewhereにすることもできます。mynamespaceこれは、Python VM 内の一種の「監獄」になります。import組み込み関数を置き換えるとそれが傍受されない限り、最初にステートメントなどを探してソースを解析する必要があるかもしれません__import__(私にはわかりません)。

于 2012-07-30T16:43:06.153 に答える