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

举报
G-washington 发表于 2019/09/04 17:59:21 2019/09/04
【摘要】 在本节中会对Docker中用到的主要Linux技术进行简要介绍,包括namespace、Control Group、Capability、MAC、Seccomp和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容器本质就是命名空间的有组织集合

图片.png


图15.2 两个应用运行在相同主机并同时使用443端口


例如,每个容器都由自己的PID、NET、MNT、IPC、UTS构成,还可能包括USER命名空间。这些命名空间有机的组合就是所谓的容器。图15.3展示了两个运行在相同Linux主机上的容器。

图片.png

图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所示,容器本质就是命名空间的有机组合!

图片.png

图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所示。

图片.png

图15.5 Docker支持Linux重要安全技术

自定义设置某些安全技术会非常复杂,因为这需要用户深入理解安全技术的运作原理,同时还要了解Linux内核的工作机制。希望这些技术在未来能够简化配置的过程,但就现阶段而言,使用Docker在对安全技术的封装中提供的默认值是很不错的选择。


本文摘自正在热销的技术书[《深入浅出Docker》](https://item.jd.com/12564378.html?dist=jd "《深入浅出Docker》")

Nigel,Poulton(奈吉尔·波尔顿) 著,李瑞丰,刘康

                                                                   图片.png

Docker技术入门与实践指南教程

容器与容器云解析,帮助您快速建立Docker技术知识体系

Docker认证工程师实用指南

《深入浅出Docker》由Docker概览和Docker技术两部分组成,遵循简介—详解—命令的章节布局,全面系统地剖析Docker的基本原理与实践应用。清晰详细的操作步骤结合大量的实际代码,为读者切实入门Docker保驾护航。


本文转载自异步社区

原文链接:https://www.epubit.com/articleDetails?id=N79e58b85-4f47-4631-a70b-4ad17d0f076e


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。