Docker容器的安全隐患和解决之道

容器有哪些风险,纵观整个容器的生命周期Build、Ship、and Run Any App、Anywhere,我们会发现容器生命周期的各个阶段,风险无处不在。

20160820084838

  • 容器构建(Build):含有高危漏洞的镜像,Dockerfile中恶意程序等;
  • 容器传输(Ship):传输过程中被篡改等;
  • 容器运行(Run):文件系统威胁、拒绝服务攻击、容器逃逸、网络共享等。

首先,我们来看Docker本身在安全方面有哪些考虑:

一、由Namespaces、Cgroups和Capability实现的Linux系统固有的安全标准;

  1. 隔离性(Namespace):实现每个用户实例之间相互隔离,互不影响,其中pid、net、ipc、mnt、uts、user等namespace将container的进程、网络、消息、文件系统、UTS和用户空间隔离开。
  2. 可配额/可度量(Cgroups):实现实现了对资源的配额和度量,cgroups 的使用非常简单,提供类似文件的接口,在/cgroup目录下新建一个文件夹即可新建一个group,在此文件夹中新建task文件,并将pid写入该文件,即可实现对该进程的资源控制。groups可以限制blkio、cpu、cpuacct、cpuset、devices、freezer、memory、net_cls、ns九大子系统的资源。
  3. 权限划分(Capability):可以独立对特定的Capability进行使能或禁止从2.2内核开始,Linux把原来和超级用户相关的高级权限划分成为不同的单元,称为Capability,这样就可以独立对特定的Capability进行使能或禁止。通常来讲,不合理的禁止Capability,会导致应用崩溃,因此对于Docker这样的容器,既要安全,又要保证其可用性。开发者需要从功能性、可用性以及安全性多方面综合权衡Capability的设置。

二、Docker文件系统

Docker采用的是写时复制(Copy-On-Write)文件系统,所有运行的容器可以先共享一个基本文件系统镜像,一旦需要向文件系统写数据,就引导它写到与该容器相关的另一个特定文件系统中,这样的机制避免了一个容器看到另一个容器的数据,而且容器也无法通过修改文件系统的内容来影响其他容器。

三、Docker Deamon的安全接口

Docker Client和Docker daemon的通信是通过TLS和一个可信的CA证书来保证信息的安全。

四、Linux本身的安全加固解决方案,类如AppArmor、 SELinux

SELinux(Secure Enhanced Linux)是一个Linux安全策略机制,允许管理员更加灵活的定义安全策略。

AppArmor 主要的作用是设置某个可执行程序的访问控制权限,可以限制程序读/写某个目录/文件,打开/读/写网络端口等等。

SELinux与Apparmor最大的区别在于:Apparmor使用文件名(路径名)最为安全标签,而SELinux使用文件的inode作为安全标签,这就意味着,Apparmor机制可以通过修改文件名而被绕过,另外,在文件系统中,只有inode才具有唯一。

另外我们看看Docker公司针对容器安全的一些解决方案:

一、镜像扫描Docker Security Scanning

20160820084857

  • 用户/发行商推送一个镜像到Docker Cloud仓库;
  • Docker Security Scanning的服务会启动(其服务包括一个扫描触发,扫描器,一个数据库,插件框架和CVE数据库的验证服务);
  • 扫描器服务获取到镜像然后将它分离成相应的层和组件;
  • 这些组件将被送到验证服务跟多个CVE数据库包的名称和版本进行对比,还会对包的内容进行二进制级别的扫描;

二、镜像签名(Docker Content Trust)

20160820084906

  • 目的:保证镜像的完整性以及发布者的真实性
  • 原理:通过Notary封装了TUF(The Update Framework)来实现
  • 使用:设置环境变量Docker_CONTENT_TRUST开启或关闭
##enable content trust$ docker build --disable-content-trust=false -t <username>/trusttest:testing
##push images$ docker push --disable-content-trust=false <username>/trusttest:testing
##Pull images$ docker pull --disable-content-trust=false <username>/trusttest:testing

