10

アップデート2:私はこれを機能させてライブです:)

更新:コメントを確認してください。@ ikegamiの回答は機能していますが、少し問題があります。私はかなり単純な間違ったことをしているのかもしれません。


私は最近、Linux / Perlを本当によく学ぶ必要があると判断し、学習プロジェクトとしてこのwww.tryperl.comの構築を開始しました。これは一種のクラウドIDEです。

(私が最初にperl、linux、bash、osxを手にしたのはほんの数ヶ月ですので、気楽にやってください)

現在、 Safe.pmでコードを評価していますが、私のゲームプランは次のとおりです。

安全でないperlコードを評価し、結果を返す別のAmazonEC2VM。VMはインターネットからブロックされ、負荷分散されます。その後、時々スナップショットからこのマシンをリセットできます。

これはにサーバー上のperlコードを評価するために使用するコードです。タイムアウト管理にはTime::Outを使用します。

my $code = ..
my $arg = ..

#create a file with random name
my $filename = rand().".pl";
open(FILE,">$filename")
print FILE $code;
close(FILE);

#use Time::Out to timeout after 10 secs

my $ret = timeout 10 => sub {
  #run the file just created with $arg as an argument. << This is IMP 
  my $r = `perl $filename $arg`;
  return $r;
};
if ($@){
    return $@;
}   
return $ret;

私の問題

  1. どういうわけか、物理ファイルの作成を回避し、$コードを$ argでパイプすることはできますか?のようにopen(FILE,"perl <some_magic> | ")。ばかげているように聞こえるかもしれませんが、私は尋ねなければなりませんでした:(。これはコメントの@ikegamiによって解決されました。

  2. Capture::Tinyを使用できないようです。タイムアウトブロック内でこれを実行しようとしました:
    my ($stdout, $stderr, $count) = capture { system('echo Hello') };
    しかし、空の文字列を取得し続けました!:(タイムアウト内にあるからですか?(これについてはあまり気にしませんが)

  3. 私が見ていない他のセキュリティ上の欠陥はありますか?フォーク制限を行う必要がありますか?どうすればそれを始めればよいですか?(リンクといくつかのポインタがいいでしょう)

  4. http://www.perltuts.comの作成者は、この記事で、qemuとdebianイメージを使用してコードを実行していると述べています。フォークの制限は別として、彼のアプローチは意味的に私のものと似ていますか?(ここで再び私の無知を許してください、私がほんの数ヶ月前にLinuxボックスに触れたことを思い出してください)

私の開発ボックスはOSX10.8で、本番サーバーはフロントエンド用のRHEL、Perlevalマシン用のUbuntuです。EC2で実行します。スタックの詳細については、こちらをご覧ください。

詳細な回答は、担当者とユニコーンダストで高く評価され、報われます:)

4

1 に答える 1

5

13日間のハードワークを経て、ようやくやった!!

私はFreeBSDJailsを調査しました。ネットワークの経験が不足していて、OSを何度も再構築しなければならなかったという事実が私を遠ざけました。FreeBSDは本当にかっこいいです!! すぐに戻ります。

私はOpenVZをひどく見ました、そして@ewwhiteのおかげで、私はLinux Containersを再訪し、それに適切なショットを与えました。

ドキュメントは素晴らしいものではありませんが、この記事は本当にすべてに役立ちました。

  • ロードバランサーの下に複数のコンテナーをセットアップしました:HAProxy
  • 必要なcpanモジュールを使用して各コンテナ内にperlをインストールしています。
  • 私のPerlExecutorアプリケーションは、 Starmanで実行されるDancerアプリであり、権限が少なく、limits.confに制限がある制限付きユーザーが所有して実行されます。
  • コンテナはインターネットからブロックされています。

1つの制限:私はネットワークについてあまり知らないので、ホストのポート転送を無効にすることによってインターネットからの刑務所をブロックしました。ただし、ホストが刑務所と通信するには、刑務所がネットワーク上にある必要があります。その結果、刑務所内でpingを実行してドメインを解決できますが、応答しません。したがって、内部のWebリクエストはすべて失敗します。また、文字列スキャンを実行しPingてブロックします。

提案や改善は大歓迎です!

@JakeFeasel @ikegami @ewwhite @ chris-sとubuntu.SEとunix.SEの皆さんの助け に感謝します:

これはどのように見えるかです:

TryPerlアーキテクチャ図

于 2013-02-28T08:37:53.120 に答える