[关闭]
@gaoxiaoyunwei2017 2019-05-21T17:41:58.000000Z 字数 6293 阅读 607

容器时代:数万台服务器下的 Docker 深度安全实践

贾晨


作者简介

刘湛卢
OPPO高级互联网专家

刘湛卢:大家下午好,我今天分享的主题跟云有关系,但是还是还是跟服务器相关。我叫刘湛卢,来自于OPPO互联网安全团队,负责OPPO的互联网安全团队的研发工作,先介绍一下OPPO的情况。

3.jpeg-193.9kB
涉及到服务量和业务量,现在OPPO有全球超过2亿+DAU用户,最近几年数据量增长超过180倍,发展的曲线呈指数型上升,这样带来了服务器的高速增长,这也与业务指数曲线是类似的。物理服务器承载业务转向了Docker化,Docker的流行趋势及当前行业现状。

Docker流行趋势根据Datadog于2018年6月统计的数据显示25%的公司已经采用Docker,2020年会达到50%,其他没有使用Docker的公司也在追赶过程中。
今天的分享主要是Docker的安全方面,如此大规模使用Docker,会带来怎样的安全问题。

今天我的分享分为四个模块,第一介绍一下Docker生态与架构,第二是安全问题和应对方案,第三是OPPO在Docker安全方面的实践,第四是对容器生态的安全展望。

一、Docker生态与架构。

Docker的安全生态圈,这些只是主要部分。第一是Docker自身安全,这是最核心的一块,Docker使用的是镜像,其实镜像是放在镜像仓库里的,包括注册服务中心里面会有镜像仓库,镜像仓库的安全也很关键。业务在很庞大的情况下需要对镜像进行分发、安排和管理,目前比较流行的是Kubernetes进行管理和分发,Swarm是容器管理的系统,但是目前不是那么主流了。

7.jpeg-216.7kB
说完镜像的生态,看看镜像Docker和传统安全的对比情况,传统的安全问题有操作系统的安全漏洞,内核安全,ssh保理破解等,Rootkit等。Docker容器的安全有镜像的安全,Docker守护进程的安全,容器运行时的安全,Docker调度编排工具的安全。

Docker的架构包括了两块,一块是Docker的运行流程,二是Docker架构在主机上的组成部分,这些部分间的安全关系。Docker会运行在私有网和公有网,有一些公有网主机上会运行Docker,守护进程启动容器,Docker客户端会发送指令到守护进程执行容器的启停和管理或者反馈容器信息,在Docker守护进程的运行过程中,如果发现本地没有镜像,镜像要么从私有中心下载,要么会指定一个公有运行中心,这个时候就发现它是要跨私有网和公有网两个部分运行。

Docker的架构在主机上,除了在整个流程当中的运行方式,Docker在主机上是什么样的组成方式。首先会有个Docker Daemon作为最核心的地方,会启动容器管理容器,比如容器需要持续化一些数据到本地,这样会挂在卷,这三个部分都是每个容器间的格力性是通过Kernel进行隔离。

二、安全问题和应对方案

11.jpeg-230kB
几个核心安全问题,第一是主机与容器守护安全,第二是镜像安全,第三是容器运行时安全问题,第四是生态安全。

例如主机与容器守护安全问题,主机上的安全配置是否影响到容器的运行,主机的安全漏洞是否影响到容器运行,容器内的进程是否可以利用主机上的安全漏洞。镜像安全方面,镜像是否安全,镜像传输过程中是否会篡改,镜像被销毁后是否还存在安全问题。

容器运行时的安全问题,各容器之间的通讯是否安全,隔离是否充分,容器在资源使用上是否安全。生态安全上主要是Docker本身的安全性,还有品牌系统的安全问题,容器的秘钥管理和传统的秘钥管理是否不一样,容器化以后的数据隐私保护方案是否和传统方案一致。

12.jpeg-318.3kB
先看Docker守护进程的安全,这个是用root权限创建的文件,通过非root文件就把它删除掉了,这种主要是Linux对内核隔离性的不足,在Docker使用时隔离级别是由用户自行决定的,把这个账号直接加到Docker的账号组里就具备了这个权限。

