干货 | Docker中用到的主要Linux安全技术有哪些?

网友投稿 497 2022-05-29

干货 | 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保驾护航。

本文转载自异步社区

架构设计

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:昇思MindSpore全场景AI框架 1.6版本,更高的开发效率,更好地服务开发者
下一篇:深度学习入门,keras实现回归模型
相关文章