我正在写一个程序来测试学生编写的程序。恐怕我不能信任他们,我需要确保它不会因运行它的计算机而严重损坏。
我当时正在考虑让一些崩溃测试用户只能有限地访问系统资源并以该用户身份运行程序,但是从到目前为止在网上发现的情况来看,制作虚拟系统将是最安全的选择...
有人可以帮助我选择正确的方法吗?安全是我最大的担忧。另一方面,我不想要一个过分的解决方案,并且浪费大量时间尝试学习我真正不需要的东西。
我正在写一个程序来测试学生编写的程序。恐怕我不能信任他们,我需要确保它不会因运行它的计算机而严重损坏。
我当时正在考虑让一些崩溃测试用户只能有限地访问系统资源并以该用户身份运行程序,但是从到目前为止在网上发现的情况来看,制作虚拟系统将是最安全的选择...
有人可以帮助我选择正确的方法吗?安全是我最大的担忧。另一方面,我不想要一个过分的解决方案,并且浪费大量时间尝试学习我真正不需要的东西。
Answers:
虚拟机无需重启即可提供最高的安全性,但性能却最低。
另一种选择是,提供比虚拟机更高的安全性:在不访问硬盘驱动器的情况下引导“活动” CD / DVD / pendrive(暂时禁用BIOS中的HDD;如果不能,至少不要挂载驱动器/如果自动安装,则将其卸载-但是安全性要低得多)
甲搬运工容器是有点不太安全的替代整个虚拟机。两者之间的关键区别(就安全性而言)可能是,在docker中运行的系统实际上使用了主机系统的内核。
有些程序(如隔离程序)会创建一个特殊的安全环境-通常被称为沙箱 -这些程序通常基于chroot,需要额外的监督-可以找到适合您的程序。
一个简单的chroot可能最不安全(特别是在执行程序方面),尽管可能更快一些,但是 ……您将需要构建/复制一个完整的单独的根树并为诸如此类使用绑定挂载/dev
(请参见注释)。 1以下!)。因此,通常不建议使用这种方法,特别是如果您可以使用更安全且通常更易于设置的sandbox
环境。
注0:对于“特殊用户”而言,就像nobody
帐户一样:这几乎没有提供任何安全性,甚至没有提供任何安全性chroot
。一个nobody
用户仍然可以访问文件和程序已经阅读并执行了设置权限等。您可以使用进行测试su -s /bin/sh -c 'some command' nobody
。而且,如果您有任何人都可以访问的配置/历史记录/缓存文件(由于错误或较小的安全漏洞),则具有nobody
的权限运行的程序可以访问该文件,可以使用grep获取机密数据(例如“ pass =“等),也可以有很多方法可以通过网络或其他方式发送。
注意1:正如Gilles在下面的评论中所指出的那样,简单的chroot环境对于针对旨在特权升级的漏洞利用的安全性很小。鞋底的chroot有道理安全的角度来看,只有当环境是最小的,由安全确认程序只(但仍然存在利用潜在内核级漏洞的风险),以及所有在chroot运行不受信任的程序正在运行作为不在chroot之外运行任何进程的用户。chroot所阻止的(具有此处提到的限制)是没有特权升级的直接系统渗透。但是,正如Gilles在另一条评论中指出的那样,甚至可能会绕过该级别的安全性,从而允许程序脱离chroot。
nobody
可以上网。
使用虚拟机。任何少的东西都不能提供太多的安全性。
几年前,我可能曾建议使用chroot专用用户或类似的用户。但是硬件变得更加强大,虚拟机软件变得更加易于使用。此外,现成的攻击变得更加复杂。不再有任何理由不全盘考虑。
我建议运行VirtualBox。您可以在几分钟内设置虚拟机,然后在其中安装Linux发行版。我推荐的唯一非默认设置是网络设置:创建一个“ NAT”接口(与世界进行通信)和一个“仅主机”接口(这样您就可以轻松地与主机进行文件复制和ssh到) VM)。在运行学生程序时禁用NAT接口¹;仅在安装或升级软件包时启用它。
在虚拟机内部,为每个学生创建一个用户。
¹ 您可以将NAT接口限制为用户白名单,但这比简单的点对点设置所需的功能要先进。
这是一个非常彻底的解释,说明为什么使用Chroot仍然是一个非常可行的选择,以及为什么在特定情况下完全使用操作系统或完全硬件虚拟化会显得过大。
Chroot不是安全功能只是一个神话。有一些工具可以自动为您构建chroot文件系统,而Chroot作为有目的的安全功能已内置于许多主流应用程序中。
与普遍看法相反,并非每种情况都需要对操作系统进行完全虚拟化或对硬件进行完全模拟。这实际上意味着要尝试覆盖更多的攻击面。反过来,这意味着安全性较低的系统。(据称是针对知识较少的系统管理员)
规则很简单:不要在chroot中放入不必要的任何东西。不要以root用户身份运行守护程序。不要像在chroot之外运行守护程序的任何用户一样运行守护程序。
删除所有不安全的应用程序,setuid二进制文件,悬挂的无主符号链接/硬链接。使用nosuid,noexec和nodev重新安装不必要的文件夹。从源代码构建运行的守护程序的最新稳定版本。最重要的是,确保基本系统安全!
在问题得到正式回答之后,我将添加此内容:MAGIC:电路/核心中的恶意老化,不幸的是,它被锁在ACM的付费专线后面。本文的目的是当今使用的电路中很小的宽度走线会在使用过程中老化,并最终失效。通过找到正确的指令并一遍又一遍地重复,攻击者可以迅速使IC老化,使其失效。
VM,沙箱,容器或chroot监狱都无法阻止这种恶意破坏硬件。该论文的作者发现了这样的指令序列,并在实验上老化了硬件使其失效,但是他们没有放弃指令,因此暂时不会成为真正的威胁。