我应该从我的 Docker Web 应用程序容器中删除 bash 吗?

信息安全 应用安全 重击 码头工人
2021-08-18 22:39:33

假设我是一名开发人员并且想要强化我的 Web 应用程序环境。如果我的应用程序不使用 sh、ls、find、echo 等二进制文件,我应该将它们从图像中删除吗?

4个回答

它可能会提高安全性,但这是一种非常奇怪的做事方式。

您的建议是从安装了“不必要”软件的图像开始,并删除一些您不需要的东西(bash,echo,...)。这不仅有破坏东西的风险,而且还会增加容器的大小,因为带有不必要工具的基础层仍在运送中。

更好的方法是从最小图像开始。不是高山,那仍然是一个完整的操作系统。更简单的方法是使用仅包含所需语言运行时的基本图像,例如 google 的 distoless 图像https://github.com/GoogleCloudPlatform/distroless对于静态二进制文件,您甚至可以从空图像开始。

这样,您将获得尽可能小的图像,并且不提供 bash 的“攻击面”。

您不应删除 bash 或基本映像中存在的任何可执行文件。许多可执行文件是相互关联的,删除一个可执行文件可能会导致其他明显不相关的可执行文件在某些​​极端情况下无法正确运行。相反,您应该使用不包含您并不真正需要的任何内容的基本映像。alpine制作了一个极简主义的基本图像,重 5MB,它只包含最有用的东西,仅此而已。

如果您知道您的应用程序不使用任何外部二进制文件或 shell,或者如果您确切知道您将需要哪个外部二进制文件,您可能需要考虑编译成静态链接的二进制文件,然后基于您的暂存映像容器。

答案是:视情况而定。移除 bash 和所有其他解释器可以减少容器的攻击面。这同样适用于例如编译器、nc、wget、...

真正的问题是:这是花钱的最佳方式吗?

例如

  1. 测试和生产图像可能存在差异
  2. 创建一个修补容器变得(稍微)困难
  3. 故障排除变得更加困难
  4. ……

花钱的更好方法可能是通过投资其他安全措施来强化应用程序本身,例如定期渗透测试、安全监控、自动修补……

这取决于您在多大程度上遵循 Container 理念。如果你不需要它,你应该避免使用任何不是绝对必要的东西。您应该在 Dockerfile 中定义并引用您需要的所有内容,并且 Web 服务器的入口点应该是 apache(或您正在使用的任何其他 Web 服务器)二进制文件本身。但更重要的是,考虑到许多二进制文件(如 ls、find 等)都链接到容器的基础镜像层,因此您应该保持它们不变,或者制作更自定义的基础镜像。任何 ubuntu、debian 等基础镜像都会有这个二进制文件,不建议篡改基础镜像。

为数据库或其他后端实体定义隔离网络将是一种更安全的方法,只留下您向世界公开的端口作为攻击面。
显然,将您的机器硬化为您正在容器化您的服务的机器是至关重要的。

由于这些二进制文件,我不会太担心。我会更担心保护对 Docker 命令的访问,以避免在容器运行时调用这些二进制文件。