作为一种通用的操作系统,Linux内核提供了很多基础性的支持机制,以这些机制为基础,可以开发出各种类型的服务程序,满足用户各种类型的需求。为了应对日益严峻的安全形势,Linux也提供了一些安全支持机制,如身份认证框架、访问控制框架、报文过滤框架、数据变换算法管理框架、地址空间随机化等,利用这些安全机制,可开发出不同种类的安全程序,为用户提供不同类型的安全服务,如身份认证、强制访问、防火墙、加密通信、加密存储等,以提升系统的安全性。除专用的安全机制之外,Linux中的另一些支持机制,如虚拟化、名字空间、容器等,虽不是专门为安全设计的,但也可用于服务系统或服务程序的安全开发,也能提升系统的安全,其中最具代表性的是名字空间机制。名字空间(Namespace)是名字的集合。在操作系统中,名字用于标识对象。在早期的版本中,Linux所管理的对象大都用全局的名字或ID号标识,如用于标识用户的UID、GID,用于标识进程的PID,用于标识IPC对象的KEY和ID号,用于标识文件的路径名,用于标识网络协议栈的网络设备名、IP地址、路由表等。全局的对象名可以被系统中的所有进程看到,且各进程看到的名字都是一样的,因而由全局名字所标识的对象也可以被所有的进程访问到。这种全局的、单一的名字空间机制简化了设计,但也带来了安全风险,恶意进程能比较方便地探测、访问系统中的对象,并可通过对对象状态的篡改影响其他进程的运行。为了解决单一名字空间的问题,从Linux 2.4.19版开始,陆续引入了多种名字空间机制,试图限制各对象名字的可见范围,将全局的名字转化成局部的名字,进而将全局的对象转化成局部的对象,将全局的资源转化成局部的资源。目前的Linux已提供了7种名字空间机制。USER名字空间用于封装进程可见的用户标识,如UID、GID等,实现用户的局部化。UTS名字空间用于封装进程可见的系统名,如主机名、机器名、域名、操作系统名、版本号等,实现系统平台的局部化。MNT名字空间用于封装进程可见的文件系 统实体名,如文件路径名,实现文件系统结构的局部化。PID名字空间用于封装进程可见的进程名,如PID,实现进程的局部化。IPC名字空间用于封装进程可见的IPC对象名(Key)与ID号,实现IPC对象的局部化。NET名字空间用于封装进程可见的网络实体名,如网络设备名、协议地址、路由表、防火墙规则等,实现网络协议栈的局部化。CGROUP名字空间用于封装进程可见的控制群名,实现控制群的局部化。加上已经局部化的处理器和虚拟内存,Linux已实现了绝大部分对象或资源的局部化。在引入名字空间之后,Linux系统中的所有进程全都运行在名字空间之中。利用目前提供的7类名字空间机制,Linux已可为进程营造出一个虚拟的、相对封闭的运行环境,称为容器(Container)。名字空间是构造容器的基础。事实上,Linux中的容器仅是一个虚的概念,并不存在称为容器的实体,7类不同的名字空间实例合在一起就是一个容器,或者说一个容器就是位于7类特定名字空间中的一组进程。以名字空间为基础,可以构造出各种形状、各种尺寸、各种寿命的容器。基于名字空间的容器技术可用于弥合软件开发与部署之间的鸿沟,改变软件开发、交付和运行的方式,降低开发与运维人员之间沟通的复杂性,协助开发出更为强健的软件,提高软件的可靠性、移植性和可扩展性等,是最热门的技术之一。目前已涌现出了一大批相关产品,如Docker、Kubernets、CoreOS、Mesos、RancherOS等。然而,基于名字空间的容器技术还可用于提升软件的安全性。事实上,名字空间和基于名字空间的容器是进程的一种封装方式,或者说是封装在一起的一组进程。与进程组相比,容器具有更好的安全特性,如具有更好的独立性、封装性、隔离性等,而且容器的构建方式灵活,资源消耗量少,启动速度快,也适合于构建更加安全的软件运行环境或开发更加安全的软件。本书深入分析Linux中各名字空间机制的组成结构与工作机理,探讨利用名字空间机制开发安全应用程序、构建安全运行环境的方法。全书由11章组成。第1章综述Linux操作系统的组成结构,包括内核各个主要子系统的结构及工作机理,并介绍后面各章节将要用到的主要接口函数。第2章分析Linux提供的常规安全机制,包括通用的身份认证框架PAM、基于UID和权能的访问控制方法、通用的访问控制框架LSM和报文过滤框架Netfilter、算法管理框架Crypto API和基于Crypto API的加密通信与加密存储方法、随机化方法、虚拟化方法等。第3章概述Linux的名字空间管理结构,讨论proc文件系统中的名字空间管理文件,介绍名字空间管理函数和管理命令的使用方法,并给出几个应用实例。第4章从UID和GID入手,全面分析USER名字空间机制的组成结构和工作机理,探讨USER名字空间对进程权能、进程证书的影响,并介绍USER名字空间接口文件。第5章分析UTS名字空间的组成结构和工作机理,给出两个应用实例。第6章从Linux文件系统的目录树、安装树、共享子树入手,全面分析MNT名字空间的组成结构和工作机理,讨论MNT名字空间对文件路径名的影响,介绍MNT名字空间接口文件,并给出若干应用实例。第7章从进程PID号入手,全面分析PID名字空间的组成结构和工作机理,讨论PID名字空间对进程ID号的影响,介绍PID名字空间接口文件,探讨PID名字空间中的进程运作方式,并给出若干应用实例。第8章讨论System V和POSIX的进程间通信(IPC)机制,分析IPC名字空间的组成结构和工作机理,介绍IPC名字空间接口文件,并给出若干应用实例。第9章概述网络协议栈的结构,较为全面地讨论协议栈管理参数、协议栈和防火墙管理命令,全面分析NET名字空间的组成结构和工作机理,介绍NET名字空间管理命令和接口文件,并给出若干管理实例。第10章从进程与资源入手,较为全面地分析控制群树、限定树的组成结构与工作机理,讨论进程与控制群之间的关系,介绍CGROUP的几个主要子系统的使用方法,探讨CGROUP名字空间的组成结构。第11章概述名字空间的安全特性,给出一种基于名字空间的动态服务程序框架,并以一个程序实例以验证其可行性。本书的主要内容来源于Linux内核源代码和Linux操作系统自带的文档,如man手册,是对作者多年教学与科研工作的总结,可作为容器开发与维护人员、安全程序设计人员的参考书,也可用于研究生课程的教材。本书内容翔实,所有实例都在Ubuntu Linux系统中验证通过。本书的写作过程中得到了信息工程大学网络空间安全学院及教研室领导与同事们的支持,得到了课程组、实验室同行的帮助,在此一并表示感谢。由于作者水平有限,书中难免有错误和不当之处,敬请读者批评指正。联系地址:guoyd2@163.com。