【从零造容器】Mount Namespace 与 pivot_root:构建容器文件系统

💡 原文中文,约12300字,阅读约需30分钟。
📝

内容提要

本文讨论了容器文件系统隔离问题,指出传统的 chroot 方法存在安全隐患,容易被逃逸。介绍了 pivot_root 作为更安全的替代方案,通过创建独立的挂载点和切换根目录,确保容器进程只能访问自己的文件系统。同时强调了挂载传播类型的重要性,以及构建安全容器环境的必要性,包括设备节点和只读根文件系统的实现。

🎯

关键要点

  • 容器进程能看到宿主机的文件系统,传统的 chroot 方法存在安全隐患。

  • chroot 只改变进程的根目录指针,无法有效隔离挂载表,容易被逃逸。

  • pivot_root 是更安全的替代方案,通过交换挂载树的根,确保容器进程只能访问自己的文件系统。

  • mount namespace 创建独立的挂载点表副本,确保容器的挂载操作不影响宿主机。

  • pivot_root 需要在 mount namespace 中使用,且 new_root 必须是挂载点。

  • 容器的 /dev 需要最小化设备节点,避免暴露宿主机的设备。

  • 容器的根文件系统应为只读,以防止攻击者修改文件系统。

  • 挂载传播类型的设置至关重要,必须在容器初始化时设为 private,以避免宿主机的挂载变化影响容器。

延伸问答

为什么传统的 chroot 方法不安全?

传统的 chroot 方法只改变进程的根目录指针,无法有效隔离挂载表,容易被逃逸。

pivot_root 是如何提高容器安全性的?

pivot_root 通过交换挂载树的根,确保容器进程只能访问自己的文件系统,避免了逃逸风险。

什么是 mount namespace,它的作用是什么?

mount namespace 创建独立的挂载点表副本,确保容器的挂载操作不影响宿主机。

在构建容器时,如何确保根文件系统是只读的?

在 pivot_root 之后,可以通过重新挂载根文件系统为只读来确保其不可修改。

容器的 /dev 目录应该如何处理?

容器的 /dev 目录需要最小化设备节点,避免暴露宿主机的设备,通常使用 mknod 创建必要的设备节点。

挂载传播类型在容器初始化中有什么重要性?

挂载传播类型的设置至关重要,必须在容器初始化时设为 private,以避免宿主机的挂载变化影响容器。

➡️

继续阅读