在 Linux 上对二进制文件进行沙箱处理

在 Linux 上对二进制文件进行沙箱处理

我正在尝试了解在 Linux 中限制/沙盒化二进制文件的各种选项。我发现我可以使用namespacescgroups就像 docker 一样。我可以使用SELinux这个链接建议。我该使用哪一个?命名空间和 cgroup 是使用 SELinux 实现的吗?它们如何在 Linux 中共存?

还有我什么时候使用能力?如果我在二进制文件中内置了 SElinux 或命名空间/cgroup 策略,为什么我需要这些?

答案1

Linux 包含多种不同的安全机制,可用于对进程进行限制。它们中的大多数可以一起用来构建沙箱和容器。对一些机制的简短概述:

  • 数模转换器(自主访问控制):传统的所有者/组权限。进程所有者、组、文件的传统权限位。

  • 苹果(强制访问控制),SELinux 和 AppArmor 是最常见的实现。 MAC 系统在主​​体(进程、用户等)和对象(文件、套接字等)之间强制执行规则来决定允许的访问。 MAC 规则使复杂的策略和更细粒度的权限成为可能。然而,配置工作量可能并不小。

  • 能力允许进程拥有超级用户权限的子集。以 root 身份执行的进程可以在切换到非特权用户之前保留某些功能,从而有望通过仅保留最少量的超级用户功能来减少攻击面。然而,许多功能非常广泛,几乎可以等同于root[1]。通过使用文件功能,可以将某些 setuid 二进制文件变为非 setuid。

  • cgroups用于流程核算、应用资源限制和管理。例如冰箱提供了一种可靠的方法来冻结组内的所有进程(否则这可能是一个有问题的任务)。

  • 命名空间允许进程有单独的环境(挂载、网络、用户、pid,...)。网络命名空间不共享相同的网络配置,每个 pid 命名空间不知道其父命名空间的 PID,等等。很容易看出如何使用命名空间来构建 Linux 容器。

(还有更多机制,例如 chroot、seccomp 过滤器和 ACL。)

有些功能是重叠的(例如 DAC、MAC 和功能)。一起使用它们对于构建分层安全性仍然很有用。理想情况下,由于错误或配置错误而导致的漏洞可以在其中一层中得到缓解。

每个功能都包含其自己的实用程序和 API。LXC提供了一种通过单一界面利用这些功能的简单方法。 LXC 还允许仅使用部分功能的配置;例如,在拥有专用网络命名空间的同时与主机共享挂载命名空间。还可以在具有自己独立命名空间的容器内运行完整的 Linux 用户空间。

相关内容