繁体   English   中英

如何阻止服务器执行的程序删除文件?

[英]How can I stop programs executed by a server from deleting files?

我正在开发一个项目,这是一个系统,学生可以将他们的编码作业提交到服务器,然后服务器在服务器上执行他们的代码作为测试的一部分,然后根据执行的测试结果返回他们收到的成绩。

存在一个安全问题,即提交代码的学生可能会通过包含删除系统文件存储目录的代码来“损坏”服务器。 这些文件存储在一个目录层次结构中,如果学生以某种方式找到它的路径,他们可以轻松地编写程序来删除这个目录。

从那以后我就有了设置权限,以便服务器在不同的用户下运行。 该用户只能访问存储该模块所有提交的单个目录。 他们理论上仍然可以清除该目录,但总比删除整个系统要好。 虽然它仍然不理想,但我不知道如何处理它。

服务器编码为 Python。 我曾尝试使用 os.chown 等将目录的所有权更改为单个用户,但是,我发现该程序需要在超级用户下运行才能更改所有权以及调用 os.setuid 和 os.setgid。

基本上,我的问题是,有什么方法可以运行程序,同时将其限制在其运行的目录中? 这将只涉及允许它删除其工作目录中的文件/文件夹。 我知道有一个 chroot 命令,但这也需要超级用户权限。

也不可能在没有 sudo 权限的情况下在其他用户下运行程序。 程序使用 subprocess.Popen() 执行。

我知道这是一个很长的机会,因为我已经尝试了很多具有权限的研究,并且当前的解决方案限制删除到提交数据目录是我所能得到的。 但是它仍然不理想,并且不允许使用 sudo 权限运行服务器。

如果可以设置任何程序属性来防止该程序删除文件,那就太好了,但我认为不存在这样的系统。 我可能不得不求助于“扫描”提交的代码文件以查找危险调用,如果其中有任何此类调用,则拒绝该文件。

使用当前目录层次结构:
.handin/ module-code /data (数据是每个学生提交的存储位置)`

目前,数据目录是使用组处理创建的,该组处理允许该组的任何成员在其中创建目录。 随着服务器在用户handin 下运行,它使用用户handin 和组handin 在该数据目录中创建目录/文件。 因此,服务器可以作为用户 handin 删除的唯一文件是 data 下的所有目录,而不是整个.handin 目录。

在数据下方,您有根据学生 ID 命名的目录,例如 .handin/ module-code /data/12345678,在其下方,您有一个带有作业名称的目录。 分配目录是执行代码的目录。如果是只能删除的目录,那么最好是学生ID目录。

所以,我已经为每次执行使用单独的 Docker 容器解决了这个问题。 我在将要执行的程序中为不同语言创建了单独的图像。然后我在这些容器中创建了一个用户,该用户具有在其主目录中创建/删除文件的足够权限,本质上是沙箱。

然后,我使用由 Stepik.org 创建的 epicbox python 模块 ( https://pypi.org/project/epicbox/ ) 在他们自己的容器中对编程作业进行评分(与我需要解决的问题非常相似)。

这会在内部创建一个卷,以允许每个运行的 docker 容器共享文件:

    with epicbox.working_directory() as workdir:
      epicbox.run(....)
      epicbox.run(....)
      .....
      epicbox.run(....) 

每次运行调用都会启动一个 docker 容器,但使用内部创建的卷,每个容器都可以访问上一次调用 run() 生成的文件。 该模块允许您将文件从本地机器上传到 docker 容器,然后在那里编译/执行它们。

我确实必须做一些“黑客”来将其配置为我的要求(更改 docker 容器中的默认工作目录,因为 epicbox 没有提供轻松更改它的方法)。 与在服务器本身上执行相比,此解决方案增加了几秒钟的执行时间,但对于我的用例来说,这是一个可接受的安全性权衡。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM