在Docker容器中实现安全与隔离

原创 2015年11月20日 11:58:56

在云计算中,多租户技术被认为是一个非常重要的功能。如果我们将容器中运行的应用看作一个租户,那么优秀的安全隔离技术设计可以确保租户只能使用它们可用的资源。

fIVZ3a.jpg

随着容器技术的发展,它的安全、隔离和资源控制的功能也在不断进步。本文中,我们将回顾Docker容器如何仅仅使用linux的原始功能来实现安全与隔离,比如namespaces, cgroups, capabilities等。


操作系统级的虚拟化,容器,空间,以及“chroot with steroids”,其实都定义了同一个概念:用户空间隔离。类似Docker的产品都使用了操作系统级的虚拟化,通过用户空间隔离可以提供额外的安全性。

0.9版本起,Docker包含了libcontainer库作为它直接虚拟化的方法,这个功能由Linux内核提供。 此外,它还通过 LXC[1],systemd-nspawn[2],和libvert[3]使用了抽象虚拟接口。
这些虚拟化库全部利用了Linux的原始容器(参见上图)

  • namespaces
  • cgroups
  • capabilities等等。

Docker在一个包装中联合了以上功能,并称之为容器格式。


默认的容器格式被称为libcontainer。

Docker也支持使用LXC的传统Linux容器。在将来,Docker可能会支持其他的容器格式,比如结合BSD jails或者Solaris Zones。

执行驱动程序是一种特殊容器格式的实现,用来运行docker容器。在最新的版本中,libcontainer有以下特性:

  • 是运行docker容器的默认执行驱动程序。
  • 和LXC同时装载。
  • 使用没有任何其他依赖关系的Go语言设计的库,来直接访问内核容器的API。
    • 目前的Docker涵盖的功能有:命名空间使用,cgroups管理,capabilities权限集,进程运行的环境变量配置以及网络接口防火墙设置——所有功能是固定可预测的,不依赖LXC或者其它任何用户区软件包。
    • 只需提供一个根文件系统,和libcontainer对容器的操作配置,它会帮你完成剩下的事情。
    • 支持新建容器或者添加到现有的容器。
    • 事实上,对libcontainer最迫切的需求是稳定,开发团队也将其设为了默认。
      • 在Docker 0.9中,LXC现在可以选择关闭。
      • 注意:LXC在将来会继续被支持。
      • 如果想要重新使用LXC驱动,只需输入指令docker -d –e lxc,然后重启Docker。


Docker不是虚拟化,相反的,它是一个支持命名空间抽象的内核,提供了独立工作空间(或容器)。当你运行一个容器的时候,Docker为容器新建了一系列的namespace。

一些Docker使用的linux命名空间:

  • pid namespace
    • 用作区分进程(PID: Process ID)。
    • 容器中运行的进程就如同在普通的Linux系统运行一样,尽管它们和其他进程共享一个底层内核。
  • net namespace
    • 用作管理网络接口。
    • DNAT允许你单独配置主机中每个用户的的网络,并且有一个方便的接口传输它们之间的数据。
    • 当然,你也可以通过使用网桥用物理接口替换它。
  • ipc namespace
    • 用作管理对IPC (IPC: InterProcess Communication)资源的访问。
  • mnt namespace
    • 用作管理mount-points (MNT: Mount)。
  • uts namespace
    • 用作区分内核和版本标识符(UTS: Unix Timesharing System)。


Linux上的Docker使用了被称为cgroups的技术。因为每个虚拟机都是一个进程,所有普通Linux的资源管理应用可以被应用到虚拟机。此外,资源分配和调度只有一个等级,因为一个容器化的Linux系统只有一个内核并且这个内核对容器完全可见。

总之,cgroups可以让Docker:

  • 实现组进程并且管理它们的资源总消耗。
  • 分享可用的硬件资源到容器。
  • 限制容器的内存和CPU使用。
    • 可以通过更改相应的cgroup来调整容器的大小。
    • 通过检查Linux中的/sys/fs/cgroup对照组来获取容器中的资源使用信息。
  • 提供了一种可靠的结束容器内所有进程的方法。


Linux使用的是“POSIX capabilities”。这些权限是所有强大的root权限分割而成的一系列权限。在Linux manpages上可以找到所有可用权限的清单。Docker丢弃了除了所需权限外的所有权限,使用了白名单而不是黑名单。