另外一个安全问题,曾经爆出来的Dockerswarm集群管理配置问题就是将Docker daemon暴露在公网上,导致任何人都可以使用Docker api来操纵容器。我们做了TLS/HTTPS加密容器进行双向认证。

14.jpeg-177kB
那这些安全问题怎么引起的,守护进程需要root权限运行,对外提供Docker的管理API接口,这是引入问题的根源。对应的方案,Docker尽量不要直接开Docke remote API服务,添加ACL,启用TLS认证,守护进程的配置合规扫描和审计。

15.jpeg-158.3kB
刚才是Docker守护进程的安全,下面看一下镜像安全情况。所有的容器都是基于镜像在运行。镜像的安全现状,这是在Docker Hub上Clair的扫描统计,发现有67%存贮高危安全问题,有9%的镜像存在高风险、中风险的安全问题,只有24%的镜像是安全的,所以镜像成为Docker环节里的关键一环,作为攻防的主战场。

镜像会有什么样的安全问题,带来什么样的安全问题。比如可以利用恶意镜像挖矿,传播恶意文件,勒索病毒、逃逸到主机做恶意攻击等危害。2017年7月份,有一个账号上传了几个恶意镜像,这是去年才被发现的,在这个过程中利用镜像挖矿给他产生了价值9万美元的门罗币。

17.jpeg-153.5kB
镜像的安全由哪些方面产生,首先是镜像内容的安全,比如像基础镜像携带的安全问题,像植入的病毒,镜像库的安全漏洞。另外是镜像内容的性质,比如镜像文件内容大小和文件的个数,比如一个镜像里文件非常大,会影响到容器运行时其他容器的情况,比如整个主机上文件过大导致其他容器的运行会出现问题。文件个数过多,会占用过多的inote节点,会影响到其他的运行。再是镜像仓库的安全,仓库如果被入侵会有很大的安全问题,仓库本身的安全,镜像传输安全,及镜像传输安全认证,需要对镜像仓库进行安全加固,也需要对里面的镜像进行深度扫描,对镜像中的用户和权限进行控制。

18.jpeg-202.1kB
目前扫描镜像的方式市面流行的是clair,目前的方式都是以静态方式扫描,主要对镜像进行层级的拆解,之后对每个层级进行版本的匹配,这个时候有很多的缺点,如果一个特征没有录入到库里就检测不到安全问题,还有像Anchore、Dockerscan的扫描方式也是类似的,通过静态的方式扫描。

再是容器运行时的安全问题,最近也暴露出来一个很大的安全漏洞,就是runC容器逃逸用恶意代码覆盖掉Docker的runC,导致下一次运行容器时主机会启动恶意程序。

Docker利用dirty cow 逃逸到主机,获取主机的root选项。Shocker攻击逃逸。一般的方式是修复Linux Kernel的dirty cow漏洞,通过 Capability 机制保留最小的权限。

21.jpeg-137.2kB
容器运行时安全,除了从容器内逃逸到主机上之外还有其他的方式,比如磁盘资源,一个容器可以完全把整个磁盘写满,这个时候其他容器就无法再工作了。还有流量层,比如两个容器在同一个主机上,一个容器把主机上的流量占满其他容器就用不了了,这样隔离性不是太好。一般的限制方式都会通过Seccomp做系统限制,Capability做能力的访问,SELinux做隔离,TC流量控制,Quota技术限制磁盘的使用,这些还是通过内核的控制,Docker本身并没有什么控制机制。

22.jpeg-240.4kB
Kubernetes安全,它也发生过很多安全事故,会遇到大量的劫持等,最主要的防护方式还是通过最小权限的权限原则进行配置,同时对软件的更新,实时保持跟最新版本的更新,可以让它在官网上已经修复的漏洞得到使用。日志的记录,比如说我们对Kubernetes的操作进行日志审计记录,通过平衡生产力和安全的权衡,比如可以通过调整一些产品形态来满足Kubernetes对安全的覆盖程度,比如避免过度利用产品产生的安全问题,使用安全端口进行通讯。

这部分说了安全问题和通用的应对方案。

三、OPPO容器安全实践

