在应用程序中容器以Dockerfiles的形式来表达,但实际上Dockerfiles并不是容器的一部分(计划和编码)。从安全性的角度来看,容器安全主要涉及以下三部分,六个阶段:
- 构建时:构建,测试和发布
- 容器基础架构:部署和运维
- 运行时:监控
每个安全策略只有在可以实施的情况下才有效。每个部分中的各个步骤可以实施安全控制措施:
- 构建时:CI/CD基础结构,容器注册表
- 容器基础设施:容器编排器
- 运行时:生产环境
构建时安全
在容器构建时,输入了一堆源文件和一个Dockerfile,输出为Docker镜像。该阶段有很多安全和云厂商提供了很多安全方案和镜像安全扫描工具。容器安全扫描非常重要,是的,光镜像扫描还远远不够。本部分的安全目标是最小化供应链攻击的风险。
1. 基础镜像的安全
首先,检查镜像的基础,重点是检查要引入的依赖项:
- 允许开发人员使用的基本镜像。
- 固定软件依赖性,依赖所要拉取的源。
- 是否需要通过标签来简化治理和合规性?
- 整理Dockerfile。
所有这些检查都是静态的,可以很容易在构建管道编写检查语实现。
2. 容器镜像扫描
然后,下一步就是扫描容器镜像。
不要在构建管道中扫描镜像,而是在容器注册表中设置连续扫描。
漏洞可能早就存在,如果在构建时才检查有点迟了。其次,构建是叠加的:每个构建都会生成一个新镜像。因此,通过扫描信任注册表,发布的每个标签都可以信任,而无需重复在每次构建时候都检查。最后由于镜像扫描需要时间,如果在构建时候扫描会影响构建的性能。
也可以考虑定义补丁程序管理和保质期流程:
- 补丁程序管理:扫描结果提供补丁程序,从而产生新版本的镜像
- 保质期:对于超过期限未修补/旧/不安全的镜像从注册表中予以删除。
- 本阶段可参考的工具:开源工具有Anchore,Clair,Dagda,商业化软件有Atomic和Docker Cloud。