好吧,我正在使用 Docker,但我还不熟悉 Chroot 监狱。
我有安装了 Debian / Node.js 的 Docker 镜像。但我希望每个 Debian 用户都可以运行自己的 Node.js 应用程序,无需在 Docker 中进行 root 访问。
例子:
- 用户:吉米
- 家:/主页/吉米
- 壳:/bin/bash
所以吉米现在可以运行 Node.js 应用程序,因为他有/bin/bash壳。但他也可以修改整个系统(例如他可以执行“rm -R /etc”)。我对吗?
然后我可以例如修改吉米的壳:/usr/sbin/nologin并让他选择仅从 WEB UI 启动/停止 Node.js 实例...但在 Node.js 中使用“fs”模块他可以修改整个系统。我对吗?
所以现在如果我是对的我有两个选择
- 我想我可以创建“chroot监狱”吉米。所以 /home/jimmy 将成为 chroot 监狱。他可以运行他的 Node.js 应用程序,并且不能修改整个系统。 Node.js“fs”将仅限于 /home/jimmy。我对吗?
- 不关心,只需为 jimmy 初始化新的 Docker 容器...这是很好的选择,但我认为 = 新容器 = 新系统 = 更多数据 [MBs]
好的,如果你们中有人说第一个选项就是我需要的。如果 jimmy 将使用端口 8080 运行 Node.js Web 服务器并且另一个用户将使用相同的端口,那么我如何绑定端口?有了 Docker,我想我可以在容器启动之前处理这个问题。
答案1
您似乎对用户登录有一些误解。
通过/bin/bash
或直接访问 Nodejs,用户只能修改他们有权修改的文件。大多数/etc
可能无法由 by 写入,jimmy
因此它们不应该能够访问rm
整个目录。
您对使用的看法是正确的/usr/sbin/nologin
,用户将无法登录系统。在这种情况下运行用于 Nodejs 访问的 Web UI,您仍然需要确保 Web UI 不允许访问您不希望访问的文件或用户有权访问的文件。
无论您选择哪种解决方案,都无法在同一 IP 地址和端口上运行多个服务。您可以将服务绑定到不同 IP 地址上的同一端口,也可以使用不同的端口。解决方案可能是让每个用户在其端口上运行,然后构建一个 Web 服务器来充当每个服务的代理。
你谈到使用 Docker,所以我不确定你为什么不坚持使用 Docker,尽管我不知道你正在使用的可能的用户限制。它很像具有额外隔离和网络管理功能的 chroot。 Docker 主要设计用于运行单个服务,因此每个用户都有自己的容器来运行 Nodejs 实例,这听起来正是这样的用例。
如果 Docker 不是一个选项,并且您有信心可以正确执行此操作,我建议您使用 chroot。否则,听起来您的要求可以通过一个单一的系统来满足,该系统可以在任何地方提供具有适当权限的多用户登录。