unshare/isolate 挂载命名空间
unshare/isolate mount namespace
我正在尝试使用 util-linux
包中的 unshare
工具设置带有隔离挂载命名空间的 linux container
:
% sudo unshare -m -f /bin/bash
所以我期待 bash 将在命名空间中启动,其中挂载命名空间(即文件系统)将与主机完全隔离,但是我仍然可以修改主机 FS(create/delete 主机 FS 上的文件)。我在这里做错了什么?
我假设挂载命名空间是隔离的,因为命名空间中的 mount/unmount 对主机 FS 没有影响。所以我觉得修改FS是另外一个问题,可能和userns有关,但不是很确定。
挂载namespace只通过复制父树创建一个单独的挂载树。
您仍然需要将文件系统重新挂载为只读,卸载它们,在它们上面挂载 tmpfs 或 pivot_root 到干净的树中以防止访问。通过用户命名空间切换到 umapped 用户可以在一定程度上有所帮助,但不会阻止对 world-readable/writable 文件的访问。
如果您需要设置更复杂的命名空间环境 - 基本上是容器 - 您可以使用 firejail or runc to automate those tasks based on configuration files. systemd-nspawn 在直接访问原语(如取消共享)和容器运行时之间提供一些中间功能集。
我正在尝试使用 util-linux
包中的 unshare
工具设置带有隔离挂载命名空间的 linux container
:
% sudo unshare -m -f /bin/bash
所以我期待 bash 将在命名空间中启动,其中挂载命名空间(即文件系统)将与主机完全隔离,但是我仍然可以修改主机 FS(create/delete 主机 FS 上的文件)。我在这里做错了什么?
我假设挂载命名空间是隔离的,因为命名空间中的 mount/unmount 对主机 FS 没有影响。所以我觉得修改FS是另外一个问题,可能和userns有关,但不是很确定。
挂载namespace只通过复制父树创建一个单独的挂载树。
您仍然需要将文件系统重新挂载为只读,卸载它们,在它们上面挂载 tmpfs 或 pivot_root 到干净的树中以防止访问。通过用户命名空间切换到 umapped 用户可以在一定程度上有所帮助,但不会阻止对 world-readable/writable 文件的访问。
如果您需要设置更复杂的命名空间环境 - 基本上是容器 - 您可以使用 firejail or runc to automate those tasks based on configuration files. systemd-nspawn 在直接访问原语(如取消共享)和容器运行时之间提供一些中间功能集。