文章目录
- 容器简介
- 容器镜像
- 传统安全面对容器安全的表现
- 无法匹配动态IP
- 无法侦测到容器内的各种行为
- 无法扫描各种分层存储的镜像文件
- 无法适应新的容器引擎和框架
- 镜像容器全生命周期的安全防护
- Build防护
- Ship防护
- Run防护
容器简介
我们都知道,VM是通过Hypervisor虚拟化技术来模拟cpu等硬件资源,这样就可以模拟出一个Guest OS,软件开发在这种环境中隔离效果是很好的,但是这样的隔离效果需要付出一定代价,比如主机需要消耗资源消耗在虚拟化中,并且系统的安装需要占用大量的存储资源,同时这种方式启动比较慢,影响开发效率;
而容器是通过Cgroups的资源管理能力和Namespace的资源隔离能力结合在一起实现进程级别的隔离,本质上容器就是一个视图隔离、资源可限制并且具备独立文件系统的进程集合。
而K8S就是当前最常见的容器编排系统,主要围绕 pods 进行工作。 Pods 是 k8s 生态中最小的调度单位,可以包含一个或多个容器。
K8S全称是Kubernetes,由Google 基于 Borg 开源的容器编排调度系统,是一种基于容器技术的分布式架构领先方案。在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等功能,用户不需要再过度的关注资源的管理问题,降低操作的复杂度,提高了大规模容器集群管理的便捷性。
补充下官方的定义:
Docker是一个开源的应用容器引擎,开发者可以打包他们的应用及依赖到一个可移植的容器中,发布到流行的Linux机器上,也可实现虚拟化;而k8s是一个开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能,别搞混啦。
容器镜像
众所周知,容器镜像分为三个形态:
- Build(构建镜像) : 镜像就像是集装箱,包含文件以及运行环境等等资源
- Ship(运输镜像) :在宿主机和仓库间进行运输,这里仓库就像是超级码头
- Run (运行镜像) :运行的镜像就是一个容器,容器就是运行程序的地方
Docker 的运行过程,也就是去仓库把镜像拉到本地,然后用执行命令把镜像运行起来变成容器,这也就是为什么人们常常将 Docker 称为码头工人或码头装卸工;但是在威胁无处不在的今天,镜像生命周期的安全问题就成了云原生开发者不得不面对的问题,那么如何去做好镜像容器的全生命周期防护呢,传统安全产品如防火墙、EDR、漏扫、安全基线等产品是否还依旧有效呢?
传统安全面对容器安全的表现
无法匹配动态IP
容器化之后,容器都是微服务的实例,而这些微服务会伴随着容器的消亡,包括容器的扩容所容,最终会导致容器的IP地址(容器地址是取决于pod的地址)一直处于变动的状态,所以防火墙、WAF等安全设备是无法进行防护的,因为其无法进行动态匹配IP地址。
无法侦测到容器内的各种行为
传统安全设备针对的多是主机层面的防护,但是在云原生环境下,多是以容器形式存在,所以传统安全设备在这面前会显得力不从心,容器内发生了什么全然不知,也就无法进行防护了。
无法扫描各种分层存储的镜像文件
目前市面上多数漏扫产品都只能去扫描普通单独的文件,但是对于分层存储的镜像文件也无能为力,而在容器安全中很重要的一环就是镜像的安全,所以传统过漏扫在这种场景不适用。
无法适应新的容器引擎和框架
在部署应用程序的方式上,主要经历了三个时代:
- 传统部署:互联网早期,会直接将应用程序部署在物理机上
- 虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境
- 容器化部署:与虚拟化类似,但是共享了操作系统
容器化部署方式给带来很多的便利,但是也会出现一些问题,比如说:一个容器故障停机了,怎么快速替补;当并发变大/变小,怎么样做到横向扩容/缩容;这些容器管理的问题统称为容器编排问题,为了解决这些容器编排问题,就产生了一些容器编排的软件如Swarm、Mesos、Kubernetes等,在面对这些容器编排面前,传统安全无从下手无法适应。
那么问题来了,如何才能有效针对容器镜像进行有效的安全防护呢?
镜像容器全生命周期的安全防护
结合上面提到镜像容器主要分为三个形态,Build、Ship和Run,本文也是从这三个形态/阶段进行分析
Build防护
在构建镜像时可以针对镜像文件进行脆弱性扫描,具体的实现方式一般首先是通过容器安全防护系统去获取镜像的数据,然后在平台对这个镜像包进行解析,扫描(扫描逻辑内容和传统漏扫类似)。
Ship防护
刚刚提到在build阶段已经对镜像进行扫描了,为啥在ship还需要扫描呢?很多时候镜像文件并不是由公司自己内部搭建的,而是直接从乙方去获取,build阶段只是针对自建的镜像,而乙方获取的镜像,build阶段我们无法干预,所以这部分镜像也是可能存在风险的。
ship阶段一般主要是分为两方面的扫描:1.对容器所运行的基础设施(编排引擎:K8S、 )进行扫描2.对主机镜像扫描和仓库镜像进行脆弱性扫描(因为镜像文件解析出来并非所有文件都是存在风险的,有些文件类型是属于几乎没有风险的,所以高阶的容器扫描产品一般具备只针对重要文件类型(rpm/packages/dpkg/status…)进行过滤扫描的功能,提高扫描效率)。
Run防护
Run阶段的防护主要由以下三个方面进行防护:
- 容器启动控制: 在生产环境中,我们是不希望去启动带有高危漏洞、配置CIS、特定有缺陷的软件包版本的镜像,所以在启动之前,需要对这些带有缺陷的镜像文件进行启动阻断,来预防对未来使用埋下伏笔。
- 网络访问控制 :在容器运行时会产生大量的东西向流量,而这些流量不仅是在主机上流动,也在容器侧流动,传统的WAF、微隔离产品要么只能检测南北向的流量,要么只能检测主机层面的东西向流量,在容器场景的检测都不是那么全面,所以需要一款能够去检测容器间流泪的产品去做这方面的控制,以防止恶意流量在容器间传播。
- 入侵检测控制:容器运行时通常具有单一性和不变性,所以通过各类型容器/产品的专家总结出广谱规则可以动态地对运行时的容器进行限制,比如一个mysql容器 ,它在运行时只会去监听3306端口,写入的文件类型也是有规律性的,一般来说它不会去监听一些比如80、8080这些非自身常规所需要的端口,,所以这方面可以通过基线建模去匹配对应服务的容器,进行动态限制。