伪造文件系统/虚拟文件系统
我有一个网络服务,用户可以在上面上传Python脚本,这些脚本会在服务器上运行。它们会处理服务器上的文件,我希望用户只能看到服务器文件系统中的某个特定层级(最好是一个临时文件夹,我会把需要处理的文件和脚本复制到这个文件夹里)。
服务器最终会是基于Linux的,但如果在Windows上也能实现解决方案,那我也想知道怎么做。
我想到的是创建一个用户,限制他对文件夹的访问权限——最终只让他访问包含脚本和文件的那个文件夹,然后用这个用户来启动Python解释器。
有没有人能给我一个更好的建议?因为仅仅依靠这个让我感觉不太安全,我希望能有一个真正的沙箱或者虚拟文件系统的功能,这样我就可以安全地运行不可信的代码。
3 个回答
这个软件本身就不安全。让用户上传脚本会引入一种远程代码执行的漏洞。你需要担心的不仅仅是文件被修改,还有什么能阻止这个Python脚本访问网络或其他资源呢?
要解决这个问题,你需要使用一个沙盒。为了更好地保护系统,你可以采用分层安全的方法。
第一层,也是最重要的一层是一个Python沙盒。用户提供的脚本将在这个沙盒中执行。这样可以给你所需的细致限制。然后,整个Python应用程序应该在它自己的专用chroot环境中运行。我强烈推荐使用grsecurity内核模块,它能增强任何chroot的安全性。例如,grsecurity的chroot环境是很难被攻破的,除非攻击者能在内核层面上打个洞,而这在现在是非常困难的。确保你的内核是最新的。
最终的目标是限制攻击者脚本可以使用的资源。分层是一种经过验证的安全方法,只要这些层之间有足够的不同,确保同样的攻击不会同时破坏它们。你希望尽可能将脚本与系统的其他部分隔离开来。任何共享的资源也都是攻击者的攻击路径。
你最好使用像VirtualBox或VMware这样的虚拟机(也许可以为每个用户或会话创建一个虚拟机)。
这样你就可以控制一些其他资源,比如内存、网络和磁盘。
我知道的唯一一个内置了这些功能的Python是Google App Engine上的那个。这个也许对你来说是个可行的替代方案。