24.jpeg-300.3kB
根据Docker的全生命周期进行安全保护,包括从镜像构建到编排分发从容器构建到运行、销毁的安全覆盖。我们要求镜像构建要进行安全构建,增强安全构建策略和规则,需要对注册服务器做加固保护、镜像扫描、日志审计,变法时需要进行日记审计,传输下载需要做加密传输,主机存储需要镜像审计,验证签名,进行合规基线扫描。在容器运行时需要进行保护,包括主机安全配置,流量分析及系统调用分析、容器内进程监控、日志审计,最后需要对镜像进行安全回收,这是整个生命周期的安全保护。下面看一下每一个周期需要做的事情。

25.jpeg-225.1kB
安全构建上,主要还是要提供安全的构建规范推动业务侧的工作,统一提供基础镜像,并保证安全性。镜像内业务运行进程为非root用户,删除setuid/setgid权限防止提权攻击,使用COPY代替ADD。

26.jpeg-188.1kB
镜像安全做法,在镜像仓库之前我们做了加固代理层,上面会有镜像的提交审计,做传输加密、Token认证、扫描对接和Registry安全加固。镜像接口对外的几个使用方式,主要还是开发,构建镜像时需要把镜像推导镜像仓库,安全扫描时需要从镜像仓库下载镜像,生产环境需要从镜像仓库拉取镜像进行运行。

镜像仓库上可以给它进行角色上的权限认证,比如不同角色分配不同权限,像开发、扫描和生产环境上分别配置不同的角色和配置不同权限,对业务进行划分,不同业务使用时也有不同的权限,可以设置黑白名单进行访问控制,日志操作审计,在操纵流程中包括上传、下载及所有操作。

镜像的扫描,首先镜像是分层的,不同层进行镜像扫描,对镜像做基线扫描看它的配置情况,版本特征检测跟CVE漏洞库做匹配。深度分析,我们有个深度分析方案。镜像树回扫重构和签名认证机制做镜像的扫描保护。

镜像的深度扫描,首先会从镜像仓库把镜像拉取下来,对镜像里面的history指令做分析,这是Dockerfile合规分析,然后进行镜像层级分析在合规扫描分析之后需要把镜像层级进行拆解,会对每一个层级做版本特征库的匹配扫描,这里使用了自己的一些版本特征库和CVE漏洞库和黑白名单,接下来会进行深度分析,首先要对里面的每一个文件做Webshell扫描,一些用YARA规则和机器学习、黑白名单、符号表分析进行恶意二进制扫描,之后会进行泄露分析,对账号密码泄露、源代码泄露、证书泄露进行泄露分析。这些分析比较复杂,涉及到很多规则和审计分析流程,在这么庞大的体系下镜像这么多,我们该如何在有限资源下做有效的扫描。首先需要做到精准扫描,针对不同的业务和不同的模块做不同的分析,比如像PHP,我是PHP的运行镜像,做GS分析没什么必要,只需要做精准分析,按照不同的分类进行规则的拆减分类分析。分析到漏洞后怎么进行镜像的重建,有三个增长,在运维层会提供最基础的base镜像,开发会在这个基础上构建public镜像,会有公共组件,在业务层会进行业务的分装,如果在业务层发现有运用的镜像,除了重构它本身外,依赖树上的其他镜像也都要进行重构。

在镜像仓库对镜像进行扫描后为什么还要对主机进行重审,因为主机上的镜像可能不是镜像仓库下载的,可能是来源于不受控的镜像仓库,另外是镜像可能在主机上被篡改了,就需要对镜像进行重扫,跟刚才的扫描方式是类似的,做程序的分析,以及分蓄外还要对Docker的日志进行审计。

32.jpeg-179kB
运行时安全保护方案,主要分为两块,一块是内核层加固,另外是用户层加固。内核层加固是根据内核提供的工具,像AppArmor和SELinux安全策略分类等。还有用户层加固,是用户与权限,非敏感目录挂载进行审计,要进行单独分区,主机层的安全规范,主机层使用的安全规范主要是对Docker的安全规范进行加固,另外是重申,对Docker守护进程及相关目录进行审计,看这个目录是否已经被篡改了,及运行的日志是什么样的。

