热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

linux下的入侵监测系统LIDS原理(1)

上次我发布的linux下的入侵监测系统LIDS的时候很忙,也很乱,可能大家看不出什么东西。现在我正慢慢整理其他资料。现在有一部分写完,先给大家看看,以后我会陆续发表的。一.入侵随着internet上的linux主机的增加,越来越多

上次我发布的linux下的入侵监测系统LIDS的时候很忙,也很乱,可能大家看不出什么东西。现在我正慢慢整理其他资料。现在有一部分写完,先给大家看看,以后我会陆续发表的。

  一. 入侵

  随着internet上的linux主机的增加,越来越多的安全漏洞在当前的GNU/linux系统上发现。你也许在internet上听说过 在linux下发现bug,它会导致系统很容易的被黑客攻击。

  因为linux是一个开放代码的系统,漏洞很容易发现,并且也会很快的有补丁出来。但是当漏洞没有公布的时候,并且管理员很懒,没有去打补丁。黑客就会很容易的攻击这个系统,取得root权限,在现有的GNU/linux下,他就可以做任何他想做的事情。现在你可以问,我们现在到底可以做些什么呢?

  1. 1现在的GNU/linux错误在哪里?

  l 超级用户会滥用职权,他能够做所有他要做的事情。作为root。他会改变所有的东西。

  l 许多系统文件很容易被更改。这些文件可能是很重要的文件,如/bin/login,如果一个黑客进入,他可以上传一个login程序来覆盖/bin/login,这样他就可以不用登陆名和密码来登陆系统。但是这些文件不需要经常改动,除非你要升级系统。

  l 模块modules很容易用来中断内核。模块是为了让linux内核更模块话和更高效而设计的。但是当模块加入到内核,它就会成为内核的一部分并且能做原始内核能做的工作。因此,一些不友好的代码可以写成模块来加入到内核里,这些代码就会重定向系统调用并且作为一个病毒来运行。

  l 进程是不受保护的,一些进程,如后台的web服务器,一直都认为是没有严格保护的程序。因此,他们就会很容易被黑客攻击。

  1. 2 LIDS的设想是什么。

  l 保护重要文件。因为文件很容易被root更改,为什么不严格文件操作呢?因此,LIDS改变了文件系统在内核里的安全系统调用。如果某个时候一些人访问一个文件,他就会进入系统调用然后我们就可以检查文件名并且看她们是否被保护。如果它已经被保护,我们就可以拒绝这个访问者的要求。

  l 保护重要的进程。这个和上面的保护进程的想法不是一样的。当一个系统里运行一个进程,它会在/proc 文件系统里有一个用pid作为路径名的入口。所以,如果你用“ps ?axf”你就可以显示出当前运行的进程。你可以问如果保护这些进程。如果你要杀死一个进程的话,首先,你键入“ps”来得到进程的PID,然后,你键入“kill 〈pid〉”来杀死它。但是,如果我不让你看到进程,你怎么来杀死这个进程呢?因此,LIDS是用隐藏进程来保护它的。

  另外一个重要的方法就是不让任何人可以杀死进程,包括root用户。LIDS能够保护父进程是init(pid=1)的所有进程 。

  l 封装内核。有时候我们需要要把一些必要的模块加入到内核里来使用,另外,我们也要拒绝任何人包括root用户向内核插入模块。那么如何来平衡这个矛盾的问题呢?我们可以只允许在系统启动的时候插入模块,然后我们封装模块,在封装后,内核不允许任何人插入模块到内核里。通过这种封装功能,我们能用它来保护重要的文件,进程,我们可以在系统启动的时候只允许必要的进程,只改变必要的文件。在封装内核后,我们就不能在对文件有任何的修改。

  二,保护文件系统

  2.1 保护文件系统是LIDS的重要功能之一。这个功能是在内核的VFS(虚拟文件系统)层实现的,我们可以保护任何种类的文件系统,如EXT2,FAT。

  在LIDS,保护的文件按种类分为以下几种:

  l 只读的文件或目录。只读文件意味着它们不被允许改写,如,在目录/usr/bin,/sbin。这些类型的文件大多数都是二进制系统程序或是系统配置文件,除了在升级系统的时候,我们不需要改变它们。

  l 只可增加文件或目录。这些文件是那些只可以增加大小的文件。大多数是系统的日值文件,如在/var/log里的只可增加文件。

  l 额外的文件或目录,这些文件没有被保护。一般来说,你想要保护目录下的所有文件,但是,还需要有一些特殊的文件不要被保护。所以我们可以定义这些文件作为额外的其他的只读文件。

  l 保护挂载或卸载文件系统。当你在启动的时候挂载文件系统的时候,你可以禁止所有人,甚至是root,去卸载文件系统。你也可以禁止任何人在当前文件系统下挂载文件系统来覆盖它。

  2.2 LIDS如何在内核保护文件

  在这部分,我们会看到一些内核的代码来理解LIDS是如何保护文件的。

  Linux文件系统数据结构程序

  首先,我们必须了解linux的虚拟文件系统。

  在linux里的每一个文件,不管是什么样子的,都有一个结点inode数,文件系统提供了以下数据结构。

  在/usr/src/linux/include/linux/fs.h

  struct inode {

  struct list_head i_hash;

  struct list_head i_list;

  struct list_head i_dentry;

  unsigned long i_ino; ----> inode number.

  unsigned int i_count;

  kdev_t i_dev; ----> device number.

  umode_t i_mode;

  nlink_t i_nlink;

  uid_t i_uid;

  ......

  }

  注意: 用来鉴定一个结点inode。这个意思是你可以用一对 来得到一个系统里独一无二的inode。

  在/ur/src/linux/cinclude/linux/dcache.h里

  struct dentry {

  int d_count;

  unsigned int d_flags;

  struct inode * d_inode; /* Where the name belongs to - NULL is negative */

  struct dentry * d_parent; /* parent directory */

  struct dentry * d_mounts; /* mount information */

  struct dentry * d_covers;

  struct list_head d_hash; /* lookup hash list */

  struct list_head d_lru; /* d_count = 0 LRU list */

  struct list_head d_child; /* child of parent list */

  struct list_head d_subdirs; /* our

  ......

  }

  dentry是一个目录文件的入口。通过这个入口,我们可以很容易的在文件的父目录下移动。

  例如,如果你一文件的inode是(struct inode*)file_inode,如果你可以用file_inode->d_entry来得到它的目录入口并且用file_inode->d_entry->d_parent来得到父目录的目录入口。

  LIDS保护数据结构。

  在分析完linux文件系统后,让我们来看看LIDS是如何容VFS来保护文件和目录的。

  在/usr/src/linux/fs/lids.c

  struct secure_ino {

  unsigned long int ino; /* the inode number */

  kdev_t dev; /* the dev number */

  int type; /* the file type */

  };

  上面的结构用一对 来存储保护文件或目录的结点。“type”是用来标明保护结点文件类型的。

  LIDS有4种类型

  在/usr/src/linux/include/linux/fs.h

  #define LIDS_APPEND 1 /* APPEND ONLY FILE */

  #define LIDS_READONLY 2 /* Read Only File */

  #define LIDS_DEVICE 3 /* Protect MBR Writing to device */

  #define LIDS_IGNORE 4 /* Ignore the protection */

  通过secure_ino结构,我们能很容易的初使化保护的文件或是在内核里执行以下函数。

  在/usr/src/linux/fs/lids.c

  int lids_add_inode(unsigned long int inode ,kdev_t dev , int type)

  {

  if ( last_secure == (LIDS_MAX_INODE-1))

  return 0;

  secure[last_secure].ino = inode;

  secure[last_secure].dev = dev;

  secure[last_secure].type = type;

  secure[++last_secure].ino = 0;

  #ifdef VFS_SECURITY_DEBUG

  printk("lids_add_inode : return %dn",last_secure);

  #endif

  return last_secure;

  }

  就象你在上面代码上可以看到的,给secure_ino加到一个结点上是非常容易的。被保护的结点会在系统启动的时候初使化。初使化程序在/usr/src/linux/fs/lids.c的init_vfs_security()里。

  现在,让我们看看LIDS是如何来检查是否一个结点已经受到保护。

  在/usr/src/linux/fs/open.c

  int do_truncate(struct dentry *dentry, unsigned long length)

  {

  struct inode *inode = dentry->d_inode;

  int error;

  struct iattr newattrs;

  /* Not pretty: "inode->i_size" shouldnt really be "off_t". But it is. */

  if ((off_t) length <0)

  return -EINVAL;

  #ifdef CONFIG_LIDS

  if (lids_load && lids_local_load) {

  error = lids_check_base(dentry,LIDS_READONLY);

  if (error) {

  lids_security_alert("Try to truncate a protected file (dev %d %d,inode %ld)",

  MAJOR(dentry->d_inode->i_dev),

  MINOR(dentry->d_inode->i_dev),

  dentry->d_inode->i_ino);

  .....................

  这个是LIDS加到内核里做检测的一个例子。你会看到lids_check_base()是LIDS保护方法的一个核心函数。

  你可以在LIDS要保护的地方看到很多LIDS保护方法用到lids_check_base()函数,特别是在linux

推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • 如何修改路由器密码?路由器登录密码和无线密码的修改方法
    本文介绍了修改路由器密码的两种方法:一是修改路由器登录口令,需要进入路由器后台进行操作;二是修改无线连接密码,通过进入路由器后台的无线设置和无线安全设置进行修改。详细步骤包括复位处理、登录路由器后台、选择系统工具、填入用户名和用户密码、保存修改等。 ... [详细]
  • 本文介绍了2019年上半年内蒙古计算机软考考试的报名通知和考试时间。考试报名时间为3月1日至3月23日,考试时间为2019年5月25日。考试分为高级、中级和初级三个级别,涵盖了多个专业资格。报名采取网上报名和网上缴费的方式进行,报考人员可登录内蒙古人事考试信息网进行报名。详细内容请点击查看。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
author-avatar
多米音乐_35780104
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有