云负载防护面临的威胁
在字节跳动,有大量不同需求的业务部署在物理机、虚拟机、容器、Serverless等不同负载平台上。经研究发现,不同的负载存在特异化的安全威胁。针对物理机和虚拟机的以传统的反入侵、合规、风险感知为主;在容器部分的负载中,引入的镜像安全,集群层面反入侵也层出不穷;到了Serverless层,应用内的高权限API调用难以从主机/容器层进行区分,而较短的生命周期也带来事后溯源与排查的困难。
恩哲提到,安全所能支配的资源往往是有限的,企业不可能为了不同负载用不同的团队进行任务分化,而且入侵往往具有关联性,需要将多种不同的workload结合在一起处理和分析,所以面对上述不同方式的威胁,火山引擎结合字节跳动内部实践经验,研发了一体化的云负载防护平台CWPP。
据介绍,火山引擎CWPP源自字节跳动内部的主机安全解决方案Elkeid。Elkeid在字节跳动内部解决了千万级容器的反入侵与溯源需求,其采集能力模块已经对外开源(https://github.com/bytedance/Elkeid)。
CWPP从设计之初便遵循为物理机、虚拟机、容器和无服务器工作负载提供一致的保护和可见性的原则,将主机安全、容器安全、RASP、阻断与响应能力、追溯能力,通过插件的方式整合在了一个agent上,同时字节内部跨地域跨云的部署需求,也催生了CWPP对多云和混合云下的支持能力。
火山引擎CWPP设计思路
如图所示,火山引擎CWPP将多种负载的保护能力集成在了一套原生架构上,并开发了专用的高速策略引擎和海量机器下的服务发现能力,这种整合降低了整体运维的压力。
CWPP 数据收集
不同负载,均需要采集各种来源和需求的数据,CWPP对主机/虚拟机/容器的采集均落在内核层。通过对比用户态的方案,内核层采集带来的好处不只是更丰富的数据采集能力,更低的性能开销,还对容器有天然支持。
同时,在应用层还是会遇到类似SSRF/RCE/SQL注入等针对应用层的入侵,因此我们开发了火山引擎Elkeid RASP。Elkeid RASP是火山引擎云安全团队自研的一种应用安全防御技术,通过对应用运行时植入探针,来采集运行时的关键信息,并分析运行时行为产生及时告警。
通过下图可以看到左边是Elkeid RASP在端上数据采集时的生态位,针对应用层本身进行防护。从右边可以看到,Elkeid RASP是端上agent的一个插件,它会负责对选定的服务进行动态注入RASP probe,支持跨容器的服务监控和管理。而RASP probe则在运行时提供Hook信息上报,热补丁,阻断访问等操作。火山引擎 Elkeid RASP 同时支持在多种语言环境下的使用,基本可满足大部分公司内的后台服务。
在云原生时代,容器本身的利用是一方面,Kubenetes集群本身的利用是另一个新增的暴露面。Elkeid RASP因此利用Kubenetes原生的audit log数据,通过日志采集层接入策略引擎,来编写和分析出安全事件或者威胁风险,进而提供给安全工程师研判分析。
CWPP 告警和策略
在收集数据之后,撰写对应的策略并对识别出的告警信息进行及时运营是下一步的重点:
1. 首先是告警本身的上下文追加,也就是行为序列检测。如下图,三个信息本身都是不具备显著风险,但组合在一起,形成基于背景的行为序列,这个行为序列本身就具备一定风险,则需要告警。
2. 针对长期驻留的二进制,CWPP构建了云查杀能力。通过可疑二进制扔到云端,利用多引擎进行静态检测,并在动态沙箱内真实执行样本以观察分析行为,用更丰富的规则和数据来判断样本是否为恶意样本。目前,云查杀在字节内部已经抓获多起来自内外隐蔽入口的恶意二进制。
3. 火山引擎 CWPP 通过自研存储层实现对原始数据存储的低成本存储和高效查询,该方案可以支持PB级原始数据的秒级查询,当产生安全告警后,CWPP 溯源引擎会尝试通过将告警与原始数据关联查询,以达到还原现场的能力。
CWPP 告警案例
在今年的一起 Java RCE Alert 告警引起的应急中,攻击者从边缘机器进来,发现任意文件读取和ssrf漏洞可利用后,进行了盲打,找到了一个jenkins集群下马。在迅速的CWPP告警和阻断后,依然不断更新方法和目标,进行了多次对抗和攻击尝试。在CWPP提供了精准的告警信息后,运营人员根据自动关联事件排查其它告警,迅速定损止损,并使用CWPP平台快速下发RASP防护,将捕获的运行时告警实时上报,通过CWPP强大的告警溯源能力和处置能力有效解决以上问题。
据了解,作为物理机、虚拟机、容器和无服务器工作负载提供一致的保护和可见性的安全产品,火山引擎CWPP 未来会持续结合整体网络环境,以及字节跳动内部实践、技术创新,为企业用户提供更为全面的主机安全解决方案。