10

更新2:我得到了这个工作并且它是活的:)

更新:请检查评论,@ikegami 的答案是有效的,但有一个小问题。我可能做错了一些非常简单的事情。


我最近决定我必须非常好地学习 Linux/Perl,然后我开始构建这个www.tryperl.com作为一个学习项目。它是一种云 IDE

(从我第一次接触 perl、linux、bash、osx 到现在才几个月,所以请放轻松)

目前我使用Safe.pm评估代码,但我的游戏计划是:

一个单独的 Amazon EC2 虚拟机,它将评估不安全的 perl 代码并返回结果。VM 将被阻止访问 Internet 并进行负载平衡。然后我可以不时地从快照中重置这台机器。

主要是我将用于在服务器上评估 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管道 $code吗?喜欢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盒子)

我的开发箱是 OSX 10.8,生产服务器是 RHEL 用于前端,Ubuntu 用于 Perl 评估机器。我在 EC2 上运行。在此处查看完整的堆栈详细信息

任何详细的答案将不胜感激,并以代表和独角兽尘埃奖励:)

4

1 回答 1

5

经过13天的努力,我终于做到了!!

我探索了FreeBSD Jails,我缺乏网络经验以及我不得不多次重建操作系统的事实让我离开了。不过 FreeBSD 真的很酷!!我很快就会回来。

我黯淡地看着OpenVZ,然后感谢@ewwhite,我重新访问了Linux Containers并给了它一个适当的机会。

文档不是很好,但这篇文章确实对一切都有帮助。

  • 我在负载均衡器下设置了多个容器:HAProxy
  • 我在每个容器内都安装了 perl,并带有我需要的 cpan 模块。
  • 我的PerlExecutor应用程序是一个在Starman上运行的 Dancer 应用程序,它由一个有限用户拥有,该用户拥有较少的权限并且在limits.conf中有限制
  • 容器被阻止与 Internet 连接。

一个限制:我对网络了解不多,所以我通过禁用主机上的端口转发来阻止监狱访问互联网。但是,监狱仍然需要在网络上以便主机与其通信,因此,您仍然可以在监狱内执行ping操作,这将解析域但它不会响应。所以里面的任何网络请求都会失败。我还进行了字符串扫描Ping并阻止它。

任何建议或改进都将受到欢迎!

我要感谢@JakeFeasel @ikegami @ewwhite @chris-s以及 ubuntu.SE 和 unix.SE 的人的帮助:

这是它的样子:

TryPerl 架构图

于 2013-02-28T08:37:53.120 回答