更新:请检查评论,@ikegami答案正在工作,但有一个小问题.我可能会做一些很简单的事情.
我最近决定我不得不学习Linux / Perl,然后我开始构建这个www.tryperl.com作为一个学习项目.这是一个Cloud IDE.
(自从我第一次在Perl,linux,bash,osx手中开始只有几个月,所以请轻松一点)
一个单独的Amazon EC2 VM,它将评估不安全的perl代码并返回结果.虚拟机将被阻止从互联网和负载均衡.然后,我可以从快照重新设置这台机器.
这主要是我将使用代码来评估服务器上的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;
我的问题
>我可以以某种方式避免物理文件创建,并使用$arg管道$代码?
像打开(FILE,“perl< some_magic> |”).可能听起来很愚蠢,但我不得不问:(.
这在@ikegami的评论中已经解决了.
>我似乎不能使用Capture::Tiny.我尝试这样做在超时块内:
我的($stdout,$stderr,$count)= capture {system(‘echo Hello’)};
但是我一直没有空字符串! (是因为它在超时之内吗?(我不太在意这个)
>我没有看到任何其他安全漏洞?我应该做一个叉限制吗?我该怎么开始这样做? (链接和一些指针会很好)
> http://www.perltuts.com的作者在this article年表示,他使用qemu和一个debian图像来运行他的代码.他的做法与我的语义相似吗? (原谅我的无知在这里,记住我几个月前碰到一个linux盒)
我的开发框是OSX 10.8,生产服务器是前端的RHEL和Perl eval Machine的Ubuntu.我跑EC2.查看完整的堆栈details here.
任何详细的答案将会赞赏和奖励代表和独角兽尘土:)
解决方法
我探索了FreeBSD Jails,我的lack of networking经验和事实,我不得不重建操作系统多次驱使我离开. FreeBSD真的很酷!我会很快回来
我在OpenVZ看起来很惨淡,然后感谢@ewwhite我重新审视了Linux Containers,并给了它一个适当的镜头.
文档不是很好,但this article真的帮助了一切.
>我在一个负载均衡器下安装了多个容器:HAProxy.
>我有一个perl安装在每个容器与我需要的cpan模块.
>我的PerlExecutor应用程序是一个运行于Starman的Dancer应用程序,它运行在一个有限的用户拥有,具有较少的权限,并在limits.conf有限制
>容器被从互联网封锁.
一个限制:我不太了解网络,所以我通过禁用主机端口转发来阻止互联网上的监狱.然而,监狱仍然需要在网络上,以便主机与之通信,因此,您仍然可以在监狱内执行ping,以解决域,但不会响应.所以任何web请求都会失败.我还对Ping进行字符串扫描并阻止它.
任何建议或改进将是非常欢迎!
我想感谢@JakeFeasel @ikegami @ewwhite @chris-s和ubuntu.SE和unix.SE的人们的帮助:
这是它的样子: