加固/减少 Docker 容器的攻击面

信息安全 硬化 码头工人
2021-08-12 09:39:37

我想设置一个加固的 Docker 实例,主要用于运行微服务,例如静态编译的 golang 应用程序。我正在寻找的是保护主机操作系统免受流氓容器和容器的影响。我试图用以下场景来总结情况。

设想:

我们有一台运行最小操作系统的服务器,例如 alpine linux(基于 busybox 的操作系统),安装、激活和正确配置了 SElinux 和 grsec。

在此服务器上运行一个 Docker 实例,其中包含 2 个正在运行的容器 A 和 B 以及一个卷 V。

容器 A 包含一个没有依赖关系的静态编译应用程序,连接到公共 Internet(Web 应用程序或公共 API)。这个应用程序包含一个巨大的错误,比如任意代码执行/上传/完整的反向 shell,你能想到的更糟。该容器还与卷 V 联网,作为上传目的地、数据库等。

主机操作系统包含一个只能在 root 时读取的标志(由 SElinux 强制执行)。

容器 B 还包含一个标志和一个应用程序,但与外部世界没有连接。

攻击者:

  • 人类,知道应用程序中的巨大错误。
  • 他想拿到旗帜。V 中的数据并不重要。
  • 他不是间谍机构,但仍然是高级安全专家。
  • 可能可以访问一些我们不知道的零日。

假设:

  • linux 内核有错误,但 grsec 足以解决这个问题。除非 grsec 被停用,否则不能成为攻击媒介
  • Grsec 和 SElinux 没有错误,也没有错误配置。
  • 容器中的用户根是容器外的根(也许有一天这将不再是真的......)
  • Docker 是一个真实的 Docker。没有已知的错误,但过去曾受到错误的影响,并且可能再次发生。
  • 已经正确建立了一个日志系统以供将来调查。

目标:

  • 保护旗帜。可能不可能,因为我们假设 Docker 有错误。
  • 减少攻击面。
  • 使攻击者的生活变得困难。
  • 设置在攻击者试图获取标志时触发的警报。最好是在他设法得到它们之前。

问题:

  • 我的假设有多现实?
  • 你将如何实现这些目标?
  • 我的以下建议怎么样?
  • 对 Docker 有什么一般的安全建议吗?

我的建议:

  • 配置SElinux比如A上没有用户可以写,V上没有用户可以执行文件。
  • 使用极小的 Docker 映像,没有任何用户空间。就像是:

    FROM scratch
    COPY app /
    ENTRYPOINT ["/app"]
    
  • 在运行应用程序之前降低权限。(不知道这样做的正确方法是什么......)

  • 一个假的busybox用户区?如果我们尝试调用会触发警报的东西/bin/sh/bin/ls或者类似的东西。
1个回答

我建议您参考 CIS 基准以获取强化指南。可以在此处找到当前 Docker 的 CIS 基准。这些是基线硬化的公认行业标准。它们还为 Linux 等、Web 服务器、DB 等提供指导。