2016-04-30 6 views
2

私は、ユーザが独自の「ウィジェット」を作成できるプラットフォームを開発しています。ウィジェットは基本的にjsスニペットです(将来はhtmlとcssもあります) 。サーバ上で実行されているユーザによって書かれたnode.jsスクリプトのサンドボックス化

問題は、ユーザーがウェブサイトにいなくても実行する必要があるため、基本的に私のサービスはこれらのユーザースクリプトを毎回実行するようにスケジューリングする必要があります。

私はそのスクリプトを「サンドボックス」するための最善の方法を見つけようとしています。最初のアイデアの1つは、Docker内で独自のプロセスを実行することでした。何とかシェルに入ると仮想マシンになり、うまくいけば彼は内部に閉じ込められます。

私はドッカーの専門家ではありません。だからとにかく、1つの単純なjavascriptスニペットを実行するために何百ものドッカーを回転させている別の問題が生じるでしょう。

これを行う「安全な」方法はありますか?おそらく、空のスコープでスクリプトを実行し、何らかの理由で「require」メソッドへのアクセスを削除しますか?

タイムアウトすると、スクリプトを強制終了する必要があります。

EDIT: - これは、ドッキングウィンドウで行うことができ、この関連stackexchange link

答えて

1

を見つけ、あなたはそれで自分のスクリプトでドッカイメージを作成し、で実行するスクリプトのコンテナを作成し、イメージを実行します。

公式のnode.jsドッカー画像に基づいて簡単に作成して共通の画像を作成し、実行時にユーザーのカスタムファイルを渡して実行し、出力を保存して終了します。この方法は、維持する画像が1つしかないため、セットアップが簡単です。

データを渡す最も良い方法は、コンテナにボリュームマウントを作成し、毎回同じ場所でコンテナにユーザーディレクトリをマウントすることです。

たとえば、このようなディレクトリ構造を持つホストがあるとします。

/users/ 
    aaron/ 
    bob/ 
    chris/ 

次に、コンテナを実行するときにボリュームマウントを変更するだけです。

docker run -v /users/aaron:/user/ myimagename/myimage 
docker run -v /users/bob:/user/ myimagename/myimage 

私は出力がどうなるかわからないんだけど、あなたは、コンテナ内の/ユーザー/出力にそれを書くことができ、出力がユーザの出力ディレクトリに格納されます。

タイムアウトまでは、docker psを調べる単純なスクリプトを書くことができます。また、制限時間を超えて実行している場合は、ドッカーがコンテナを停止します。

すべてがコンテナ内で実行されるため、一度に多数を実行することができ、それらはお互いおよびホストから隔離されます。

+0

本当に注意が必要な設定を行いますか? 例えば、ユーザーがnode.jsからシェルを取得したとしましょう。どうすればドッカーから出て自分のホストマシンを所有しないのでしょうか? – kroe

+0

最新のカーネルと最新のドッカーバージョンを持つコンテナからユーザーが脱出できる既知のセキュリティ悪用はありません。ドッカーとカーネルを更新し続ける限り、既知の悪用は迅速に修正されます。これは多くの人にとって大きな問題になるためです。 –

+0

ユーザーはちょうどjavascriptをアップロードし、ノードプロセスで実行します。 私はどうにかして "システムメソッド"へのアクセスを削除することができますので、うまくいけばファイルシステムやバッファオーバーフローに触れませんか? – kroe

関連する問題