本文选自《交易技术前沿》第35期

华泰证券 杨培骏 张嵩 管文琦 庄飞 朱凯

一、背景

随着容器技术的兴起,以及天然适配微服务和DevOps,越来越多的应用选择容器部署。而容器能否大规模用于生产环境,安全性是其中一个非常重要的前提。以当下主流的容器引擎Docker为例,虽说容器通过Cgroup和Namespace具有了一定的资源控制和访问隔离能力,但是从安全性角度依然存在着很多隐患,比如镜像安全、内核安全、容器之间的网络安全、容器Capability限制等等。

非容器时代下安全防御体系的落地方式主要通过以主机、用户为边界进行安全策略控制和落地,甚至很多企业由于业务发展迅猛,安全相对滞后,连这一层的安全措施都做的并不是那么精细,加上容器技术比较新,对应的安全生态还在完善当中,这给容器的安全防御体系带来了很大的挑战。

基于此,为了提供行业内企业级易用且安全的容器服务,我们结合容器技术和安全技术,从理论和实践入手,力求打造一套行之有效的容器安全最佳实践。

二、容器全生命周期安全管理

容器的整个生命周期,都需要进行安全管理。从镜像拉取、构建、部署、运行等阶段,都有完整的安全工具链进行跟踪、检测及监控,保障容器镜像及运行环境的安全,容器安全工具链如下图:

图1 容器全生命周期安全管理

1) 从源头消除已知含有漏洞组件以及镜像的使用:从互联网Docker镜像仓库拉取镜像时,必须经过Docker安全工具扫描,确认无安全漏洞,才可以拉取到内部安全镜像仓库;第三方开源组件入库时,使用开源组件安全扫描工具进行入库检测;

2) 容器构建阶段,进行源代码安全扫描、开源组件安全扫描及Docker安全扫描;

3) 镜像部署到测试环境后,进行web应用安全扫描、安全加固检测及主机安全测试;

4) 开发测试环境及生成环境间镜像同步,通过容器云平台自动化同步;

5) 镜像部署到生成环境,应用系统上线后,安全常规运营,持续进行WEB安全扫描及主机安全扫描;

6) 通过容器安全扫描工具持续跟踪CVE漏洞数据库中的最新漏洞,当最新CVE漏洞通告公布后,针对这个最新漏洞库,自动测试已有的所有容器镜像,帮助安全团队对新增风险做出快速响应。

三、容器安全的落地实践

我们经过对容器安全进行长期的研究、设计、验证和实践,对容器安全进行了有效的落地,支撑了容器应用安全地运行,下面介绍容器安全落地的一些实践,主要包括:Docker安全、Kubernetes安全、内部安全镜像仓库、安全风险度量及可视化、容器技术规范、容器安全扫描工具自动化集成。

3.1 Docker安全

国外在Docker安全研究起步较早,也出现一些体系化的安全方法和工具,但相比国内这方面的资料相对比较零散,我们根据CIS的Docker安全标准整理了Docker容器安全实践指南,该指南包括了主机安全配置、Docker守护进程配置、Docker守护程序配置文件、容器镜像和构建、容器运行安全、Docker安全操作等方面多个控制点,给研发及运维人员提供Docker安全加固指南,降低Docker安全风险。

3.2 Kubernetes安全

我们在开发测试环境和生产环境中,采用了Kubernetes做为容器云的编排服务和集群运行环境,Kubernetes安全直接关系到容器的运行安全。Kubernetes 提供了很多能够提高应用安全的方法。要进行这些配置,就要掌握 Kubernetes 的相关知识,同时也要清楚的了解安全需求。我们关注的安全内容集中在容器的生命周期上:构建、传输以及运行,并且针对 Kubernetes 进行了特别的裁剪,根据实践总结了Kubernetes部署安全指南。

3.3 内部安全镜像仓库

容器是基于镜像构建的,如果镜像本身就是一个恶意镜像或是一个存在漏洞的镜像,那么基于它搭建的容器自然就是不安全的了,故镜像安全直接决定了容器安全。

理想情况下,容器镜像应该只包含应用程序的二进制文件及其依赖项。然而实际上,容器镜像往往是相当巨大的。像Ubuntu、Centos这样被广泛使用的基础系统镜像,它们包含了相当多的功能。尽管有些功能在调试部署的时候带来了一定的便利,但是在增大的体积面前,收益极低。

容器实际上是不透明的,被封装成一个个繁琐的镜像。最终,当越来越多的容器被创建时,没有人再确定容器到底装载了什么?实际运行着什么?正是因为如此,我们日常使用的镜像面临严峻的安全问题。随着历年来积累的CVE越来越多,很多应用都存在一些问题,在更新频率低的镜像中尤为严重。

有报告显示,Docker Hub上公开热门镜像中的前十页镜像,在一百多个镜像中,没有漏洞的只占到24%,包含高危漏洞的占到67%。很多经常使用的镜像都包含在其中,如:Httpd,Nginx,Mysql等。

