当前位置:Linux教程 - Linux - LIDS精通与进阶--七、LIDS在内核中的安全级别

LIDS精通与进阶--七、LIDS在内核中的安全级别

冰块


一些时候,我们需要改变保护系统的配置。那样我们该怎么做呢?LIDS给我们提供了两种方法。


我们可以重新启动系统,在LILO:里键入security=0.


我们可以在用lidsadm –S中用密码来转换安全级别。
1、在内核中的两个安全级别

LIDS在内核中定义了两个安全级别,安全的security和无安全的none_security.默认情况下,是设置成安全的级别。如果你需要改变它。就在启动的时候键入security=0.


在内核中有一个全局变量lids_load。它表明是否lids的安全变量security被开启。它默认是1。如果在系统启动的时候在LILO:键入security=0 ,所有的LIDS的保护都会失效,就象那些没有LIDS保护的系统一样。


/* variant defined in fs/lids.c */

int lids_reload_conf=0;

int lids_load=0; /* it is raised to 1 when kernel boot */

int lids_local_on=1;

int lids_local_pid=0;

/* in init/main.c */

#ifdef CONFIG_LIDS

/*

* lids_setup , read lids info from the kernel.

*/

static void __init lids_setup(char *str, int *ints)

{

if (ints[0] > 0 && ints[1] >= 0)

====> _lids_load= ints[1];

}

#endif

....

/* init the LIDS when the system bootup up */

static void __init do_basic_setup(void)

{

......

/* Mount the root filesystem.. */

mount_root();

#ifdef CONFIG_LIDS

/* init the ids file system */

---> lids_load=_lids_load;

lids_local_on=_lids_load;

lids_flags=lids_load * (LIDS_FLAGS_LIDS_ON | LIDS_FLAGS_LIDS_LOCAL_ON);

===> printk(""Linux Intrusion Detection System %s n"",lids_load==1?""starts"":""stops"");

init_vfs_security();

#endif

......

}


在系统启动的时候,你可以看到”Linux Intrusion Detection System 0.9 starts”,表明LIDS的保护开启了。当保护停止的时候,你可以看到”Linux Intrusion Detection System 0.9 stops”。这里的0.9是当前的LIDS版本号。

2、用lidsadm来改变系统安全级别

一些时候,有也可以在线的时候改变你的安全级别,你必须把CONFIG_LIDS_ALLOW_SWITCH功能开启。并且在编译前配置内核的时候提供一个RipeMD-160 encrypted password 。

这个密码可以用lidsadm –p 命令来获得

用内核鉴定

用提供的密码,LIDS可以鉴定用户来区分哪个用户可以转换内核的安全级别。

这个功能也要用到lidsadm的-S参数。如。

# /sbin/lidsadm -S -- -LIDS

SWITCH

Password:xxxxxx

#

在输入密码后,我们就可以转换LIDS的安全关闭。

让我们看看内部的编码来了解它是如何工作的,

/* in the fs/lids.c lids_proc_locks_sysctl() */

int lids_proc_locks_sysctl(ctl_table *table, int write, struct file *filp,

void *buffer, size_t *lenp, int conv, int op)

{

lids_locks_t locks;

byte hashcode[RMDsize/8];

char rmd160sig[170];

.......

locks.passwd[sizeof(passwd_t)-1]=0; /* We don''t take the risk */

rmd160sig[0]=0;

#ifdef CONFIG_LIDS_ALLOW_SWITCH

if ((!lids_first_time) || (locks.passwd[0])) {

RMD((byte *)locks.passwd,hashcode);

memset((char *)locks.passwd,'''',sizeof(passwd_t));

for (i=0; i
sprintf(rmd160sig+2*i,""%02x"", hashcode[i]);

}

if ( ((lids_first_time) && (!locks.passwd[0])) ||

----------> (!strncmp(rmd160sig,CONFIG_LIDS_RMD160_PASSWD,160)) ) {

#else

if ((lids_first_time) && (!locks.passwd[0])) {

#endif

/* access granted ! */

number_failed=0;

if (lids_process_flags(locks.flags)) {

cap_bset=locks.cap_bset;

lids_security_alert(""Changed: cap_bset=0x%x lids_flags=0x%x"",cap_t(cap_bset),lids_flags);

}

lids_first_time=0;

}

........

}

在密码检查正确后。Lids_process_flag()就会改变当前的lids标记为关闭状态,然后你就可以在不受保护的系统做你想要做的事情了。你可以看看fs/lids.c的lids_process_flag的代码来了解它。

转换LIDS和LIDA_GLOBAL

如果你把LIDS的保护关闭,你会有两个结果,一,关闭后其它没有被LIDS保护的控制台一样不受保护,二,可以本地的关闭它们,在其它的控制台,所有的系统依然被LIDS保护。它们一样很安全。

这些细节是fs/lids的lids_process_flag()来实现。