在企业级的Linux应用中,进程是整个计算机系统的一个主体,它需要通过一定的安全等级来对客体(包括系统中的文件、数据、设备等)发生作用。进程在一定条件下可以对诸如文件、数据库等客体进行操作。如果进程用作其他不法用途,将给系统带来重大危害。在当前形形色色的面向Linux系统的攻击中,许多网络黑客都是通过种植“木马”的办法来达到破坏计算机系统和入侵的目的,而这些“木马”程序无一例外的是需要通过进程这一方式在系统中运行才能发挥作用的。
作为服务器中占绝大多数市场份额的Linux系统,要切实保证计算机系统的安全,我们必须对其进程进行安全管理。
Linux进程管理的方法主要包括:(1)确定并综合分析系统中当前运行进程的状态及信息,包括内存、CPU、执行用户身份、进程ID等,以确定其是否合法以及状态是否正常;(2)事先限制进程所占用的系统资源,如文件系统资源和派生进程数目等,以合理控制进程的运行状况。下面将对这些手段进行详细介绍。
一、管理手段一:使用基本命令进行进程查看
传统的方法可以通过Linux系统的一些基本命令进行Linux系统的进程查看和分析。Linux系统提供了who、w、ps和top等察看进程信息的系统调用,安全工作者可以通过结合使用这些系统调用,清晰地了解进程的运行状态以及存活情况,从而采取相应的措施,来确保Linux系统的安全。
其中,who命令主要用于查看当前在线上的用户情况。系统管理员可以使用who命令监视每个登录的用户此时此刻的所作所为;w命令也用于显示登录到系统的用户情况,但是与who不同的是,w命令功能更加强大,它不但可以显示有谁登录到系统,还可以显示出这些用户当前正在进行的工作,w命令是who命令的一个增强版;ps和top命令则是最基本同时也是非常强大的进程查看命令。使用这些命令可以动态和静态地确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。
举个例子,黑客在入侵系统后通过植入一些系统本没有的非法进程来留作“后门”,以达到下次使用该系统资源或者利用该系统作为“肉鸡”发动拒绝服务等来攻击其他目标主机的目的,而我们就可以结合上述命令来找出异常进程。
二、管理手段二:使用进程文件系统进行管理
管理手段一中所使用的命令行方式对Linux系统中的进程管理比较粗略和不全面,如果要进行全面地管理,可以借助进程文件系统(即PROC文件系统)来获取系统中运行进程所占用的内存、CPU、中断、命令行等情况,以辅助安全管理员进行恶意进程的发现和排查。
PROC文件系统是一个虚拟的文件系统,通过文件系统的接口实现,用于输出系统的运行状态。它以文件系统的形式,为操作系统本身和应用进程之间的通信提供了一个界面,使应用程序能够安全、方便地获得系统当前的运行状况和内核的内部数据信息,并可以修改某些系统的配置信息。另外,由于PROC以文件系统的接口实现,因此用户可以像访问普通文件一样对其进行访问,但它只存在于内存之中,并不存在于真正的物理磁盘当中。所以,当系统重启和电源关闭的时候,该系统中的数据和信息将全部消失。
表1说明了该文件系统中一些重要的文件和目录。
文件或目录 | 说 明 |
/proc/1 | 关于进程1的信息目录。每个进程在/proc下有一个名为其进程号的目录 |
/proc/cpuinfo | 处理器信息,如类型、制造商、型号和性能 |
/proc/devices | 当前运行的核心配置的设备驱动的列表 |
/proc/dma | 显示当前使用的DMA通道 |
/proc/filesystems | 核心配置的文件系统 |
/proc/interrupts | 显示使用的中断 |
/proc/ioports | 当前使用的I/O端口 |
/proc/kcore | 系统物理内存映像 |
/proc/kmsg | 核心输出的消息,也被送到syslog |
/proc/ksyms | 核心符号表 |
/proc/loadavg | 系统的平均负载 |
/proc/meminfo | 存储器使用信息,包括物理内存和swap |
/proc/modules | 当前加载了哪些核心模块 |
/proc/net | 网络协议状态信息 |
/proc/stat | 系统的不同状态 |
/proc/version | 核心版本 |
/proc/uptime | 系统启动的时间长度 |
/proc/cmdline | 命令行参数 |
表1 重要的PROC文件系统文件和目录
下面举个简单的例子,说明安全管理员如何来全面查看系统中一个运行进程的相关信息。
(1)进程的基本信息都会存放在/proc文件系统中,具体位置是在/proc目录下。通过使用如下命令可以查看系统中运行进程的相关信息,如图1所示,其中显示为系统中运行进程的信息所存放的目录,每个进程对应一个目录,3193为例子使用的进程的详细信息所在目录:
图1 /ls/proc命令显示结果
(2)切换到3193目录,以方便详细的查看进程信息,并列出进程详细的状态信息文件,如图2所示:
图2 进程3193信息所在目录
(3)在这些文件当中,status这个状态文件是比较重要的,包含了很多关于进程的有用的信息,用户可以从这个文件获得信息,如下所示:
其中,比较重要的字段详细含义如下:
Name: scientific_comp //进程名
State: R (running) //进程运行状态
Tgid: 3193 //进程组ID
Pid: 3193 //进程ID
PPid: 3123 //父进程ID
TracerPid: 0 //跟踪调试进程ID
Uid: 6004 6004 6004 6004 //进程所对应程序的UID
Gid: 6004 6004 6004 6004 //进程所对应程序的GID
FDSize: 256 //进程使用文件句柄大小
Groups: 6004 //组信息
这样,安全管理员就可以通过进程名、进程ID、父进程ID、UID、GID等信息来综合判定系统中进程的合法状态,以捕捉非法进程,并进行后续处理。
三、管理手段三:限制进程使用的资源
在系统使用过程中,一些用户编写的进程可能无意识地创建一些大型的文件或者派生(fork)过多地进程,从而过度消耗系统资源,引起系统的不稳定。同时,一些病毒也可能有派生多个进程的行为出现,如臭名昭著的“震荡波”病毒。这些都使得我们有必要来限制进程使用的资源,保证系统安全。
为了防止进程或者其子进程创建大型文件,可以使用ulimit命令来进行限制,具体的命令使用ulimit –f后接以K字节为单位指定的最大文件尺寸。图3举出了一个具体的例子加以说明。在该例子中,首先采用ulimit命令限制当前shell进程可以创建的文件大小;然后,采用yes命令不断写入大量的字符串到test.txt文件中,该文件大小超过了ulimit命令许可的范围,结果系统提示文件超过了大小,并终止了yes命令的不断写入过程。从后面使用ls命令来查看test.txt文件的大小来看,ulimit命令很好地将该文件大小限制在20KB的范围之内。
图3 ulimit命令使用示意
在实际的使用过程中,用户可以降低自身的限制值,但是不能增加限制值。并且,只有root用户才能在/etc/profile文件中增加ulimit选项的设置。因此,图4中所示的增加自身限制值大小的操作是被禁止的;反之,图5种所示的root用户的操作就是允许的(请读者注意图4和图5中使用不同的用户进行操作)。
图4 不允许非root用户增加ulimit值
图5 允许root用户增加ulimit值
另外,值得注意的是:虽然能够采用ulimit值来限制进程创建文件的大小,但是该机制并不能保证用户创建多个相同大小的文件。比如,ulimit的限制值是20KB,那么该机制只能限制进程创建的单个文件大小不能超过20KB,而不能限制进程创建10个甚至100个20KB大小的文件。
Ulimit命令还可以用来限制单个用户(父进程)所能调用的最大子进程个数,以避免某个父进程由于无所限制的创建子进程而造成整个系统崩溃。
图6给出了一个使用ulimit命令限制子进程无限调用的例子。首先,使用脚本编辑来自动生成进程;然后,使用ulimit命令来限制父进程调用的最大子进程个数为8。最后,可以看到当创建到第9个时,系统报错并阻断子进程的再度调用。
图6 使用ulimit限制单个用户调用的最大进程个数