《Docker……》笔记-9 Docker 安全

来源:互联网 发布:知耻而后勇是什么意思 编辑:程序博客网 时间:2024/05/17 03:11

杨保华 戴王剑 曹亚伦.《Docker技术入门与实战》 〔M〕.机械工业出版社,2015年2月∶P233-237

第十九章 Docker安全

从命名空间、控制组、内核能力、服务端等角度剖析Docker目前保障安全的相关手段。
Docker是在Linux操作系统层面上的虚拟化实现,运行在容器内的进程,跟运行在本地系统中的进程,并无本质区别,不合适的安全策略将可能给本地系统带来风险。
Docker容器的安全性,很大程度上依赖于Linux系统自身,评估Docker的安全性时,主要考虑以下几个方面:
* Linux内核的命名空间机制提供的容器隔离安全
* Linux控制组机制对容器资源的控制能力安全。
* Linux内核的能力机制所带来的操作权限安全
* Docker程序(特别是服务端)本身的抗攻击性。
* 其他安全增强机制对容器安全性的影响。

1. 命名空间隔离的安全。

Docker容器和LXC容器在实现上很相似,所提供的安全特性也基本一致。
当docker run启动一个容器时,Docker将在后台为容器创建一个独立的命名空间。命名空间提供了最基础也最直接的隔离,在容器中运行的进程不会呗运行在本地主机上的进程和其他容器通过正常渠道发现和影响。
与虚拟机方式相比,通过命名空间来实现的隔离不是那么绝对。运行在容器中的应用可以直接访问系统内核和部分系统文件。因此,用户必须保证容器中应用是安全可信的,否则本地系统将可能收到威胁。

2. 控制组资源控制的安全

当docker run启动一个容器时,Docker将在后台为容器创建一个独立的控制组策略集合。
它提供了很多有用的特性;确保各容器可以公平地分享主机的内存、CPU、磁盘IO等资源;同时确保了当发生在容器内的资源压力不会影响到本地主机系统和其他容器。它在防止拒绝服务攻击(DDoS)方面必不可少。

3. 内核能力机制

能力机制(Capability)是Linux内核一个强大的特性,可以提供细粒度的权限访问控制。传统的Unix系统对进程权限只有根权限(用户id为0,即root用户)和非根权限(非root用户)两种
Linux内核自2.2版本起支持能力机制,将权限划分为更加细粒度的操作能力,即可作用在进程上,也可作用在文件上。
使用能力机制对加强Docker容器的安全性有很多好处。通常,在服务器上会运行一些需要特权权限的进程,包括有ssh、cron、syslogd、硬件管理工具模块、网络配置工具等。容器跟这些进程是不同的,因为几乎所有的特权进程都由容器以外的支持系统进行管理。
* ssh 访问被宿主主机上的ssh服务来管理。
* cron 通常应该作为用户进程执行,权限交给使用它服务的应用来处理。
* 日志系统可由Docker或第三方服务管理。
* 硬件管理无关紧要,容器中也就无需执行udevd以及类似服务。
大部分情况下,容器并不需要“真正的”root权限,容器只需要少数的能力即可。为加强安全,容器可禁用一些没必要的全权限。
* 完全禁止任何文件挂载操作。
* 禁止直接访问本地主机的套接字。
* 禁止访问一些文件系统的操作,如创建新的设备、修改文件属性等。
* 禁止模块加载。
默认情况下,Docker采用“白名单”机制,禁用“必需功能”之外的其他权限。

4. Docker服务端防护

使用Docker容器的核心是Docker服务端。首先,确保只有可信的用户才能访问到Docker服务。Docker允许用户在主机和容器间共享文件夹,同时不需要限制容器的访问权限,这就很容易让容器突破资源限制。
目前,Docker自身改进安全防护的目标是实现以下两个重要安全特性:
* 将容器的root用户映射到本地主机上的非root用户,减轻容器和主机之间因权限提升而引起的安全问题。
* 允许Docker 服务端在非root权限下运行,利用安全可靠的子进程来代理执行需要特权权限的操作。这些子进程只允许在特定范围内进行操作。

5. 其他安全特性。

Docker当前默认只启用了能力机制。用户可以选择启用更多的安全方案来加强Docker主机的安全。如:
* 在内核中启用GRSEC和PAX,这将增加更多的编译和运行时的安全检查;并且通过地址随机化机制来避免恶意探测等。启用该特性不需要Docker进行任何配置。
* 使用一些有增强安全特性的容器模板。
* 用户可以自定义更加严格的访问控制机制来定制安全策略。
在文件系统挂载到容器内部时,可以通过配置只读(read-only)模式来避免容器内的应用通过文件系统破坏外部环境,特别是一些系统运行状态相关的目录。

6. 小结

任何技术层面实现的安全都需要用户合理使用才能得到巩固,在使用Docker过程中个,需注意如下几方面:
* 使用Docker容器运行应用时,牢记容器自身所提供的隔离性并没有那么完善,需要加强对容器内应用的安全审查。
* 采用专用的服务器来运行Docker服务端和相关的管理服务,并对该服务器启用最高级别的安全机制。而把其他的业务服务都放到容器中去运行。
* 将运行Docker容器的机器划分为不同组,相互信任的机器放到同一个组内;组间进行安全隔离;同时定期进行安全检查。
* 随着容器大规模地使用和集成,甚至组成容器集群。需要考虑在容器网络上进行必备的安全防护。

0 0
原创粉丝点击