一般服务器(裸机或者虚拟机)需要以root权限运行一系列进程。包括:

  • SSH
  • cron
  • syslogd
  • 硬件管理工具 (比如负载模块)
  • 网络配置工具 (比如处理DHCP, WPA, or VPNs)等。

每个容器都是不同的,因为几乎所有这些任务都由围绕容器的基础设施进行处理。默认的,Docker启用一个严格限制权限的容器。大多数案例中,容器不需要真正的root权限。举个例子,进程(比如说网络服务)只需要绑定一个小于1024的端口而不需要root权限:他们可以被授予CAP_NET_BIND_SERVICE来代替。因此,容器可以被降权运行:意味着容器中的root权限比真正的root权限拥有更少的特权。
Capabilities只是现代Linux内核提供的众多安全功能中的一个。为了加固一个Docker主机,你可以使用现有知名的系统:

如果你的发行版本附带了Docker容器的安全模块,你现在就可以使用它们。比如,装载了AppArmor模板的Docker和Red Hat自带SELinux策略的Docker。希云(http://csphere.cn)以后会为大家推荐更多精美文章,请大家继续关注!

欢迎申请试用希云cSphere1.0版本,此版本不仅解决跨主机通信,更可以固定容器ip地址,以及创建容器时手动指定容器ip地址。

如果想亲自操作,请观看免费培训视频(http://csphere.cn/training

浅谈Docker隔离性和安全性

介绍 相信很多开发者都默认Docker这样的容器是一种沙盒(sandbox)应用,也就是说他们可以用root权限在Docker中运行随便什么应用,而Docker有安全机制能保护宿主系统。比如,有些人...
  • u019524703
  • u019524703
  • 2015年06月12日 09:34
  • 403

Docker的安全问题以及一些预防方案

这篇文章算是《Using Docker:Chapter13. Security and Limiting Containers》的读书笔记。
  • Ruidu_Doer
  • Ruidu_Doer
  • 2016年11月29日 22:37
  • 2107

浅谈Docker隔离性和安全性

相信很多开发者都默认Docker这样的容器是一种沙盒(sandbox)应用,也就是说他们可以用root权限在Docker中运行随便什么应用,而Docker有安全机制能保护宿主系统。比如,有些人觉得Do...
  • wenwenxiong
  • wenwenxiong
  • 2015年06月29日 20:32
  • 1923

浅谈Docker隔离性和安全性

相信很多开发者都默认Docker这样的容器是一种沙盒(sandbox)应用,也就是说他们可以用root权限在Docker中运行随便什么应用,而Docker有安全机制能保护宿主系统。比如,有些人觉得Do...
  • wenwenxiong
  • wenwenxiong
  • 2015年06月29日 20:32
  • 1923

Docker背后的内核知识——Namespace资源隔离

http://www.infoq.com/cn/articles/docker-kernel-knowledge-namespace-resource-isolation?utm_source=tui...
  • liukuan73
  • liukuan73
  • 2016年08月08日 11:11
  • 1417

基于LXCFS增强docker容器隔离性的分析

1. 背景 容器虚拟化带来轻量高效,快速部署的同时,也因其隔离性不够彻底,给用户带来一定程度的使用不便。Docker容器由于Linux内核namespace本身还不够完善的现状(例如,没有cgr...
  • S1234567_89
  • S1234567_89
  • 2016年02月23日 14:40
  • 1644

在Docker容器中实现安全与隔离

随着容器技术的发展,它的安全、隔离和资源控制的功能也在不断进步。本文中,我们将回顾Docker容器如何仅仅使用linux的原始功能来实现安全与隔离,比如namespaces, cgroups, cap...
  • sun754276603
  • sun754276603
  • 2015年11月20日 12:06
  • 349

ejb容器中安全机制的研究与实现

  • 2012年04月11日 16:15
  • 1.97MB
  • 下载

应用程序跑在Docker容器中会更安全

Docker对安全的支持是与生俱来的。作为一个平台,Docker为跑在其中的所有应用程序提供安全保障,不需要在Docker之外,单独部署一套安全解决方案。...
  • ghostcloud2016
  • ghostcloud2016
  • 2016年08月31日 14:23
  • 331

实现模板函数to_string用来格式化输出stl容器中的内容以及基础类型及自定义类型

  • 2013年07月17日 15:22
  • 10KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在Docker容器中实现安全与隔离
举报原因:
原因补充:

(最多只允许输入30个字)