08 Docker 容器安全

容器与虚拟机区别

由下图可见,虚拟机是通过管理系统(Hypervisor)模拟出 CPU、内存、网络等硬件,然后在这些模拟的硬件上创建客户内核和操作系统。这样做的好处就是虚拟机有自己的内核和操作系统,并且硬件都是通过虚拟机管理系统模拟出来的,用户程序无法直接使用到主机的操作系统和硬件资源,因此虚拟机也对隔离性和安全性有着更好的保证。

而 Docker 容器则是通过 Linux 内核的 Namespace 技术实现了文件系统、进程、设备以及网络的隔离,然后再通过 Cgroups 对 CPU、内存等资源进行限制,最终实现了容器之间相互不受影响,由于容器的隔离性仅仅依靠内核来提供,因此容器的隔离性也远弱于虚拟机。

虚拟机与容器比较

为啥还用容器

既然虚拟机安全性这么好,为什么我们还要用容器呢?其实两者各有利弊,只是在业务快速开发与迭代的今天,容器秒级启动、性能损耗小,镜像占用小等特性更加匹配当今主流的业务场景。


容器存在的安全问题

  • (1) Docker 自身安全
    Docker 作为一款容器引擎,本身也会存在一些安全漏洞,CVE 目前已经记录了多项与 Docker 相关的安全漏洞,主要有权限提升、信息泄露等几类安全问题。

  • (2) 镜像安全
    由于 Docker 容器是基于镜像创建并启动,因此镜像的安全直接影响到容器的安全,具体的安全漏洞有如下:

● 基础软件漏洞:由于容器需要安装基础的软件包,如果软件包存在漏洞,则可能会被不法分子利用并且侵入容器,影响其他容器或主机安全。
● 镜像仓库漏洞:无论是 Docker 官方的镜像仓库还是私有镜像仓库,都有可能被攻击和篡改镜像,当我们使用镜像时,就可能成为攻击者的目标对象。
● 用户程序漏洞:用户自己构建的软件包可能存在漏洞或者被植入恶意脚本,这样会导致运行时提权影响其他容器或主机安全。
  • (3) Linux 内核隔离性不足
    尽管目前 Namespace 已经提供了非常多的资源隔离类型,但仍有部分关键内容没有被完全隔离,其中包括一些系统的关键性目录(如 /sys、/proc 等),这些关键性的目录可能会泄露主机上一些关键性的信息,让攻击者利用这些信息对整个主机发起攻击;而且一旦内核的 Namespace 被突破,攻击者就有可能直接提权对主机造成破坏。

  • (4) 所有容器共享主机内核
    由于同一宿主机上所有容器共享主机内核,所以攻击者可以利用一些特殊手段导致内核崩溃,进而导致主机宕机影响主机上其他服务。


解决容器安全问题

  • (1) Docker 自身安全性改进
    在过去容器里的 root 用户就是主机上的 root 用户,如果容器受到攻击,或者容器本身含有恶意程序,在容器内就可以直接获取到主机 root 权限。Docker 从 1.10 版本开始,使用 User Namespace 做用户隔离,实现了容器中的 root 用户映射到主机上的非 root 用户,从而大大减轻了容器被突破的风险,因此建议尽可能使用最新版 Docker。

  • (2) 保障镜像安全
    为保障镜像安全,我们可以在私有镜像仓库安装镜像安全扫描组件,对上传的镜像进行检查,通过与 CVE 数据库对比,一旦发现有漏洞的镜像及时通知用户或阻止非安全镜像继续构建和分发。同时为了确保我们使用的镜像足够安全,在拉取镜像时,要确保只从受信任的镜像仓库拉取,并且与镜像仓库通信一定要使用 HTTPS 协议。

  • (3) 加强内核安全和管理
    宿主机内核尽量安装最新补丁;使用 Capabilities 划分权限,它实现了系统更细粒度的访问控制;启动容器时一般不建议开启特权模式,如需添加相应的权限可以使用 --cap-add 参数。

  • (4) 使用安全加固组件
    Linux 的 SELinuxAppArmorGRSecurity 组件都是 Docker 官方推荐的安全加固组件,这三个组件可以限制一个容器对主机的内核或其他资源的访问控制,目前容器报告里的一些安全漏洞。下面说明下这些安全加固组件:

● SELinux:是 Linux 的一个内核安全模块,提供了安全访问的策略机制,通过设置 SELinux 策略可以实现某些进程允许访问某些文件。
● AppArmor:类似于 SELinux,也是一个 Linux 的内核安全模块,普通的访问控制仅能控制到用户的访问权限,而 AppArmor 可以控制到用户程序的访问权限。
● GRSecurity:是一个对内核的安全扩展,可通过智能访问控制,提供内存破坏防御,文件系统增强等多种防御形式。
  • (5) 资源限制
    在生产环境中,建议每个容器都添加相应的资源限制,这样即便应用程序有漏洞,也不会导致主机的资源被耗尽,最大限度降低了安全风险。启动容器时可使用以下相关的资源限制参数:
--cpus:限制 CPU 配额
--memory:限制内存配额
--pids-limit:限制容器的 PID 个数

### 举例:
$ docker run -it --cpus=1 --memory=2048m --pids-limit=1000 busybox sh
  • (6) 使用安全容器
    容器有着轻便快速启动的优点,虚拟机有着安全隔离的优点,有没有一种技术可以兼顾两者的优点,做到既轻量又安全呢?答案是有的,那就是安全容器。
    安全容器与普通容器的主要区别在于,安全容器中的每个容器都运行在一个单独的微型虚拟机中,拥有独立的操作系统和内核,并且有虚拟机般的安全隔离性。

    安全容器目前推荐的技术方案是 Kata Containers,它并不包含一个完整的操作系统,只有一个精简版的 Guest Kernel 运行着容器本身的应用,可以通过使用共享内存来进一步减少内存的开销。另外,它还实现了 OCI 规范,可以直接使用 Docker 的镜像启动 Kata 容器,具有开销更小、秒级启动、安全隔离等许多优点。
普通容器与安全容器对比

你可能感兴趣的:(08 Docker 容器安全)