linux内核之Namespaces、Cgroups、Capabilities、Seccomp和Landlock
这几个技术都属于Linux内核的关键部分,但它们扮演的角色截然不同。总的来说,Namespaces和Cgroups是容器技术的“基石”,负责构建运行环境;而Capabilities、Seccomp和Landlock则构成层层递进的“安全防线”,共同实现纵深防御。
下面是它们具体角色的一个梳理:
| 角色分工 | Namespaces | Cgroups | Capabilities | Seccomp | Landlock |
|---|---|---|---|---|---|
| 一句话总结 | 隔离"视图" 负责"看什么" |
限制"用量" 负责"用多少" |
拆分"特权" 负责"给什么权力" |
过滤"系统调用" 负责"能打什么电话" |
控制"文件访问" 负责"能碰哪些文件" |
| 核心功能 | 为进程提供独立的系统资源视图,实现资源隔离。 | 限制和统计进程组的资源使用(CPU、内存等)。 | 将传统root用户的"万能"特权拆分为一个个独立的小权限,遵循最小权限原则。 | 拦截和过滤进程发起的系统调用,限制其与内核的交互方式。 | 提供路径级别的细粒度文件访问控制,可限制对特定文件或目录的读写执行等操作。 |
| 类比理解 | 为进程创建独立、封闭的"房间",不同房间内看到的内容不同。 | 为进程设定"预算",限制其能使用的硬件资源。 | 将"万能钥匙"变成一串单独的钥匙,使用时只给必要的钥匙。 | 限制进程能拨打哪些"内核电话",防止其滥用。 | 在文件柜的每个抽屉上加装独立的"密码锁",而非仅锁住整个柜子。 |
| 适用场景 | 容器的核心:构建容器隔离环境的基础,用于进程、网络、文件系统等隔离。 | 资源管控:在容器和云平台中,确保每个容器不会耗尽宿主机资源。 | 权限收紧:为容器或服务进程"降权",移除其不需要的敏感权限(如修改系统时间、加载内核模块)。 | 攻击面缩减:阻止容器内进程执行mount、swapon等危险系统调用。 |
精细化沙箱:在容器内进一步隔离子进程(如浏览器渲染引擎),或为非容器化应用(如Web服务器、数据库)自身增加安全限制。 |
🎬 它们如何协同工作?
这几个技术常常协同工作,形成一个纵深防御体系。例如,在启动一个容器时:
- Namespaces 负责创建隔离环境(如独立的网络和文件系统),让进程"住进独立的房间"。
- Cgroups 则设置资源上限,防止这个"房间"占用过多"水电"(CPU和内存)。
- Capabilities 会丢弃容器进程绝大多数不必要的特权(如加载内核模块的权限)。
- Seccomp 会设置过滤器,禁止调用
mount、swapon等危险系统调用。 - 最后,Landlock 可以作为一个额外的、细粒度的沙盒,例如限制容器内的Web服务器只能写入特定日志目录,即使它被攻破也无法破坏其他文件。
🆚 Namespaces vs Landlock
这里想再特别说明一下,Namespaces 和 Landlock 都涉及文件系统隔离,但机制和粒度存在关键差异:
- 机制不同:Namespaces 的隔离发生在系统视图层面。当容器中执行
chroot或pivot_root时,进程看到的是一个新的文件系统视图,但对这个"新视图"里的所有文件享有同等访问权限。而 Landlock 是基于路径的访问控制,它直接限制进程对宿主机中真实文件路径的访问。 - 管控深度不同:Namespaces 是粗粒度的,一旦进入 namespace,对所有挂载的文件都拥有相同权限。而 Landlock 允许你定义精细的策略,例如,允许读取
/etc但禁止写入,只允许在/tmp下创建新文件等。Landlock 甚至可以作用于宿主机全局的文件系统,这是 Namespaces 做不到的。
💎 总结
简单来说,这张表格可以帮你从宏观上理解它们的角色:
- Namespaces:为进程分配独立的“房间”。
- Cgroups:为房间设定“水电煤”用量。
- Capabilities:拆分“万能钥匙”,只给必要的门钥匙。
- Seccomp:屏蔽“电话本”上危险的号码。
- Landlock:为房间内的每个“抽屉”加装独立的锁。
浙公网安备 33010602011771号