假设我是一名开发人员并且想要强化我的 Web 应用程序环境。如果我的应用程序不使用 sh、ls、find、echo 等二进制文件,我应该将它们从图像中删除吗?
我应该从我的 Docker Web 应用程序容器中删除 bash 吗?
它可能会提高安全性,但这是一种非常奇怪的做事方式。
您的建议是从安装了“不必要”软件的图像开始,并删除一些您不需要的东西(bash,echo,...)。这不仅有破坏东西的风险,而且还会增加容器的大小,因为带有不必要工具的基础层仍在运送中。
更好的方法是从最小图像开始。不是高山,那仍然是一个完整的操作系统。更简单的方法是使用仅包含所需语言运行时的基本图像,例如 google 的 distoless 图像https://github.com/GoogleCloudPlatform/distroless。对于静态二进制文件,您甚至可以从空图像开始。
这样,您将获得尽可能小的图像,并且不提供 bash 的“攻击面”。
答案是:视情况而定。移除 bash 和所有其他解释器可以减少容器的攻击面。这同样适用于例如编译器、nc、wget、...
真正的问题是:这是花钱的最佳方式吗?
例如
- 测试和生产图像可能存在差异
- 创建一个修补容器变得(稍微)困难
- 故障排除变得更加困难
- ……
花钱的更好方法可能是通过投资其他安全措施来强化应用程序本身,例如定期渗透测试、安全监控、自动修补……
这取决于您在多大程度上遵循 Container 理念。如果你不需要它,你应该避免使用任何不是绝对必要的东西。您应该在 Dockerfile 中定义并引用您需要的所有内容,并且 Web 服务器的入口点应该是 apache(或您正在使用的任何其他 Web 服务器)二进制文件本身。但更重要的是,考虑到许多二进制文件(如 ls、find 等)都链接到容器的基础镜像层,因此您应该保持它们不变,或者制作更自定义的基础镜像。任何 ubuntu、debian 等基础镜像都会有这个二进制文件,不建议篡改基础镜像。
为数据库或其他后端实体定义隔离网络将是一种更安全的方法,只留下您向世界公开的端口作为攻击面。
显然,将您的机器硬化为您正在容器化您的服务的机器是至关重要的。
由于这些二进制文件,我不会太担心。我会更担心保护对 Docker 命令的访问,以避免在容器运行时调用这些二进制文件。