跳到内容

5.2 Linux 纵深隔离:MAC、seccomp 与主机加固

DAC 的资源所有者可以修改权限;进程拿到该账户后,往往能读取同账户的全部数据。Mandatory Access Control、seccomp 和 namespace 从不同维度增加独立约束,但没有任何单项机制能把不可信代码变成绝对安全。

SELinux 与 AppArmor 限制对象访问

SELinux 通常依据进程与对象 label 执行 type enforcement:

text
atlas_api_t process
  can read atlas_config_t
  can write atlas_data_t
  cannot read shadow_t

AppArmor 以绑定可执行路径的 profile 描述文件、网络和 capability 等权限,更接近路径导向模型。两者选择通常取决于发行版生态、工具链和团队能力,而不是简单比较“谁更安全”。

策略应从应用真实数据流推导。把 SELinux 设 permissive 或给 AppArmor unconfined 只是关闭边界;看到 denial 后盲目自动生成 allow 规则,则会把攻击流量学习成合法策略。

合理流程:先在测试环境收集最小正常行为,写窄策略,执行正向和负向测试,再在生产 enforcing;生产 denial 要关联版本与请求调查,不能一律视作误报。

seccomp 缩小 syscall 攻击面

seccomp-BPF 根据 syscall 编号及有限参数信息执行 allow、errno、kill、trap 等动作。它不能理解“只允许打开 /srv/data”这种路径语义,因为指针指向的用户内存会变化;文件路径应由 DAC/MAC、namespace 和安全 API 共同约束。

默认拒绝、只允许所需 syscall 的 allowlist 更有边界价值,却更容易因 libc、语言 runtime、JIT 和新版本行为变化而破坏兼容。应在目标架构、内核和真实负载上生成并测试 profile,同时覆盖异常与升级路径。

返回 EPERM 有时能让应用优雅失败,但也可能隐藏攻击探测;直接 kill 更明确,却可能被恶意请求用于 DoS。动作选择需要结合服务恢复与监控。

Namespace 改变视图,不是新的内核

Mount、PID、network、IPC、UTS、user namespace 可以隔离进程看到的资源。容器正是把这些机制与 cgroup、capability、LSM 等组合起来。

同一宿主上的容器仍共享内核。内核漏洞、过宽 capability、宿主 socket、特权容器和危险设备映射都可能越界。高风险不可信租户可采用轻量 VM、microVM 或独立节点,换取更强内核边界。

尤其避免把容器 runtime socket 挂进普通应用;它通常等价于对宿主容器的管理权限。hostPIDhostNetwork、宿主根目录挂载和 privileged mode 都应经过单独例外审批。

Cgroup 与 rlimit 管可用性故障半径

隔离还要控制资源消耗。攻击者可能耗尽进程数、内存、CPU、文件描述符和磁盘。cgroup 限制资源份额与上限,rlimit 控制单进程/用户维度,两者还需配合:

  • 请求级 body、解压和执行时间限制;
  • 独立磁盘分区与日志速率限制;
  • OOM 策略和服务重启退避;
  • 全局容量预留,避免所有 sandbox 同时达到上限。

限制太低会把合法峰值变成自我拒绝服务,必须通过压力与退化测试确定。

内核与启动链决定底层可信度

主机基线包括:

  • 使用受支持内核与发行版,跟踪安全更新和重启需求;
  • 最小安装,关闭不用的 daemon、协议和内核模块;
  • Secure Boot/verified boot 按设备威胁模型验证启动组件;
  • 限制模块加载、BPF、perf、debugfs、ptrace 和内核日志访问;
  • 对关键配置、账户、服务和包变化做审计;
  • 时间同步、日志远送与完整性保护,避免入侵者抹掉本地证据。

Live patch 能减少部分重启窗口,不代表所有内核和用户态更新都无需重启。资产清单必须知道“已安装版本”和“当前运行版本”的区别。

沙箱要验证逃逸后的下一层

防御组合可以表示为:

text
低权限 UID
  + 最小 capability
  + 只读/最小文件视图
  + MAC policy
  + seccomp syscall allowlist
  + cgroup/rlimit
  + 独立网络与短期身份
  + 更新、检测和恢复

测试不能只确认正常功能。应主动尝试读取宿主 secret、访问 metadata、创建 raw socket、ptrace 邻居、mount 文件系统、fork bomb、写满磁盘和调用未允许 syscall,并确认控制既阻断又产生可操作遥测。

下一章把视角移到主机之间:分段、身份感知访问、出站控制和网络检测怎样共同限制横向移动。

参考资料

Built with VitePress | Software Systems Atlas