在线虚拟机中安全地评估perl代码

时间:2013-02-13 19:30:13

标签: linux perl amazon-ec2 virtualization

更新2 :我得到了这个工作并且它正在运行:)

更新:请检查评论,@ urggami答案正常但有轻微问题。我可能会做一些非常简单的错误。


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

(自从我第一次接触perl,linux,bash,osx以来仅仅几个月,所以请放轻松我)

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

一个单独的Amazon EC2 VM,它将评估不安全 perl代码并返回结果。 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 管道$ code ? 像open(FILE,"perl <some_magic> | ")一样。可能听起来很愚蠢,但我不得不问:(。 这已由@ikegami在评论中解决。

  2. 我似乎无法使用Capture::Tiny。我尝试在超时块中执行此操作:
    my ($stdout, $stderr, $count) = capture { system('echo Hello') };
    但我一直在变空! :(是不是因为它在超时内?(虽然我对此并不在意)

  3. 我还没有看到任何其他安全漏洞吗?我应该做分叉限制吗?我应该怎么做呢? (链接和一些指针会很好)

  4. http://www.perltuts.com的作者在this article中说他使用qemu和debian图像来运行他的代码。除了限制叉,他的方法在语义上与我的相似吗?(再次请原谅我的无知,记住我几个月前才碰到一个linux盒子)

  5. 我的开发框是OSX 10.8,生产服务器是RHEL用于前端,Ubuntu用于Perl eval机器。我在EC2上运行。查看完整堆栈details here

    任何详细的答案都将得到赞赏并得到代表和独角兽的回报:)

1 个答案:

答案 0 :(得分:5)

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

我探讨了FreeBSD Jails,我的lack of networking经历以及我不得不多次重建操作系统驱使我离开的事实。 FreeBSD真的很酷!!我很快就会回来。

我谦虚地看着OpenVZ然后感谢@ewwhite我重温了Linux Containers并给了它一个合适的镜头。

文档不是很好,但this article对所有内容都有帮助。

  • 我在负载均衡器下设置了多个容器:HAProxy
  • 我在每个容器中都安装了一个perl,并带有我需要的cpan模块。
  • 我的 PerlExecutor 应用程序是一个在Starman上运行的Dancer应用程序,它由受限用户拥有,该用户拥有较少的权限并且在{ {3}}
  • 容器已被禁止上网。

一个限制:我对网络知之甚少,所以我通过在主机上禁用端口转发来阻止来自互联网的监狱。但是,jail仍然需要在网络上供主机与之通信,因此,您仍然可以在jail中执行 ping 来解析域名,但赢了不回应。因此任何内部Web请求都会失败。我还对Ping进行字符串扫描并阻止它。

非常欢迎任何建议或改进!

我要感谢limits.conf @JakeFeasel @ikegami @ewwhite以及ubuntu.SE和unix.SE的帮助:

这就是它的样子:

TryPerl Architecture Diagram