我最近注意到了slirp4netns或passt/pasta等解决方案,它们本质上解决了这样一个事实:没有(或)就无法创建一对veth网络接口。在用户命名空间广泛可用之前,更改网络配置最初确实仅限于超级用户。root
CAP_NET_ADMIN
有没有文档记载的理由说明为什么创建整个 TCP/IP 堆栈和/或复杂的抽象层比仅允许用户创建自己的对更“容易”?在网络配置工具之上实现用户权限方案是否困难,或者出于安全原因,为什么允许非 root 用户修改他们自己创建的接口的网络配置不是一个好主意?
我最近注意到了slirp4netns或passt/pasta等解决方案,它们本质上解决了这样一个事实:没有(或)就无法创建一对veth网络接口。在用户命名空间广泛可用之前,更改网络配置最初确实仅限于超级用户。root
CAP_NET_ADMIN
有没有文档记载的理由说明为什么创建整个 TCP/IP 堆栈和/或复杂的抽象层比仅允许用户创建自己的对更“容易”?在网络配置工具之上实现用户权限方案是否困难,或者出于安全原因,为什么允许非 root 用户修改他们自己创建的接口的网络配置不是一个好主意?
安全性不是事后才考虑的问题,但它很少成为功能的驱动力。许多安全人员忘记了我们进行计算不是为了确保安全,而是为了实际计算。根本不进行计算会更安全!
所以,这主要是一种分隔功能,而不是隔离栅栏。
首先,你对“必须是 root”这一点是错误的;这就是能力的用途,请参阅
man 7 capabilities
更多详细信息!然后:
在我看来,如果允许每个用户创建网络设备,而所有用户最终只能进入一个全局空间,并且只有一组全局的防火墙规则表等,那么您将陷入巨大的混乱之中。让一组进程看到的网络设备包含在一个逻辑结构中,您就可以突然做一些明智的事情,例如让您的一组文件服务器进程与专用的 SAN 网络接口一起工作,而控制面板通过内部网络与这些进程对话(这不仅仅是一个全局环回接口,还允许使用不同的地址使用不同的虚拟端点),并在控制网络上有监听器,而系统控制器会监视所有这些,并在网络中断时将控制面板重新连接到蜂窝上行链路。
这种将网络设备及其路由和防火墙规则组合成一个逻辑实体的“逻辑构造”就是网络命名空间。
它还有一个额外的好处,就是文件服务器进程无法访问管理接口,但是当网络命名空间被发明时,很多网络服务无论如何都必须以 root 身份运行,所以无论如何,这是一种很容易逃脱的隔离,就像弄清楚如何在不同的主机接口上打开套接字一样简单。