linux缺省的安全等级是0,如果将其升到1,就可以一定程度上提高系统的安全性.安全等级为1的时候,它会禁止修改ex2fs系统中文件的immutable和append-only位,同时禁止装入/移除module.所以我们可以先用chattr +i <file>将大部分的可执行文件,动态连接库,一些重要的系统文件(.netd.conf,securetty,hosts.allow,hosts.deny,rc.d下的启动script...)加上immutable位,这样"黑客"就很难在你的机器上放置木马和留后门了.
(即便他已经得到了root权限,当然通过直接硬盘读写仍然可以修改,但比较麻烦而且危险).
"黑客"们一旦进入系统获得root,首先会清除系统的记录文件.你可以给一些系统记录文件(wtmp,messages,syslog...)增加append-only位,使"黑客"不能轻易的修改它们.要抓他们就容易多了.:-)
修改安全等级比较直接的办法是直接修改内核源码.将linux/kernel/sched.c中的
securelevel设成1即可.不过如果要改变安全等级的话需要重新编译内核,我太懒,不想那么麻烦.:-)
为什么不用module呢?我写了个很简单的lkm和一个client程序来完成安全等级的切换.
方法: insmod lkm; clt -h;
注意:普通用户也可以执行clt来切换安全等级,所以最好是在clt和lkm中加段密码检查,如果密码不对就不允许执行.:-)
这两个程序在redhat 5.2(2.0.36)下编译运行通过.对于2.2.x的内核,securelevel变成了securebits,简单的将它改到1,会连setuid()都被禁止了,这样普通用户就不能登陆了.如果谁对2.2.x比较熟悉,请不吝赐教,共同提高嘛.:)
<在测试这些程序以前,请备份重要数据.本人不为运行此程序带来的任何损失负责.>
(一旦securelevel=1,kernel将不允许装入modlue,所以你的kerneld可能不能正常工作,而且禁止你访问/dev/kmem,所以有些用到svgalib的程序也不能正常工作,象zgv什么的。不过这本来就是安全隐患,所以不工作就不工作好了,呵呵)
(关于chattr,lsaddr请man chattr和man lsattr)
warning3@hotmail.com
/**************************** lkm.c ********************************/
/* simple lkm to secure linux.
* this module can be used to change the securelevel of linux.
* running the client will switch the securelevel.
*
* gcc -o3 -wall -c lkm.c
* insmod lkm
*
* it is tested in redhat 5.2 (2.0.36).
* (it should be modified if you want to run it in 2.2.x kernel).
* it is really very simple,but we just for educational purposes.:-)
*
* warning3@hotmail.com
*/
#define module
#define __kernel__
#include <linux/config.h>
#include <linux/module.h>
#include <linux/version.h>
#include <linux/errno.h>
#include <linux/types.h>
#include <linux/fs.h>
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/proc_fs.h>
#include <asm/segment.h>
#include <asm/unistd.h>
#include <linux/dirent.h>
#include <asm/unistd.h>
#include <linux/sockios.h>
#include <linux/if.h>
#define __nr_secureswitch 250
extern void *sys_call_table[];
int sys_secureswitch(int secure)
{
if(secure==0) securelevel=0;
if(secure==1) securelevel=1;
return securelevel;
}
int init_module(void)
{
sys_call_table[__nr_secureswitch] = (void *)sys_secureswitch;
return 0;
}
void cleanup_module(void)
{
sys_call_table[__nr_secureswitch] = null;
return;
}
/************************ clt.c **************************/
/*
* this client can switch the secure level of linux.
*
* gcc -o3 -wall -o clt clt.c
* usage: clt -h/-l
* -h switch to the high secure level.
* -l switch to the low secure level.
*
* most of codes are ripped from smiler@tasam.com,thanks smiler.:)
* warning3@hotmail.com
*/
#include <asm/unistd.h>
#include <stdio.h>
#include <errno.h>
#define __nr_secureswitch 250
static inline _syscall1(int, secureswitch, int, command);
int main(int argc,char **argv)
{
int ret,level = 0;
if (argc < 2)
{
fprintf(stderr,"usage: %s [-h/-l]n",argv[0]);
exit(-1);
}
if (argv[1][1] == h) level++;
else if (argv[1][1] != l)
{
fprintf(stderr,"usage: %s [-h/-l]n",argv[0]);
exit(-1);
}
ret = secureswitch(level);
if (ret < 0)
printf("hmmm...it seemed that our lkm hasn been loaded.;-)n");
else {
if (ret == 0) {
puts("now the secure level is changed to 0!n");
} else {
puts("now the secure level is chagned to 1!n");
}
}
return(1);
}
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器