基于此种情况,我们建立了内部安全镜像仓库:

1) 内部所有容器构建,只能基于内部安全镜像仓库;禁止开发人员从公共网络直接下载镜像,而是维护一个安全的内部镜像仓库。开发团队和安全团队合作,建立和维护内部的镜像仓库。架构师、容器项目组和安全团队持续维护镜像库为最新版本,同时建立了开发人员请求新镜像的流程。

2) 开发测试环境和生产环境所有依赖的统一管理:开发测试环境和生产环境的公开基础映像,统一由平台团队管理,开发团队在构建映像过程中可能用到的Java 开源组件依赖包统一由质量团队管理、需要进行升级和特定支持应用安全所需要的操作系统(centos,redhat)和相关应用包统一由安全团队管理。各团队在开发测试及生产环境专门搭建本地私用库(registry , nexus, yum),由固定服务器外连指定的少数可信源(官方或官方认证站点);

3) 从互联网Docker镜像仓库拉取镜像时,必须经过Docker安全扫描,确认无安全漏洞,才可以拉取到内部安全镜像仓库;

4) 第三方开源组件入库时,触发开源组件安全扫描工具blackduck,进行已知CVE漏洞检测,如有漏洞则进行隔离和提示管理员,确定下一步操作,经过确认无安全漏洞的开源组件才可以入库。

通过内部安全镜像仓库,避免了研发人员从互联网拉取带有安全漏洞的镜像到运行环境,从源头消除已知含有漏洞组件的使用,提高了容器安全性。

图2 容器镜像安全

3.4 容器安全技术规范

为保障容器的使用安全,提高开发人员对容器相关技术的应用水平,规范容器管理流程,结合现阶段容器的使用现状,制定了容器技术规范。技术规范的制定不仅对容器入门人员形成了明确指引,还在容器的安全使用方式上形成了安全规范。

3.5 容器安全风险度量及可视化

为了对项目组的容器安全风险进行度量及直观展示,从容器镜像的项目分布、安全漏洞、操作系统等纬度进行了可视化展示,便于项目组进行容器安全风险的持续监控及容器安全漏洞的修复。

图3 容器安全风险度量及可视化

3.6 容器安全扫描工具自动化集成

DevOps核心价值是快速交付,所以需要把容器安全集成到DevOps流水线中,保证容器安全性的同时,提高容器安全交付速度。

容器云平台目前已全面支持基于容器的CI/CD流程。通过在流程的每一步设置check节点对版本进行安全控制。如下图所示:

图4 容器安全扫描流程

目前我们的容器云平台承载公司所有容器的CI/CD,通过将容器云平台与容器安全扫描工具集成,在容器构建过程中融入安全要素,解决了镜像的安全问题,同时CI构建报告中直接集成容器安全扫描结果,提高了安全漏洞修复效率及易用性。

目前我们生产环境的Docker主机均从公司内部私有Registry中提取生产镜像。当构建工具上传镜像到私有Registry后,容器安全扫描器会从该Registry中获取镜像的副本,实施安全测试。整个过程可分解为以下关键步骤:

1)当开发团队自动提交构建或构建触发器时,构建工具将从源代码控制工具中提取源代码;

2)构建工具可以在构建过程中运行一些测试,当测试成功时,镜像将推送到企业私有Registry;

3)容器安全扫描器从私有Registry获取相关容器镜像,分析元数据清单,安全分析;

4) Docker CI平台通过容器安全扫描器API接口获取扫描报告。

四、容器安全的落地实践

目前容器生产环境的项目已全部实现容器安全最佳实践,有效加强了容器安全,降低了容器使用过程中的风险,进一步保障了各应用生产环境的稳定性。

通过自动化集成,30 秒内即可从 DevOps 工具链内部读取容器镜像,检测漏洞和恶意软件,从而避免减慢代码交付速度。在日常容器构建过程中已经累计扫描186个image,其中发现高风险image达117个,发现并修复中高危CVE漏洞达4000+,降低漏洞修复成本。通过在应用程序发布之前的开发阶段发现并修复软件缺陷,实现补救点“前移”(shift left),大幅降低了高达85%的修复成本。

五、总结和展望

容器安全属于较新领域,在国内无完整的端到端案例可以借鉴。本最佳实践,提供了很多有价值的实践经验,可为证券期货业各单位、乃至其他金融行业在容器安全防护思路树立标杆和示范效应,具有行业示范意义和推广价值。后续我们将在容器安全的监控、处理实时性和便捷性上持续深入探索。

杂志全文:https://book.yunzhan365.com/dksd/epne/mobile/index.html?maxwidthtosmallmode=0&maxheighttosmallmode=0

声明:本文来自证券信息技术研发中心,版权归作者所有。文章内容仅代表作者独立观点,不代表安全内参立场,转载目的在于传递更多信息。如有侵权,请联系 anquanneican@163.com。