容器镜像安全最佳实践
原文:https://docs.docker.com/develop/security-best-practices/
您可以采取一些措施来提高容器的安全性,包括:
选择正确的基础镜像
实现安全镜像的第一步是选择正确的基础镜像。在选择镜像时,请确保它来自可信来源,并尽量保持镜像小巧。
Docker Hub 上有超过830万个仓库。其中一些镜像是 官方镜像,这些镜像是 Docker 作为开源和即插即用解决方案仓库的精选集,由 Docker 发布。Docker 还提供由 验证发布者 发布的镜像。这些高质量镜像由与 Docker 合作的组织发布和维护,Docker 验证了其仓库内容的真实性。选择基础镜像时,留意 官方镜像 和 验证发布者 徽章。
在从 Dockerfile 构建自己的镜像时,请确保选择符合你需求的最小化基础镜像。小型基础镜像不仅提供便携性和快速下载,还能减小你的镜像大小,并通过依赖项减少引入的漏洞数量。
你还应该考虑使用两种类型的基础镜像:一种用于开发和单元测试,另一种用于开发后期的测试和生产。在开发后期,你的镜像可能不需要诸如编译器、构建系统和调试工具等构建工具。一个依赖项最少的小镜像可以大大降低攻击面。
使用多阶段构建
多阶段构建旨在创建易于阅读和维护的优化 Dockerfile。通过多阶段构建,你可以使用多个镜像,并只从特定镜像中选择性地复制所需的工件。
你可以在 Dockerfile 中使用多个 FROM
语句,并且每个 FROM
可以使用不同的基础镜像。你还可以从一个阶段到另一个阶段选择性地复制工件,从而避免在最终镜像中包含不需要的内容。这种方法不仅大大减少了复杂性,还减少了在你的镜像中实现易受攻击的工件的机会。因此,与其构建基于其他镜像的镜像,不如使用多阶段构建来“挑选”你的工件,而不继承它们所依赖的基础镜像的漏洞。
有关如何配置多阶段构建的详细信息,请参见多阶段构建。
重建镜像
Docker 镜像是从 Dockerfile 构建的。Dockerfile 包含一组指令,让你自动化创建镜像所需的步骤。此外,它还可以包括一些导入的库和安装自定义软件。这些将作为 Dockerfile 中的指令出现。
构
建你的镜像是在那一刻对该镜像的快照。当你依赖于没有标签的基础镜像时,每次重建时你都会获得一个不同的基础镜像。此外,当你使用包安装程序安装软件包时,重建可能会大幅改变镜像。例如,包含以下条目的 Dockerfile 可能在每次重建时都有不同的二进制文件:
# syntax=docker/dockerfile:1
FROM ubuntu:latest
RUN apt-get -y update && apt-get install -y python
Docker 建议你定期重建 Docker 镜像以防止已知漏洞。重建时,使用 --no-cache
选项避免缓存命中,并确保进行全新下载。
例如:
docker build --no-cache -t myImage:myTag myPath/
重新构建镜像时,请考虑以下最佳实践:
- 每个容器应只负责一项任务。
- 容器应是不可变的,轻量级的,并且启动速度快。
- 不要在容器中存储数据。使用共享数据存储代替。
- 容器应易于销毁和重建。
- 使用小型基础镜像(如 Linux Alpine)。较小的镜像更易于分发。
- 避免安装不必要的软件包。这样可以保持镜像干净和安全。
- 在构建时避免缓存命中。
- 在部署前自动扫描你的镜像,避免将易受攻击的容器推送到生产环境。
- 在开发和生产期间每天分析你的镜像以寻找漏洞。根据此信息,根据需要自动重建镜像。
有关构建高效镜像的详细最佳实践和方法,请参见Dockerfile 最佳实践。
检查镜像中的漏洞
除了按照本页概述的最佳实践开发镜像外,还应使用漏洞检测工具持续分析和评估镜像的安全状况。
Docker 工具具有帮助你了解影响你构建或使用的镜像的漏洞的功能。
- Docker Hub 支持自动漏洞扫描功能,启用后会在你将镜像推送到 Docker Hub 仓库时自动扫描镜像。需要 Docker 订阅。
- Docker Hub 还支持处于早期访问阶段的高级镜像分析功能,该功能扩展了“核心”漏洞扫描解决方案的功能,提供了更详细和可操作的见解。
- 对于 CLI,有
docker scout
CLI 插件,让你可以使用终端探索镜像的漏洞。 - Docker Desktop 为本地镜像存储中的镜像提供了详细的镜像视图,可视化所有已知影响镜像的漏洞。
所有这些安全功能都由相同的技术支持:Docker Scout。这些功能帮助你实现对供应链安全的全面了解,并提供可操作的建议来解决这些漏洞。
总结
构建安全镜像是一个持续的过程。请考虑本指南中强调的建议和最佳实践,以规划和构建高效、可扩展和安全的镜