我必须在 Linux 服务器上运行不受信任的第三方应用程序。
该程序应该以指定用户的身份运行一段时间,例如 30 秒。
在此期间,程序可以使用所有的系统资源,但只能在指定的目录下进行写入。
程序终止或因超时而终止后,系统必须进行清理,因此确切地与运行应用程序之前的状态相同。
不应遗漏任何描述符、套接字、生成的进程、文件或其他系统资源。
我怎样才能做到这一点?
答案1
听起来你正在寻找类似操作系统容器的东西。Solaris 版本曾经被称为区域,它是一种虚拟化,其中多个虚拟机共享一个内核,但实际上具有单独的 PID 0 进程,甚至不同的文件系统。
如果您确实需要运行需要执行的某些操作,然后将所有内容重置回稳定状态,那么像这样的操作将是一个不错的选择。这是一个快照完整的虚拟机;启动机器,运行进程,停止机器,回滚到已知良好的快照。有些虚拟机,例如 VMWare,甚至可以实时执行此过程,尽管在将实时内存快照提交到磁盘(或从磁盘恢复)时会有一个相当明显的暂停。
答案2
创建一个新的 shell 作为用户 shell 的包装器。
当用户登录时,此 shell 会创建一个名为 ramdisk 的动态文件,chroot 到其中,生成具体的用户 shell,创建一个休眠 30 秒的新线程,等待后递归地终止所有子进程,然后销毁 ramdisk 并注销用户。
对此进行编程被留作家庭作业。