第3章Linux操作系统的攻防
作为类UNIX操作系统家族中的一员,Linux操作系统已经成为服务器应用领域的**。相较于Windows操作系统,Linux在很多方面都具有一定的优势,尤其在**方面。由于Linux的开源性,其**漏洞的发现与补丁的发布效率都要比Windows系统高。然而,Linux并非一个****的操作系统,也存在大量的**漏洞,并且攻击者凭借其开源性可以从源码中发现更多的系统内核和开源软件的漏洞。本章将从网络攻防的角度介绍Linux操作系统的**机制、攻击技术及对应的防范方法。
3.1Linux操作系统的工作机制
Linux是源自于UNIX的开放源代码的多用户、多任务、支持多线程和多CPU的操作系统,主要应用于**性要求较高的服务器、网络设备和移动终端。
3.1.1Linux操作系统概述
Linux操作系统诞生于1991年,*初是由芬兰大学生Linus Torvalds为在Intel x86架构计算机上运行自由免费的类UNIX操作系统,而用C语言编写的开放源代码的操作系统。目前,Linux存在着许多不同的版本,主要包括Ubuntu、Fedora、RedHat、CentOS、OpenSUSE等,但不同版本都使用了相同的Linux内核。
Linux的基本思想是: 一切都是文件,即系统中包括命令、硬件和软件设备、进程等所有对象对于操作系统内核而言都被视为拥有各自特性或类型的文件。Linux是一款免费的操作��统,用户可以通过网络或其他途径免费获得,并可以根据需要对其源代码进行修改。目前,Linux可以运行在多种硬件平台上,如x86(32位和64位)、680x0、SPARC、Alpha等处理器的平台。此外,Linux还是一种嵌入式操作系统,可以运行在智能手机、机顶盒、路由器等设备上,如Google基于Linux内核开发了Android移动智能终端操作系统与开发环境。
Linux通过自带的防火墙、入侵检测和**认证等工具,可以及时发现和修复系统的漏洞,以提高系统的**性。在桌面应用中,Linux的用户数要少于Windows操作系统的用户,较少的用户群使专门针对Linux的恶意代码和渗透攻击要比Windows操作系统少。同时,Linux内核源代码是以标准规范的32位或64位计算机进行优化设计的,良好的稳定性使得一些安装了Linux的主机像UNIX主机一样可以常年不关机或宕机。在网络功能方面,Linux内置了免费网络服务器软件、数据库和Web开发工具,如Apache、Sendmail、SSH、MySQL、PHP、JSP、VSFTP等。丰富而强大的网络功能为用户提供了**可靠的网络服务,使得Linux成为**性、稳定性和可靠性要求较高的服务器操作系统的**。
3.1.2Linux操作系统的结构
Linux操作系统采用宏内核(monolithic kernel)架构,整个操作系统是一个运行在核心态的单一的进程文件,这个二进制文件包含进程管理、内存管理、文件管理等。而Linux的前身Minix采用的是微内核(Micro Kernel)架构,基于该架构的操作系统大部分都运行在单独的进程中,而且多数在内核之外,进程之间通过消息传递来通信,内核的任务是处理消息传递、中断处理、底层的进程管理及可能的I/O。
1. Linux操作系统的内核结构
如图31所示,从体系结构来看,Linux操作系统的体系架构分为用户态和内核态,也称为用户空间和内核。内核从本质上看是一种软件,用于控制计算机的硬件资源,并提供上层应用程序运行的环境。用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。为了使上层应用能够访问到这些资源,内核必须为上层应用提供访问的接口,即系统调用。系统调用是操作系统的*小功能单位,根据不同的应用场景可以进行扩展和裁剪,不同的Linux版本提供的系统调用数量各不相同。系统调用功能通过系统调用接口实现。
图31Linux操作系统内核结构
在Linux内核中,位于硬件抽象层中的各类设备驱动程序可以完全访问硬件设备,并以模块化形式进行设置,而且系统运行期间可以直接通过LKM(Loadable Kernel Module,可装载内核模块)机制装载或卸载。内核服务功能模块位于硬件抽象层之上,包括进程与线程管理、内存管理、文件系统管理、设备控制与网络5个子系统。这些内核服务功能模块通过系统调用接口向用户态的GNU运行库/工具、命令行Shell、X窗口及应用软件提供服务。
Shell是一个被称为“命令行”的特殊的应用程序,其实质是一个命令解释器,它负责将上层的各种应用与系统调用连接起来,以便让不同程序能够以一个清晰的接口协同工作,从而增强各个程序的功能。同时,Shell是可编程的,它可以执行符合Shell语法的文本,即Shell脚本。为了方便用户和系统交互,一般一个Shell对应一个终端,终端是一个硬件设备,呈现给用户的是一个图形化窗口,用户可以通过这个窗口输入或者输出文本,这个文本直接传递给Shell进行分析解释,然后执行。
2. Linux的工作机制
Linux操作系统在进程与线程管理、内存管理、文件系统管理、设备控制、网络、系统调用等方面都形成了特有的工作机制,掌握这些工作机制为全面学习Linux操作系统的功能及应用特点是非常有帮助的。
(1) 进程与线程管理。
进程是一个动态的概念,进程运行过程实际上是进程的一个生存周期,通常分为实际占用CPU的运行状态、进程可运行(但暂时挂起)的就绪状态和资源不可用的阻塞(中断)状态3种状态。线程可以理解为同一进程中相互独立执行的上下文,线程是“多任务”的进程。线程的概念较为适用于紧密耦合的一组处理流程。在传统进程的概念中,一个进程有一条执行线索,进程之间空间、时间独立,互不干扰。而线程在逻辑上是一个事务的不同线索,线索之间有着种种联系,可能是共享一段缓存或协调执行一组任务。
Linux内核采用抢占式多用户多进程(multiprocessing)模式。在该模式下,多个进程可并发活动,具体由内核进程管理模块负责调度并分配硬件资源。进程作为*基本的调度单元,维护着一个进程控制块(Processing Control Block,PCB)结构,由内核schedule()进程调度函数根据进程优先级和CPU、内存、外设等资源情况来选择进程的运行。
(2) 内存管理。
内存管理在操作系统中不仅非常重要,而且非常复杂。利用虚拟存储技术,Linux使得一个拥有有限内存资源的计算机可以为每个进程提供多达4GB的虚拟内存空间。其基本实现思路是通过进程映像和分页机制在内存和二级存储之间传送数据,以充分利用有限的内存资源。另外,Linux虚拟内存管理机制把用户空间和核心空间分开,这样不仅有效地保护了核心空间,各个进程之间也互不影响。
(3) 文件系统管理。
Linux使用了虚拟文件管理(Virtual File System,VFS)机制,从而使得它能够支持多种不同类型的逻辑文件系统(主要包括ext2/ext3/ext4、vfat、NTFS等),通过设备驱动程序访问特定硬件设备(如磁盘、打印机等)。而VFS为用户进程提供了一组通用的文件系统调用函数(如open、close、read、write等),可以对不同文件系统中的文件进行统一的操作。ext2/ext3/ext4是Linux中默认的文件系统格式,使用索引节点来记录文件信息,作用类似于Windows系统中的FAT32文件系统的目录项,包含了文件长度、创建及修改时间、权限、所属关系、磁盘中的位置等信息。
(4) 设备控制。
设备驱动程序(device driver)是操作系统中一种可以使计算机和设备进行通信的特殊软件。Linux抽象了设备的处理,它对所有的硬件设备都视为常规的文件来处理。Linux支持3种类型的硬件设备: 字符设备、块设备和网络设备。其中,字符设备直接读/写,没有提供缓冲区,如系统的串行端口/dev/cua0和/dev/cua1; 块设备只能按照一个块(一般是512字节或1024字节)的倍数进行读/写,块设备通过bcache(buffer cache)访问,进行随机存取; 网络设备则通过BSD(Berkeley Software Distribution,伯克利软件套件)Socket网络接口进行访问。大多数的设备驱动程序都采用LKM(Loadable Kernel Modules,可装载内核模块)机制,在需要的时候作为核心模块加载,在不需要的时候进行卸载,以提高对系统资源的利用率。
(5) 网络。
Linux中的网络模块提供了对各种网络标准的访问,并支持各种网络硬件设备。网络接口可以分为网络协议栈和网络驱动程序。其中,网络协议栈负责实现每一种可能的网络传输协议,包括网络接口层的协议(如以太网、PPP、SLIP等)、TCP/IP协议层,以及为上层网络应用提供的Socket接口,如图32所示。网络设备驱动程序负责与硬件设备之间的通信。
图32Linux操作系统的网络功能
Linux通过以上5种工作机制实现了操作系统基本的硬件管理和系统功能,这些功能模块全部运行在CPU的核心态。而应用程序运行在用户态,不能直接访问内存空间,也不能直接调用内核函数。Linux提供了系统调用接口,通过该接口应用程序可以访问硬件设备和其他系统资源,以增加系统的**性、稳定性和可靠性。同时,Linux为用户空间提供了一种统一的抽象接口,有助于应用程序的跨平台移植。
3.2Linux操作系统的**机制
与Windows操作系统类似,Linux同样通过身份认证、授权访问与**审计等机制来实现对系统的**管理。