我正在尝试构建在线代码编辑器。我的场景:通过 Web 服务器接收到“C”程序的请求 - root 用户创建文件、编译文件并向用户确认成功。
我们正在nodejs
后端使用。现在是运行该程序的时候了 -nodejs
为我们提供了一个选项,可以使用 uid(除 root 之外的不同用户)生成此用户代码。
我如何创建一个没有 ls、px 等任何权限的用户,而只是简单地运行在上述步骤中编译的可执行文件。
我尝试过的解决方案之一:将/usr/bin
, /bin
, /usr/sbin/
, /sbin
, /usr/local/bin
,的权限更改/usr/local/sbin
为 700 ,以便只有 root 用户可以运行所有这些命令,并且该用户只运行简单的“C”程序。但该用户仍然可以选择查看/etc
目录 - 所以基本上我需要一个所有目录都为 700 的用户。这是一个好主意吗?
其他选择是apparmor。还没试过这个。
朋友建议的第三个选项是 chroot,但人们说这不是为了安全措施。
有人可以指导我如何解决这个问题吗?
答案1
Chroot 是更传统的执行此操作的方法,您可以使其工作,但由于您是通过 Web 界面执行此操作,因此它变得有点复杂:您必须防止竞争条件(多个用户使用相同的 chroot 环境) ,您必须为每个请求动态构建一个目录结构,可能还有一些我无法立即想到的其他事情。
如果您使用 Linux,则需要查看容器 ( lxc
) 或 Docker 项目 https://docs.docker.com。尤其是 Docker 平台将非常好且轻松地让您在这里做您想做的事:创建短暂的、轻量级的虚拟系统,可用于运行完全被监禁的进程,而不影响外部(即您的 Web 服务器)资源。您可以下载您希望程序运行的特定操作系统环境(例如 Fedora 12)的基本 docker 映像,告诉 docker 运行该环境,同时将用户的程序源导入到该环境中,然后告诉 docker 运行编译器以及该环境中生成的文件。然后你告诉 docker 销毁临时环境。没有什么留下来,(几乎)没有安全风险。