Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1995864
  • 博文数量: 1647
  • 博客积分: 80000
  • 博客等级: 元帅
  • 技术积分: 9980
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 15:15
文章分类

全部博文(1647)

文章存档

2011年(1)

2008年(1646)

我的朋友

分类:

2008-10-28 18:34:27


  七、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 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()来实现。
  
  八、内核的网络安全
  
  
  用LIDS,你可以用下面的功能来保护你的网络。
  
  1、保护和的规则
  
  如果你的主机包含一些规则。你可以用LIDS来保护它们。你可以开启
  
  CONFIG_LIDS_ALLOW_CHANGE_ROUTESLAI 实现这个功能。你也必须在密封内核的时候关闭CAP_NET_ADMIN。
  
  然后,你也可以允许程序更改路由规则。
  
  让我们来看看保护防火墙规则的代码吧。每一个改变防火墙的请求都会调用内核的ip_setsockopt()函数。
  
  int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int optlen)
  
  {
  
  ........
  
  switch(optname)
  
  {
  
  .......
  
  case IP_FW_DELETE_NUM:
  
  case IP_FW_INSERT:
  
  case IP_FW_FLUSH:
  
  case IP_FW_ZERO:
  
  case IP_FW_CHECK:
  
  case IP_FW_CREATECHAIN:
  
  case IP_FW_DELETECHAIN:
  
  case IP_FW_POLICY:
  
  #ifdef CONFIG_LIDS_ALLOW_CHANGE_ROUTES
  
  if (!(capable(CAP_NET_ADMIN) || (current->flags & PF_CHROUTES))) {
  
  #else
  
  if (!capable(CAP_NET_ADMIN)) {
  
  #endif
  
  #ifdef CONFIG_LIDS
  
  lids_security_alert("CAP_NET_ADMIN violation: try to change IP firewall rules with option %d",optname);
  
  #endif
  
  return -EACCES;
  
  }
  
  ........
  
  从上面的代码,我们可以看到如果有人要改变防火墙的规则,你必须把CAP_NET_ADMIN开启,并且你要修改规则的程序必须用routing_changeable来标记。
  
  2、禁止嗅探
  
  这个功能也是在上面的changing_route来实现的。让我们来看看net/core/dev.c的代码。
  
  int dev_ioctl(unsigned int cmd, void *arg)
  
  {
  
  ........
  
  switch(cmd)
  
  {
  
  ........
  
  case SIOCSIFMETRIC:
  
  case SIOCSIFMTU:
  
  case SIOCSIFMAP:
  
  case SIOCSIFHWADDR:
  
  case SIOCSIFSLAVE:
  
  case SIOCADDMULTI:
  
  case SIOCDELMULTI:
  
  case SIOCSIFHWBROADCAST:
  
  case SIOCSIFTXQLEN:
  
  case SIOCSIFNAME:
  
  #ifdef CONFIG_LIDS_ALLOW_CHANGE_ROUTES
  
  if (!(capable(CAP_NET_ADMIN) || (current->flags & PF_CHROUTES))) {
  
  #else
  
  if (!capable(CAP_NET_ADMIN)) {
  
  #endif
  
  #ifdef CONFIG_LIDS
  
  lids_security_alert("CAP_NET_ADMIN violation: ioctl SIOC #%i",cmd);
  
  #endif
  
  return -EPERM;
  
  .........
  
  你能发现,如果你要为嗅探改变状态的话, 你必须让CAP_NET_ADMIN开启来实现这个功能。你可以在内核密封前启动CAP_NET_ADMIN,然后在内核密封后禁止它。
  
  3、内核的检测端口扫描的功能
  
  为什么要在内核里需要一个端口扫描的检测?
  
  因为一个端口扫描的时候能检测到半连接的扫描。所以,端口扫描检测需要作为一个嗅探的程序来运行。如果我们需要检测端口扫描。我们又要开启允许嗅探程序的运行,
【责编:admin】

--------------------next---------------------

阅读(348) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~