旅途

如果想飞得高,就该把地平线忘掉

Linux安全攻略—僵尸进程


    好了,我现在让大家就看看我们神秘僵尸进程是什么样子的?下面我来用c写出父进程建立子进程的代码:
/**********************************子进程正常出生和灭亡过程****************************************/
#include <sys/types.h>
#include <unistd.h>
main()
{
   
    fork(); /*开始创建一个子进程*/

    if(fork()>0) /* 如果是父进程 */

       wait(NULL);    /* 收集僵尸进程 */
}

    大家看完代码后,就会觉得这个代码正是我刚才讲的进程一生是怎么样的,进程死后,一定要为他收尸,否则他就会编程僵尸进程。下面就让我们来看看未能把死去的进程收尸会变成什么样子?

/**********************************僵尸进程******zombie.c*****************************************************/

#include <sys/types.h>
#include <unistd.h>
main()
{

       fork(); /*开始创建一个子进程*/

    if(fork>0) /* 如果是父进程 */

       sleep(30);    /* 休眠30秒,这段时间里,父进程什么也干不了 */
       wait(NULL);    /* 收起僵尸进程 */

   /*因为父进程死了,子进程也得一起陪葬,那么我们就让父进程睡眠30秒,在这30秒内我们就可以看到僵尸进程。
     30秒过后,父进程醒来后就得死,所以到那时子进程也就死去。*/
}


/********************************************************************************************/

    为了让大家更清楚的看到僵尸进程我们把这个僵尸进程代码编译,然后执行,
#gcc -o zombie zombie.c

编译成功后我们开始执行这个程序因为代码里的sleep(30)是让父进程睡眠30秒,如果我们在前台执行我们这个程序,那么就不能执行其他shell命令了,所以这里我们在执行的命令后面加一个& 代表后台运行的意思。
#./zomber &

好了,我们在30秒内执行查看进程命令来看看我们这个zombie进程是什么样的?
#ps -aux |grep zombie

这个命令是显示有关zombie的所有信息。具体操作请看图(2)。

    看到这里后,聪明的朋友会问,既然子进程是由父进程创造出来的,那么如果一个父程序执行完退出后,子进程不管是不是僵尸进程也直接就退出了,因为父进程死 了嘛。那么这也不会造成多大危害啊?如果大家这么认为那可就错了,当我们刚才用ps命令观察进程的执行状态时,看到某些进程的状态栏为defunct,这 就是所谓的“僵尸”进程。“僵尸”进程是一个早已死亡的进程,但在进程表(processs table)中仍占了一个位置(slot)。由于进程表的容量是有限的,所以,defunct进程不仅占用系统的内存资源,影响系统的性能,而且如果其数 目太多,还会导致系统瘫痪,具体请看下面的代码:
/***********************************无限创建子进程********************************************/

#include <sys/types.h>
#include <unistd.h>
main()
{
       for (;;)  /*制作一个死循环*/
      
         fork(); /*开始创建一个子进程*/

}


/********************************************************************************************/

懂C语言的朋友会知道for(;;)是一个死循环。那么这仅有2行代码的程序就可以把你的linux瞬间死机,因为他的作用是无限制的在内存里增加新的子进程,一个系统根据内存的容量会分配进程的最大限制,一旦同时运行的进程数超符合,那么你的机器必然会死机。
   我这里分别用了2个用户进行测试过,一个是普通权限的用户,一个是Root用户,测试结果是“任何用户只要执行这个程序都会让机器死掉”。原因就是默认的 Linux系统没有对普通用户的使用最大进程进行限制。所以这样对系统造成很大一个威胁,那么我们如何避免普通用户非法执行过多资源或进程导致系统拖死, 所以我们的给除了Root的用户做一下限制。


对普通用户进行限制:

第1步:首先进到Linux终端用vi编辑/etc/security /limits.conf文件,在里面加入:

  * hard core 0
  * hard rss 5000
  * hard nproc 20
 
  这里的* 代表除了Root的所有用户,(* hard core 0) 是禁止core files“core 0”,(* hard rss 5000) 是限制内存使用为5MB“rss  5000”, (* hard nproc 20 )是限制进程数为“nproc 50“。大家可以根据自己系统内存大小进行合理配置。

第2步:用vi编辑/etc/pam.d/login文件,然后加上下面这行保存退出就可以。

  session required /lib/security/pam_limits.so

    好了,现在我们已经对普通用户限制了进程和内存使用极限,修改完配置以后大家可以用Root和普通用户分别进行测试,结果当然是普通用户执行完我们刚才做的程序不会死机了。

    一个系统的安全性不取决与打不打补丁,虽然打补丁很重要,但是对系统做出相应的配置也是相当重要的。

 

posted on 2007-08-01 00:07 旅途 阅读(342) 评论(0)  编辑 收藏 引用 所属分类: Linux开发


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理