干货 | Docker中用到的主要Linux安全技术有哪些?
每个优秀的容器平台都应该使用命名空间和控制组技术来构建容器。最佳的容器平台还会集成其他容器安全技术,例如系统权限、强制访问控制系统(如SELinux和AppArmor)以及安全计算。正如用户所期望的,Docker中集成了上述全部安全技术!
在本节中会对Docker中用到的主要Linux技术进行简要介绍。之所以不进行深入介绍,是因为在本书中希望将重点放在Docker平台技术上。
1.Namespace
内核命名空间属于容器中非常核心的一部分! 该技术能够将操作系统(OS)进行拆分,使一个操作系统看起来像多个互相独立的操作系统一样。这种技术可以用来做一些非常酷的事情,比如在相同的OS上运行多个Web服务,同时还不存在端口冲突的问题。该技术还允许多个应用运行在相同OS上并且不存在竞争,同时还能共享配置文件以及类库。
举两个简单的例子。
用户可以在相同的OS上运行多个Web服务,每个端口都是443。为了实现该目的,可以将两个Web服务应用分别运行在自己的网络命名空间中。这样可以生效的原因是每个网络命名空间都拥有自己的IP地址以及对应的全部端口。也可能需要将每个IP映射到Docker主机的不同端口之上,但是使用IP上的哪个端口则无须其他额外配置。
用户还可以运行多个应用,应用间共享类库和配置文件,但是版本可能不同。为了实现该目标,需要在自己的挂载命名空间中运用每个应用程序。这样做能生效的原因,是每个挂载命名空间内都有系统上任意目录的独立副本。
图15.2展示了一个抽象的例子,两个应用运行在相同的主机上,并且同时使用443端口。每个Web服务应用都运行在自己的网络命名空间之内。
Linux Docker现在利用了下列内核命名空间。
进程ID(PID)。
网络(NET)。
文件系统/挂载(MNT)。
进程内通信(IPC)。
用户(USER)。
UTS。
下面会简要介绍每种技术都做了些什么。但重要的是要理解,Docker容器是由各种命名空间组合而成的
。再次强调一遍,Docker容器本质就是命名空间的有组织集合
。
图15.2 两个应用运行在相同主机并同时使用443端口
例如,每个容器都由自己的PID、NET、MNT、IPC、UTS构成,还可能包括USER命名空间。这些命名空间有机的组合就是所谓的容器。图15.3展示了两个运行在相同Linux主机上的容器。
图15.3 两个容器运行在相同的Linux主机上
接下来简要介绍一下Docker是如何使用每个命名空间的。
进程ID命名空间:Docker使用
PID
命名空间为每个容器提供互相独立的容器树。每个容器都拥有自己的进程树,意味着每个容器都有自己的PID为1的进程。PID命名空间也意味着容器不能看到其他容器的进程树,或者其所在主机的进程树。网络命名空间:Docker使用
NET
命名空间为每个容器提供互相隔离的网络栈。网络栈中包括接口、ID地址、端口地址以及路由表。例如,每个容器都有自己的eth0网络接口,并且有自己独立的IP和端口地址。挂载点命名空间:每个容器都有互相隔离的根目录
/
。这意味着每个容器都有自己的/etc
、/var
、/dev
等目录。容器内的进程不能访问Linux主机上的目录,或者其他容器的目录,只能访问自己容器的独立挂载命名空间。进程内通信命名空间:Docker使用
IPC
命名空间在容器内提供共享内存。IPC
提供的共享内存在不同容器间也是互相独立的。用户命名空间:Docker允许用户使用
USER
命名空间将容器内用户映射到Linux主机不同的用户上。常见的例子就是将容器内的root
用户映射到Linux主机的非root用户上。用户命名空间对于Docker来说还属于新生事物且非必选项。该部分内容在未来可能出现改变。UTS命名空间:Docker使用
UTS
命名空间为每个容器提供自己的主机名称。
如图15.4所示,容器本质就是命名空间的有机组合!
图15.4 容器是命名空间的有机组合
2.Control Group
如果说命名空间用于隔离,那么控制组就是用于限额。
假设容器就是酒店中的房间。每个容器间都是互相独立的,但是每个房间都共享一部分公共资源,比如供应水电、共享游泳池、共享健身、共享早餐餐吧等。CGroup允许用户设置一些限制(以酒店作为类比)来保证不会存在单一容器占用全部的公共资源,如用光全部水或者吃光早餐餐吧的全部食物。
抛开酒店的例子,在Docker的世界中,容器之间是互相隔离的,但却共享OS资源,比如CPU、RAM以及硬盘I/O。CGroup允许用户设置限制,这样单个容器就不能占用主机全部的CPU、RAM或者存储I/O资源了。
3.Capability
以root身份运行容器不是什么好主意,root拥有全部的权限,因此很危险。但是,如果以非root身份在后台运行容器的话,非root用户缺少权限,处处受限。所以用户需要一种技术,能选择容器运行所需的root用户权限。了解一下Capability!
在底层,Linux root用户是由许多能力组成的。其中一部分包括以下几点。
CAP_CHOWN
:允许用户修改文件所有权。CAP_NET_BIND_SERVICE
:允许用户将socket绑定到系统端口号。CAP_SETUID
:允许用户提升进程优先级。CAP_SYS_BOOT
:允许用户重启系统。
Docker采用Capability机制来实现用户在以root身份运行容器的同时,还能移除非必须的root能力。如果容器运行只需要root的绑定系统网络端口号的能力,则用户可以在启动容器的同时移除全部root能力,然后再将CAP_NET_BIND_SERVICE能力添加回来。
4.MAC
Docker采用主流Linux MAC技术,例如AppArmor以及SELinux。
基于用户的Linux发行版本,Docker对新容器增加了默认的AppArmor配置文件。根据Docker文档的描述,默认配置文件提供了“适度的保护,同时还能兼容大部分应用”。
Docker允许用户在启动容器的时候不设置相应策略,还允许用户根据需求自己配置合适的策略。
5.Seccomp
Docker使用过滤模式下的Seccomp来限制容器对宿主机内核发起的系统调用。
按照Docker的安全理念,每个新容器都会设置默认的Seccomp配置,文件中设置了合理的默认值。这样做是为了在不影响应用兼容性的前提下,提供适度的安全保障。
用户同样可以自定义Seccomp配置,同时也可以通过向Docker传递指定参数,使Docker启动时不设置任何Seccomp配置。
6.Linux安全技术总结
Docker基本支持所有的Linux重要安全技术,同时对其进行封装并赋予合理的默认值,这在保证了安全的同时也避免了过多的限制,如图15.5所示。
图15.5 Docker支持Linux重要安全技术
自定义设置某些安全技术会非常复杂,因为这需要用户深入理解安全技术的运作原理,同时还要了解Linux内核的工作机制。希望这些技术在未来能够简化配置的过程,但就现阶段而言,使用Docker在对安全技术的封装中提供的默认值是很不错的选择。
本文摘自正在热销的技术书[《深入浅出Docker》](https://item.jd.com/12564378.html?dist=jd "《深入浅出Docker》")
Nigel,Poulton(奈吉尔·波尔顿) 著,李瑞丰,刘康
Docker技术入门与实践指南教程
容器与容器云解析,帮助您快速建立Docker技术知识体系
Docker认证工程师实用指南
《深入浅出Docker》由Docker概览和Docker技术两部分组成,遵循简介—详解—命令的章节布局,全面系统地剖析Docker的基本原理与实践应用。清晰详细的操作步骤结合大量的实际代码,为读者切实入门Docker保驾护航。
本文转载自异步社区
原文链接:https://www.epubit.com/articleDetails?id=N79e58b85-4f47-4631-a70b-4ad17d0f076e
- 点赞
- 收藏
- 关注作者
评论(0)