2017-02-11 12 views
4

ユーザーから送信されたアプリケーションを実行する必要があります。私のコードは次のようになります:pythonでサブプロセスstdoutとstderrのサイズを制限する方法

私はユーザーが投稿するものを制御できないため、アプリケーションの出力サイズを制限したいと考えています。許可されていないシステムリソースへのアクセスやCPUサイクルの悪用などの他のことは、apparmorルールの適用によって制限されています。実行が許可される最大時間は、親プロセス(Pythonで)によって処理されています。今や、不正なアプリケーションは、stdoutがファイルに保存されていることを知っているので、多くのデータをstdoutに書き込むことによってサーバーシステムをフラッドさせることができます。

stdout/stderrファイルには、AppArmors RLIMITやカーネルモードのものは使用しません。標準ライブラリを使用してPythonからそれを実行できるのは素晴らしいことです。

私は現在、ファイルのサブクラスを作成することを考えています。各書き込みでは、すでにストリームに書き込まれているデータの量を確認します。または、最大長が設定されたメモリマップファイルを作成します。

しかし、私はそれがまだ見えないファイルサイズを制限する簡単な方法があるかもしれないと感じています。

+1

出力を['head'](https://linux.die.net/man/1/head)でパイプすることはできますか? – Leon

+0

@リーオンヘッドが動作します。私はoutp.maxsize = 10000という何かを探していました。その方法は非常に簡単です。私はRLIMITを使用して終了するかもしれません。または、1人の友人が/ etc/security/limitsについてのリンクを共有しました。 –

答えて

2

サブクラスfileをサブクラス化するか、または他の疑似ファイルのPythonオブジェクトを作成することは、ファイルがサブプロセスで消費されるため、まったく機能しません。そのため、O.Sでなければなりません。ファイルであり、Pythonクラスオブジェクトではありません。サブプロセスは、他のプロセスが使用するPythonオブジェクトを送信しません。

そして、mmapモジュールを使用して、メモリマッピングファイルをネイティブでシンプルにサポートしていますが、メモリマッピングはこのためのものではありません。メモリにミラーリングされるファイルのサイズを指定できますファイルへの書き込みを制限する:余分なデータは単にディスクに書き込まれ、マッピングされません。 (また、mmapオブジェクトではなく、ディスクファイルをサブプロセスに渡します)。ある時点でセンチネル値を持つファイルを作成し、そのセンチネルが上書きされているかどうかをチェックして、サブプロセスを終了させる可能性がありますが、信頼できるとは思えません。

次に、inotifyなどのディスクアクティビティ監視ツールがあります。ファイルにアクセスするたびに呼び出されるメインプロセスのハンドラにpyinotifyを使用できます。欠点:「ファイル書き込み」のイベントはありません。単に「ファイルがアクセスされました」です。可能性のあるイベントがファイルのインクリメンタル書き込みによってトリガーされるかどうかはわかりません。それにもかかわらず、子プロセスがすべての書き込みを1回のシステムコールで行うのであれば、とにかく遅すぎると通知されるだけです。

私が考えることは、人工的に制限されたファイルシステムでファイルを作成することです。そうすれば、OSは最大サイズを超えると書き込みをブロックします。

Linuxでは、必要なサイズ+オーバーヘッドでファイルを事前作成し、FSを作成して「ループ」インターフェイスでマウントすることができます。次に、そのファイルシステム内にstdoutとsterrファイルを作成し、あなたの子プロセスに電話してください。

このようなファイルシステムのプールを必要に応じて事前に作成して事前にマウントしておくこともできますし、動的に作成することもできますが、FSホストファイルを作成し、システム構造(mkfs)とそれをマウントする - これはすべてオーバーヘッドになる可能性があります。

すべての場合、単にApparmor独自のrlimit設定を使用するほうがよいでしょう。

+0

ファイルとmmapに関する良い点。私は、ネイティブファイルハンドルからの出力ストリームをPython空間に持っていくオーバーヘッドについては考えなかった。 ファイルシステムの制限についてのあなたの考え方はオプションかもしれません - 私はちょうどサイズ制限でメモリにfsを作成することができます - そうすれば、大きなファイルをディスクに保存する必要はありません。将来の参照のためにファイルを保存する必要があるかどうかはまだわかりません。その場合、最終的な場所にコピーすることができます。私はapparmorの解決策を再考しています。既存の設定に単純なeルールを追加するだけです。 –

関連する問題