摘要
腾讯云容器服务TKE目前拥有国内超大规模的Kubernetes集群,运行了包括游戏、支付、直播、金融等多个应用场景,集群的稳定运行离不开安全能力的保驾护。腾讯云容器安全服务站在业内最前沿的云原生安全视角,持续为TKE的安全治理提供指导并沉淀了丰富的思考和最佳实践。
本文将结合我们在容器基础镜像方面的安全建设和运营实践,分享我们对于基础镜像的安全治理和安全运营的思考。
1.背景
云原生安全架构的设计中,一个重要的思想就是安全左移,即在软件生命周期的更早阶段,投入更多的资源和安全能力,来更有效的收敛安全问题。容器镜像作为承载云原生应用的重要载体,作为云原生应用生命周期的源头,其安全性对云原生系统的安全有着重要的意义。确保容器镜像的安全性,是实现安全左移最重要的手段之一。
腾讯云千万核规模的容器集群,有着百万量级规模的容器镜像。如何针对这些镜像进行风险管控、如何快速的发现安全风险、如何高效的收敛安全风险,尤其是在重大漏洞爆发等应急场景下,如何快速的进行风险识别、定位和修复。这些问题给容器镜像的安全运营带来重大的挑战。
在镜像的安全治理和运营上,我们遵循着从镜像的构建、传输、存储、运行等全生命周期各个环节进行安全管控的思路,在镜像安全的维度,实现DevSecOps的闭环。
本文将重点介绍我们在容器基础镜像的安全治理和运营上的一些思路和实践,后续将针对镜像安全治理的其它环节,持续分享我们的一些经验。
2.什么是基础镜像
在介绍基础镜像前,我们先回顾下容器镜像的概念。镜像是由按层封装的文件系统和描述镜像的元数据构成的文件系统包,包含应用所需要的系统、环境、配置和应用本身等。
分层存储是容器镜像的主要特点之一,从图1可以看出,每个镜像都是由一系列的“镜像层”组成。当需要修改镜像内的某个文件时,只会对最上方的读写层进行改动,不会覆盖下层已有文件系统的内容。
图1 容器镜像的层级关系
当提交这个修改,生成新的镜像时,保存的内容仅为最上层可读写文件系统中被更新过的文件,这样就实现了在不同的容器镜像间共享镜像层的效果。图1是一个简单的容器镜像示例,最上层是容器的读写层,剩余的是只读层。
回到基础镜像上,不同容器镜像间共享的镜像层,就组成了所谓的基础镜像。在图1的示例中,FROM的ubuntu镜像,就可以认为是这个镜像的基础镜像。基础镜像其实是一个相对的概念,通俗一点说就是:其它的镜像我拿来用了,那么他这些个层组成的镜像对我来说就是基础镜像。
图2 镜像间的依赖关系
例如图2,有A、B、C三个镜像,B是在A的基础之上构建的,C又是在B的基础之上构建的,那么A就是B的基础镜像,A和B都是C的基础镜像(只不过C不会显示的看到A)