Docker-基于内核的弱隔离性如何保障安全性

481 阅读4分钟

1: Docker与虚拟机的区别

  • 虚拟机是通过管理系统(Hypervisor)来模拟出CPU,内存,网络等硬件,然后在这些模拟的硬件上创建内核和操作系统,这样做的好处是虚拟机有自己的内核和操作系统,用户是无法直接使用主机上的操作系统和硬件资源。因此虚拟机也对隔离性和安全性有着更好的保证
  • Docker容器是通过Linux的Namespace来进行资源隔离的,然后利用cgroups来进行资源的限制,最终实现了容器之间互不影响,由于容器的隔离仅仅是依靠内核来提供,所以容器的隔离型与弱于虚拟机

2:Docker容器的安全问题

  • Docker自身安全
    • Docker作为一款容器引擎,本身也会存在一些安全漏洞,CVE目前已经记录了多项与Docker相关的安全漏洞,主要有权限提升,信息泄漏几类安全问题
  • 镜像安全
    • 由于Docker是需要镜像来启动的,因此镜像的安全直接影响到容器的安全
    • 镜像软件存在安全漏洞:由于容器需要下载一些软件包,如果软件包本身就有问题,那么就会有别人侵入容器,影响其它容器或者主机的安全
    • 仓库漏洞:无论是Docker的官方仓库还是自己的私有仓库,都有可能被别人侵入,然后修改你的镜像文件,当我们使用镜像时,就会成为攻击者的目标
    • 用户程序漏洞:用户自己构建的软件包可能存在漏洞被别人植入恶意脚本,这样会导致容器或者主机的安全
  • Linux内核隔离性不够
    • 尽管目前Namespace已经提供了很多种资源隔离类型,但是仍有部分关键内容没有被隔离,其中包括一些系统的关键性目录(/sys,/proc)等,这些关键性的目录可能会泄漏主机一些关键性的信息
    • 而仅仅依靠Namespace的隔离是远远不够的,因为一旦内核的Namespce被攻破,使用者就可以直接获取主机的超级权限,从而影响主机安全
  • 所有容器共享主机内核
    • 由于同一主机上的所有容器共享主机内核,所以攻击者可以利用一些特殊手段使主机内核崩溃,进而导致主机宕机影响主机上的其它服务

3:如何解决容器自身的安全性问题

  • Docker自身安全性改进:随着Docker的不断改进,在安全性方面已经作出了非常大的改进,目前Docker在默认配置和默认行为下是足够安全的
  • 保障镜像自身安全:我们可以在私有仓库安装镜像安全扫描组件,一旦发现镜像有漏洞,就及时通知用户阻止镜像的构建和发布
  • 加强内核安全和管理:由于容器仅仅依靠内核来提供资源隔离,所以我们要及时升级内核漏洞,使用Capabilities划分权限,使用安全加固组件,资源限制
  • 使用安全容器:容器有着轻便快速启动的优点,虚拟机有着安全隔离的优点,有没有一种技术可以兼顾两者的优点,做 到既轻量又安全呢?答案是有,那就是安全容器。安全容器是相较于普通容器的,安全容器与普通容器的主要区别在于,安 全容器中的每个容器都运行在一个单独的微型虚拟中,拥有独立的操作系统和内核,并且有虚拟化层 的安全隔离。安全容器目前推荐的技术方案是 Kata Containers,Kata Container 并不包含一个完整的操作系统,只 有一个精简版的 Guest Kernel 运行着容器本身的应用,并且通过减少不必要的内存,尽量共享可以共 享的内存来进一步减少内存的开销。另外,Kata Container 实现了 OCI 规范,可以直接使用 Docker 的 镜像启动 Kata 容器,具有开销更小、秒级启动、安全隔离等许多优点。

4:容器有这么多问题,那为什么还是选择容器不选择虚拟机呢

  • 相比与虚拟机,容器的使用性能损耗小,并且镜像也非常小
  • 相比与虚拟机,容器秒级启动等特性非常符合业务快速迭代的的业务场景