在主机上怎么收集Docker的运行日志,在主机上会运行很多容器,各个容器都有不同的业务在运行,我们现在提供的是统一的日志收集容器,它会对所有日志容器进行搜集,日志容器再统一发送到日志收集通道,会把日志传送到恶意日志分析引擎,使用机器学习的方式对日志做规则统计处理,涉及到异常日志做告警。

运行时安全保护方案流量分析,Docker在主机上会启动Docker0网桥,做主机层流量分析,除了要监听外部网卡还需要监听Docker0网卡对所有的流量进行抓取。第二种流量分析方式是对交换机镜像进行流量分析,交换机镜像流量不会影响到主机的计算能力,如果在主机上做分析会影响到主机的CPU、内存的使用,在交换机上做镜像流量分析会出现问题,不同的容器间的信息会遗漏掉。

34.jpeg-208.3kB
除了流量分析外还有网络安全配置,要遵从网络安全配置规范,比如像只映射必要端口,特权端口禁止映射,不共享主机网络namespace,TC流量控制。
对进程的监控,要对容器进程列表进行监控,建立进程与容器的关联关系,对异常进程启动监控,敏感目录挂载进行监控。

除了做进程监控外,进程的审计调用也非常关键,包括网络是否有外联网络联到恶意的地址或域名,Exec函数族审计,还有域名解析审计。

Docker的关键命令程序进行监控,需要监控Docker目录下像Docker-runc、Dockerd、Docker的程序有没有被篡改,需要进行监控和预警保护。

下面结合几个点,Docker安全态势感知,Docker Daemon的安全扫描及API接口对外暴露情况,是否有鉴权能力,相关CVE漏洞的修复情况,以及配置规范是否合规,是TLS配置等。Kubernetes的安全扫描,API接口的情况,配置规范安全配置是否启用非安全端口等漏洞扫描。再是业务层漏洞扫描,这个和传统业务扫描类似,是来自于Docker还是来自于传统主机无区分。

39.jpeg-244.2kB
另外是Docker主机入侵检测,引入Docker很关键的是对Docker上的进程是属于什么样的Docker,如何分析进程中的相关文件,最关键的是容器的进程和容器镜像的关联关系,会对它做传统的疑似恶意分析在主机层进行,在后端会做深度的文件分析和威胁情报分析。在做入侵检测扫描时会看到有一些挑战,像对Webshell扫描,会对容器的读写层扫描发现容器启停读写层会不停地飘。业务魂不,因为容器会运行各种各样的容器,业务混布,文件非常多且复杂,这对扫描提出了比较大的挑战,所以要进行恶意二进制扫描。基线检查,一个是针对容器自身的安全基线检查,再是针对主机的安全策略基线检查。

40.jpeg-511.5kB
这个是Docker主机入侵检测的结果,比如检测到反弹shell和Webshell,第一个是在容器中反弹shell的检测,以及容器挂载目录里出现的恶意的webshell,包括恶意镜像里反弹shell的检测。

前面主要是针对于Docker的生态与架构、安全问题和OPPO容器安全实践进行的介绍,

四、容器生态的安全展望

42.jpeg-188.7kB
容器安全主要是目前个容器自身安全机制,主要还是依靠于主机提供的安全方案,容器自身的安全漏洞0-day怎么处理,还有内核安全机制,它的隔离性不完善,有一些部分并没有隔离,还有内核安全问题。

防御和检测,主要是容器的漂移性非常频繁,一个容器经常会在不同的主机上来回跑,这时如何做防御和检测,及容器与主机文件的映射关系比较复杂,因为有业务混布。再是容器的安全运维方案,现在是容器自动编排,编排系统的安全性如何,这个目前是发展当中。另外容器对现有业务的情况,比如现有业务架构,在比较完善的容器体制下可能不兼容无法融入,这个时候如何取舍和平衡。最后是容器的数据安全审计,因为容器的漂移性会导致审计变得很复杂,比如说有一些流量并不过交换机,直接在主机上已经过了。

另外秘钥的管理,经常飘来飘去,秘钥存储、信息安全、审查该怎么做,这也是一个挑战。这些是容器生态的安全展望。

我的介绍就到这里。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注