1.内核名字空间

Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。当用 docker run 启动一个容器时,在后台 Docker 为容器创建了一个独立的名字空间和控制组集合。

名字空间提供了最基础也是最直接的隔离,在容器中运行的进程不会被运行在主机上的进程和其它容器发现和作用。

每个容器都有自己独有的网络栈,意味着它们不能访问其他容器的 sockets 或接口。不过,如果主机系统上做了相应的设置,容器可以像跟主机交互一样的和其他容器交互。当指定公共端口或使用 links 来连接 2 个容器时,容器就可以相互通信了(可以根据配置来限制通信的策略)。
从网络架构的角度来看,所有的容器通过本地主机的网桥接口相互通信,就像物理机器通过物理交换机通信一样。

那么,内核中实现名字空间和私有网络的代码是否足够成熟?
内核名字空间从 2.6.15 版本(2008 年 7 月发布)之后被引入,数年间,这些机制的可靠性在诸多大型生产系统中被实践验证。

实际上,名字空间的想法和设计提出的时间要更早,最初是为了在内核中引入一种机制来实现 OpenVZ (http://en.wikipedia.org/wiki/OpenVZ) 的特性。 而 OpenVZ 项目早在 2005 年就发布了,其设计和实现都已经十分成
熟。


2.控制组

控制组是 Linux 容器机制的另外一个关键组件,负责实现资源的审计和限制。

它提供了很多有用的特性;以及确保各个容器可以公平地分享主机的内存、CPU、磁盘 IO 等资源;当然,更重要的是,控制组确保了当容器内的资源使用产生压力时不会连累主机系统。

尽管控制组不负责隔离容器之间相互访问、处理数据和进程,它在防止拒绝服务(DDOS)攻击方面是必不可少的。尤其是在多用户的平台(比如公有或私有的 PaaS)上,控制组十分重要。例如,当某些应用程序表现异常的时候,可以保证一致地正常运行和性能。

控制组机制始于 2006 年,内核从 2.6.24 版本开始被引入。


3.服务端的防护

运行一个容器或应用程序的核心是通过 Docker 服务端。Docker 服务的运行目前需要 root 权限,因此其安全性十分关键。

首先,确保只有可信的用户才可以访问 Docker 服务。Docker 允许用户在主机和容器间共享文件夹,同时不需要限制容器的访问权限,这就容易让容器突破资源限制。例如,恶意用户启动容器的时候将主机的根目录 / 映射到容器的 /host 目录中,那么容器理论上就可以对主机的文件系统进行任意修改了。这听起来很疯狂?但是事实上几乎所有虚拟化系统都允许类似的资源共享,而没法禁止用户共享主机根文件系统到虚拟机系统。

这将会造成很严重的安全后果。因此,当提供容器创建服务时(例如通过一个 web 服务器),要更加注意进行参数的安全检查,防止恶意的用户用特定参数来创建一些破坏性的容器为了加强对服务端的保护,Docker 的 REST API(客户端用来跟服务端通信)在 0.5.2 之后使用本地的 Unix
套接字机制替代了原先绑定在 127.0.0.1 上的 TCP 套接字,因为后者容易遭受跨站脚本攻击。现在用户使用 Unix 权限检查来加强套接字的访问安全。

用户仍可以利用 HTTP 提供 REST API 访问。建议使用安全机制,确保只有可信的网络或 VPN,或证书保护机制(例如受保护的 stunnel 和 ssl 认证)下的访问可以进行。此外,还可以使用 HTTPS 和证书来加强保护。

最近改进的 Linux 名字空间机制将可以实现使用非 root 用户来运行全功能的容器。这将从根本上解决了容器和主机之间共享文件系统而引起的安全问题。

终极目标是改进 2 个重要的安全特性:

  • 将容器的 root 用户映射到本地主机上的非 root 用户,减轻容器和主机之间因权限提升而引起的安全问题;
  • 允许 Docker 服务端在非 root 权限下运行,利用安全可靠的子进程来代理执行需要特权权限的操作。这些子进程将只允许在限定范围内进行操作,例如仅仅负责虚拟网络设定或文件系统管理、配置操作等。

最后,建议采用专用的服务器来运行 Docker 和相关的管理服务(例如管理服务比如 ssh 监控和进程监控、管理工具 nrpe、collectd 等)。其它的业务服务都放到容器中去运行。


4.内核能力机制

能力机制(Capability)是 Linux 内核一个强大的特性,可以提供细粒度的权限访问控制。 Linux 内核自 2.2 版本起就支持能力机制,它将权限划分为更加细粒度的操作能力,既可以作用在进程上,也可以作用在文件上。
例如,一个 Web 服务进程只需要绑定一个低于 1024 的端口的权限,并不需要 root 权限。那么它只需要被授权net_bind_service 能力即可。此外,还有很多其他的类似能力来避免进程获取 root 权限。

默认情况下,Docker 启动的容器被严格限制只允许使用内核的一部分能力。

使用能力机制对加强 Docker 容器的安全有很多好处。通常,在服务器上会运行一堆需要特权权限的进程,包括有 ssh、cron、syslogd、硬件管理工具模块(例如负载模块)、网络配置工具等等。容器跟这些进程是不同
的,因为几乎所有的特权进程都由容器以外的支持系统来进行管理。

  • ssh 访问被主机上ssh服务来管理;
  • cron 通常应该作为用户进程执行,权限交给使用它服务的应用来处理;
  • 日志系统可由 Docker 或第三方服务管理;
  • 硬件管理无关紧要,容器中也就无需执行 udevd 以及类似服务;
  • 网络管理也都在主机上设置,除非特殊需求,容器不需要对网络进行配置。

从上面的例子可以看出,大部分情况下,容器并不需要“真正的” root 权限,容器只需要少数的能力即可。为了加强安全,容器可以禁用一些没必要的权限。

  • 完全禁止任何 mount 操作;
  • 禁止直接访问本地主机的套接字;
  • 禁止访问一些文件系统的操作,比如创建新的设备、修改文件属性等;
  • 禁止模块加载。

这样,就算攻击者在容器中取得了 root 权限,也不能获得本地主机的较高权限,能进行的破坏也有限。

默认情况下,Docker采用 白名单 (https://github.com/docker/docker/blob/master/daemon/execdriver/nati
ve/template/default_template.go) 机制,禁用 必需功能 (https://github.com/docker/docker/blob/master/daemon/execdriver/native/template/default_template.go) 之外的其它权限。 当然,用户也可以根据自身需求来为 Docker 容器启用额外的权限。


5.其它安全特性

除了能力机制之外,还可以利用一些现有的安全机制来增强使用 Docker 的安全性,例如 TOMOYO, AppArmor, SELinux, GRSEC 等。

Docker 当前默认只启用了能力机制。用户可以采用多种方案来加强 Docker 主机的安全,例如:

  • 在内核中启用 GRSEC 和 PAX,这将增加很多编译和运行时的安全检查;通过地址随机化避免恶意探测等。并且,启用该特性不需要 Docker 进行任何配置。
  • 使用一些有增强安全特性的容器模板,比如带 AppArmor 的模板和 Redhat 带 SELinux 策略的模板。这些模板提供了额外的安全特性。
  • 用户可以自定义访问控制机制来定制安全策略。

跟其它添加到 Docker 容器的第三方工具一样(比如网络拓扑和文件系统共享),有很多类似的机制,在不改变
Docker 内核情况下就可以加固现有的容器。


6.总结

总体来看,Docker 容器还是十分安全的,特别是在容器内不使用 root 权限来运行进程的话。

另外,用户可以使用现有工具,比如 Apparmor, SELinux, GRSEC 来增强安全性;甚至自己在内核中实现更复杂的安全机制。

docker(11):安全相关推荐

  1. Centos7 上安装Docker

    1 . Docker社区版 Centos官网安装文档 https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-en ...

  2. docker查询mysql 有哪些版本的镜像_CentOS安装Docker环境和mysql镜像的记录

    1.查看操作系统版本 执行命令: lsb_release -a 2. 查看磁盘使用情况 执行命令: df -h 3.查看CPU配置 执行命令: lscpu 4.查看内存使用情况 执行命令: free ...

  3. 企业——Docker容器的搭建及简单应用

    1.环境需求 不需要开虚拟机,只需要一个真机就行. 下载docker的安装包,可以在官网上下载  www.docker.com yum install -y pigz-2.3.4-1.el7.x86_ ...

  4. docker部署python web应用_安装docker并部署web项目

    一.docker简介 1.docker定义:docker是一个用来装应用的容器,就像杯子可以装水,笔筒可以装笔,书包可以放书一样.你可以把"hello world!"放到docke ...

  5. Docker的使用、底层原理及常用软件docker下载

    文章目录 1.Docker三要素 2.Docker的是怎么工作的? 3.Docker run ...的运行流程 4.Docker对比虚拟机的优势 5.Docker安装(centos7) 6.Docke ...

  6. Docker安装与卸载,配置阿里云镜像加速器

    一.在linux上安装docker 1.查看linux系统配置 查看linux系统配置 cat /etc/os-release 查看centos版本uname -r # 要求:大于3.10 # 如果小 ...

  7. 全网最全docker初级入门!!!

    一.centos7常用命令 1.查看CPU.硬盘和内存使用情况 #查看CPU $ dmesg |grep -i xeon #查看内存 $ free -m 以MB为单位查询内存 #查看硬盘 $ df - ...

  8. 微服务架构,springcloud核心组件和实战,docker容器

    文章目录 前言 一.微服务开发基础 1.微服务架构开发 1.1单体架构的应用的困境 1.2 微服务架构 1.2.1 理解微服务架构 1.2.1 微服务的优缺点 1.3 微服务架构设计 1.3.1 微服 ...

  9. 第一本Docker书pdf

    下载地址:网盘下载 内容简介  · · · · · · 全球第一本Docker技术图书中文版,Docker中文社区鼎力支持! Docker核心团队成员权威著作,在技术圈中很有影响力. 既是第一本Doc ...

最新文章

  1. 给定一个单词集合,找出可以相互转换的集合。比如abc bca cba都可以相互转换(变位词)
  2. python3精要(4)-python数字与表达式1
  3. 蔚来三元铁锂电池绕道超车
  4. mysql mvcc gap lock_为什么说 MVCC 和 Gap Lock 解决了 MySQL 的幻读问题
  5. 游戏蛮牛Unity 用户文档
  6. 用什么软件测试路由器,软件测试路由器系统的方法及其运用
  7. 计算机应用基础统考试题及答案题库,2.Windows知识题部分--计算机应用基础统考试题库及答案...
  8. 进程的基本概念及操作
  9. 一张纸对折多少次后能达到珠穆朗玛峰的高度
  10. html5 语音唤醒,语音交互:从语音唤醒(KWS)聊起
  11. 抖音如何能快速涨粉?
  12. 到底什么是服务器托管
  13. 如何提取论文中的表格数据(pdf转换excel)
  14. 2. 合并两个有序数组
  15. php查询快递,PHP查询快递信息的方法_PHP
  16. ASP.NET MVC:多语言的三种技术处理策略
  17. 什么是自我否定?如何改变自我否定的心理?
  18. 串口通信-STM32的USART串口通讯程序
  19. 因“暂存盘”已满而无法启动PS的解决
  20. 凯利公式自动计算表_工程成本测算难?全自动计算汇总表格,套入公式一键即可出结果...

热门文章

  1. 【网络技术联盟站】网络工程师深入篇之网络基础知识
  2. 制作一个简单的logo
  3. 学以致用——Java源码——抛双骰游戏图形界面版(GUI-Based Craps Game)
  4. react-native 中的元素(zIndex,elevation)层级关系
  5. ui设计主要学什么内容?高薪UI设计师必看
  6. PxCook+photoshop实现傻瓜式切图(推荐小白使用)
  7. 海风教育校园家庭教育系列公益讲座正式启动
  8. 基于MSP430的矩阵键盘:4*4
  9. printf压栈问题[保姆级教程]
  10. 【机器学习】【线性代数 for PCA】矩阵与对角阵相似、 一般矩阵的相似对角化、实对称矩阵的相似对角化