在2015年,Docker公司与互联网安全中心(CIS)合作,制定了一份Docker安全基准,包含很多针对部署Docker的安全性的建议:

1、主机配置
2、Docker守护进程配置
3、Docker守护进程配置文件
4、容器镜像与Build文件
5、容器运行时
6、Docker安全操作

Docker公司通过种种的安全工具及规范来保证Docker在整个生命周期的安全性,但还是逃脱不了风险的存在,比如:DOS/DDOS攻击、文件系统漏洞、系统威胁、行为违规等。这个时候,很多人会问有没有其他的一些解决方案来解决这些威胁,在这里我顺便介绍下有容云公司针对容器安全推出的一款产品,它可以完美解决容器其他的安全威胁。

AppSafe 国内首款企业级容器安全产品,以应用为中心、轻量级、保障容器静态资源及运行时安全的分布式解决方案。

企业级容器平台安全保护,针对应用漏洞、违规、威胁、攻击,并结合安全策略,实时监视网络会话,提供安全保护。

AppSafe四大优势:

20160820084913

AppSafe六大功能:

20160820084922

AppSafe一图纵览:

20160820084929

好了,不多说了,对AppSoar安全产品有兴趣的,可以到有容云官方进行详细了解。

答疑环节

问:云迁移是不是可以理解平时手动安装或者自动安装的中间价或者系统,只是换了一个平台安装而已。有什么特别的吗?

雷伟:如果是迁移到容器云平台,建议最好先对应用进行微服务化改造。对于不同的应用,首先需要考虑到应用的运行环境:包括对外提供的服务接口、对外呈现的服务接口、及外部数据接口、及对外的端口、应用模块/应用之间的IP访问等,再根据这些运行环境构建镜像。对于常用的中间件,建议可以通过有容云AppSoar使用有容云应用商店,里面有很多我们根据实施经验进行容器化的中间件,大家可以直接使用。

问:平时手动/自动安装的中间件业务系统等 ,换到云平台上了再重新手动或者自动安装一遍吗,有什么特别之处吗?

雷伟:如果按照上述搭建好运行环境,其他的需要着重考虑的是网络互通问题。

问:AppSafe能否用在私有环境中?

雷伟:可以的。

问:有容云怎么做到DDoS安全的,是采用代理吗?

雷伟:考虑到在很多企业的应用环境中,外部的防DDoS攻击目前已有很完善的解决方案,AppSafe的DDoS主要考虑到系统内部容器/应用之间的防护,主要是从网络链路层去查看是否为正常,不是通过代理的方式。

问:那有容云已经是七层了,怎么能防住网络层攻击?

雷伟:AppSafe实现是会在每个管理主机上以容器的方式运行Agent,然后进行应用监控,解决如应用之间的半连接数过多问题。

问:就是说不通容器之间通过Agent来防止被攻击阻塞的吧?

雷伟:是的。

问:在公有云的场景下,租户的Docker client中包含租户的身份标识,请问这个是如何保护的?一旦租户自己的系统被攻破,攻击者可以拿该标识做些恶意行为。我理解AppSafe只是用于容器层面的保护,Docker client是租户层面的操作,由于租户自己的安全意识或技能薄弱,被攻击的可能性较大,攻击者获取到的是合法租户的身份凭据,到了Docker hub侧就是合法的,请确认。

雷伟:AppSafe主要提供系统中容器之间的防护,未涉及到租户的信息,不过个人认为Docker client去连接使用容器比较类似虚拟机的使用方式,建议能够以构建镜像的方式来使用容器。

问:私有环境下是怎么部署,k8或Mesos管理的都可以用吗?这个收费是怎么样的收费模式?

雷伟:可以。有容云的所有产品都是独立设计的,不仅仅只和我们自有的平台和产品兼容。谢谢这位朋友的关注,商务问题私下联系。

分享到:更多 ()