Docker:何时使用 apparmor vs seccomp vs --cap-drop

信息安全 linux 码头工人 服装 能力 秒算
2021-09-03 14:45:56

Docker 似乎同时支持 apparmor 和 seccomp。Docker 还允许在运行容器时删除功能。

但是,我找不到有关何时使用哪种方法的任何文档或指南。

它们的用途似乎有很大的重叠,我无法弄清楚何时使用这些选项中的哪一个的任何一般准则。

有人可以提供任何指导吗?

就我而言,我必须在服务器上运行很多学生代码。我想让他们运行 Java 和 c++ 程序。允许对一个目录(数据卷)进行写访问。他们不需要网络访问或任何复杂的东西。

请提供一些指导如何保护。

2个回答

您可以使用所有这些。

这些安全功能中的每一个都有不同的用途,实际上几乎没有重叠。它们的作用都是减少进程一旦受到损害可能造成的损害。它们的开销都非常低,可用于显着提高软件的安全性。

Seccomp是一个 Linux 功能,它允许用户空间程序设置系统调用过滤器。这些过滤器指定允许哪些系统调用,以及允许它们具有哪些参数。它是一个非常低级的过滤器,可以减少内核的攻击面。例如,keyctl()允许对该系统调用进行简单调用以提升权限的错误不一定适用于对该调用的访问受限的程序中的 privesc。

AppArmor是一个强制访问控制框架,用作 LSM(Linux 安全模块)。它用于将主体(程序)对对象(文件、路径等)的访问列入白名单或黑名单。AppArmor 可用于允许程序具有读取权限/etc/passwd,但不允许/etc/shadow这些策略还可用于限制功能,甚至限制网络访问。

能力和能力下降是一种通用技术,特权进程通过该技术撤销其被赋予的特权子集。例如,根进程可以放弃创建与网络的原始连接所需的功能,或绕过标准 UNIX 文件权限 (DAC) 所需的功能,即使它仍然是根。这种技术不是很细粒度,因为只有有限数量的功能可以删除,但它可以减少程序在受到损害时可能造成的损害。

一般来说,您应该知道:

  • Seccomp 降低了内核漏洞被成功利用的机会。

  • AppArmor 阻止应用程序访问它不应该访问的文件。

  • 能力下降减少了受损的特权进程可能造成的损害。

另请参阅沙盒是如何实现的?

@forest回答得很好,但我想添加一些建议,这些建议反映了我对安全框架和安全设计的总体看法。实施安全性与了解您要保护自己免受什么侵害或至少要保护什么密切相关。然而,所有这一切都必须从安全策略开始。一旦制定了政策,选择就更容易了。让我们考虑几个案例,它们可能反映也可能不反映您的用例。但在考虑它们之前,将可用选项缩小到以下范围可能会有所帮助:

  1. 如果你不能修改目标程序,你唯一的选择是 MAC——强制访问控制——(充其量),因为你所需要的只是提供一个安全策略来评估给定的程序。不管是什么程序,不管是什么实现语言,操作系统的安全层都会处理它。沙盒是另一种选择,但它们属于第 3 类。
  2. 如果您正在[重新]编写(或可以修改)您的程序:那么祝您好运,因为您实际上可以通过调用您选择的框架提供的某些安全原语来编写一个安全感知程序[更多下文]。但是,您可能会受到限制,因为您选择的框架在您的编程语言中没有任何绑定,因为它们中的大多数往往是低级的。是 C、Java、Go 还是 Javascript(是的,好像!)?在大多数情况下,您可能独自一人,所以,欢迎来到俱乐部。但是有一些选择。有时是愚蠢的。
  3. 你不在乎,只是想防止事情在你的脸上爆炸(即以上都不值得你花时间):那么沙箱也许像虚拟机这样引人注目的东西,或者如果你对未知事物有兴趣,应用程序容器是你最好的朋友。但是,最精通安全的人确实警告说容器不包含. 但是您至少仍然可以从一些资源隔离中受益,而不必了解程序的内部结构。强烈建议使用非特权容器。但除此之外,VM 仍然很酷。

现在,案例:

  • 我想以一种不受恶意利用的方式运行程序:因为这意味着任何已知或未知的攻击,所以没有任何东西可以保证满足您的要求(每个安全框架都应该告诉您这一点)。但至少,将您的程序限制为尽可能少的系统调用会减少其攻击面,尽管您仍然可以从任何地方受到攻击,即使它是可能方式的 1%。但是,如果剥离应用程序的权限以降低它们对攻击者的用处,系统调用过滤和能力系统将很有帮助。Seccomp(在 Linux 上可用)、Capsicum(在 FreeBSD 上可用,不久将在 Linux 上可用)和POSIX 功能是此处的选项。
  • 我想将我的程序限制为已知/预期的行为:简单(对于简单程序) - 如果您可以根据访问的文件或内核对象定义运行时行为,那么MAC框架可以帮助您(AppArmor、SELinux、...)。但是,您还必须选择要表达策略的抽象级别,因此精确性和灵活性将把您拉向不同的方向(路径是否足够精确,inode 是否适合您管理,内存段呢? )。
  • 我经常发现自己需要以提升的权限运行程序,并担心这可能风险太大:我们都经历过。删除功能可能是最合理的选择。它是特定于操作系统的(所有其他的也是如此),但如果作为给定机器上访问控制的一部分完成(与以编程方式调用功能接口相反,这将取决于您的语言中可用的绑定),它至少与实现无关)。