您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > Linux安全性增强的研究
安全性增强的研究曲晓明,孟哲武汉理工大学信息工程学院,湖北武汉(430063)E-mail:ming8729@sohu.com摘要:本文主要是基于LSM(LinuxSystemModul)框架对Linux系统在文件系统、进程管理、内核保护、网络系统等几个方面进行安全性增强。关键词:Linux系统,安全性,模块,增强1.概述现有的Linux系统存在的安全性问题主要有以下几点:1、超级用户权限过大root用户的权限不受任何限制,而且能够通过重新设置capability来绕过系统内部已经存在的capability的限制2、文件容易被修改例如,黑客可以通过上传修改过的login程序到/bin目录下,避开登录口令的保护。3、内核模块对内核的影响过大内核模块机制能够使Linux更加模块化和灵活,但是一旦内核模块插入内核后,它就成为内核的一部分,能够像内核一样发挥功效。一些不友好的代码可以通过模块进入内核,它们甚至可以重定向所有的系统调用。4、进程不受保护很多重要的守护进程例如webServer缺乏严格的保护,很容易受到黑客攻击。下面就几个主要方面来介绍各自安全性的增强方法。2.对文件系统的安全性增强为文件/目录定义了6种访问控制权限,可以按比特位组合使用:#defineACL_DENY0/*拒绝访问*/#defineACL_READONLY1/*只读*/#defineACL_APPEND2/*只追加,用于可执行文件*/#defineACL_WRITE4/*设备写保护*/#defineACL_IGNORE8/*忽略保护措施*/#defineACL_CAP16/*按照capability权限进行保护*/基于这6种权限,我们为文件增加了动态的保护功能。因为对文件的访问都是通过Linux的基本运行单元-进程进行的,所以我们对进程的文件访问权限进行了限制。在task_struct的安全域中设置了指向进程安全结构的指针,该安全结构如下[1]:structsys_acl{kdev_tdev;/*主设备号*/unsignedlongintino;/*主节点号*/unsignedlongflags;/*capabilityflags*/structsec_capcap[32];/*inheritablearray*/intforked;/*是否子进程*/[PORT_ITEM][2];/*网络端口访问控制*/structfile_acl*file_acl;/*文件访问控制指针*/};其中的文件访问控制file_acl结构定义如下:structfile_acl{structfile_acl*next;unsignedlongintino;kdev_tdev;inttype;/*READWRITEAPPENDDENY等权限*/intinherit;/*继承级别*/time_ttime[TIME_ITEM][2];/*访问时间限制*/};系统初始化时,根据配置文件建立一个全局数组:structsys_acls_acl[CONFIG_MAX_SACL]除了6种访问控制权限以外,我们还为文件设置了访问时间控制,在file_acl结构中的time二维数组中设置。该数组可设置TIME_ITEM个访问时间区段。我们还考虑到了访问控制权限的可继承性。当file_acl中的inherit被置位时,子进程可以继承父进程的访问控制权限。Inherit的值代表可被继承的次数,每次被继承时都减一。在通过exec生成进程的时候,我们都要先对当前进程的访问控制进行处理,让新进程继承相应的访问控制权限,然后在根据可执行文件获得相应的访问控制权限。我们在所有重要的文件操作钩子中都增加了文件的增强访问控制。对文件的增强访问控制主要通过一个访问控制函数来实现:intfile_check_acl(structdentry*base,inttype)/*base是被访问的文件的目录项对象结构指针,type是访问类型*/{structfile_acl*acl;structdentry*parent;structinode*inode;time_tcurrenttime;if(base==NULL||current-security==NULL)return-EPERM;inode=base-d_inode;/*获取索引节点指针*/parent=base-d_parent;/*获取父目录指针*/if(parent==NULL)/*孤儿进程,禁止其对文件的访问*/return-EPERM;if(inode==NULL){inode=parent-d_inode;parent=parent-d_parent;}/*该索引节点为空,改为检查进程对其父目录的访问控制权限*/currenttime=CURRENT_TIME;/*CURRENT_TIME宏定义用来获取系统当前时钟*/do{acl=(structsys_acl*current-security)-file_acl;while(acl!=NULL){(acl-ino==inode-i_ino&&acl-dev==inode-i_dev){return(type&acl-type&&acl_time_checker(currenttime%(60*60*24),acl-time))?0:-EPERM;}acl=acl-next;}/*遍历访问控制链表,查找进程对该文件/目录是否有相应的访问权限*/inode=parent-d_inode;/*进程的访问控制列表不含该文件/目录,查找进程对该文件的父目录是否有相应的访问权限*/}while(((parent=parent-d_parent)!=NULL));return-1;}如果进程不含有对该文件/目录或父目录的访问控制项,则视为拒绝访问。从而实现力度较强的访问控制。以下为file_check_acl在一些重要地方的调用示例:1、在可执行程序运行总入口do_execve(char*filename,char**argv,char**envp,structpt_regs*regs)中的调用示例:…file=open_exec(filename);if(IS_ERR(file))returnretval;dentry=file-f_dentry;/*检查当前进程是否可以执行该文件*/if(file_check_acl(dentry,ACL_APPEND)){/*不可执行*/…}else{/*可执行*/…}…2、inode_unlink钩子中的调用示例:if(file_check_acl(dentry,ACL_WRITE)){security_alert_log(Attempttounlink%.1024s,dentry-d_iname);return-EPERM;}3、inode_symlink钩子中的调用示例:if(file_check_acl(dentry,ACL_WRITE)){security_alert_log(Attempttosymlink%.1024s,dentry-d_iname);return-EPERM;}4、inode_mkdir钩子中的调用示例:if(file_check_acl(dentry,ACL_WRITE)){security_alert_log(Attempttomkdir%.1024s,dentry-d_iname);return-EPERM;}、inode_rmdir钩子中的调用示例:if(file_check_acl(dentry,ACL_WRITE)){security_alert_log(Attempttormdir%.1024s,dentry-d_iname);return-EPERM;}6、inode_mknod钩子中的调用示例:if(file_check_acl(dentry,ACL_WRITE)){security_alert_log(Attempttomknod%.1024s,dentry-d_iname);return-EPERM;}7、inode_rename钩子中的调用示例:if(file_check_acl(old_dentry,ACL_WRITE)){security_alert_log(Attempttorenamefrom%.1024s”,old_dentry-d_iname);return-EPERM;}if(file_check_acl(new_dentry,ACL_WRITE)){security_alert_log(Attempttorenameto%.1024s,new_dentry-d_inamreturn-EPERM;}8、inode_readlink钩子中的调用示例:if(file_check_acl(dentry,ACL_READONLY)){security_alert_log(Attempttoreadlink%.1024s,dentry-d_iname);return-EPERM;}9、inode_follow_link钩子中的调用示例:if(file_check_acl(dentry,ACL_READONLY)){security_alert_log(Attempttofollowlink%.1024s,dentry-d_iname);return-EPERM;}10、inode_setattr钩子中的调用示例:if(file_check_acl(dentry,ACL_WRITE)){security_alert_log(Attempttofchmod%stomode%o,dentry-d_iname,iattr-ia_mode);return-EPERM;}11、file_permission钩子中的调用示例:#defineMAY_EXEC1#defineMAY_WRITE2#defineMAY_READ4#defineMAY_APPEND8if(mask&MAY_APPEND){error=file_check_acl(file-f_dentry,ACL_APPEND);if(error){security_alert_log(Attempttoopen%.1024sappending,mask=%d,);error=-EPERM;}}elseif(mask&MAY_WRITE){error=file_check_acl(file-f_dentry,ACL_WRITE);if(error){security_alert_log(Attempttoopen%.1024sforwriting,mask=%d,file-f_dentry-d_iname,mask);error=-EPERM;}}elseif((mask&MAY_EXEC)){error=file_check_acl(file-f_dentry,ACL_READONLY);if(error){security_alert_log(Attempttoforreading.1024s,mask=%d,file-f_dentry-d_iname,mask);error=-ENOENT;}}3.对进程的安全性增强我们主要通过限制对进程的随意删除来增强进程的安全性。我们定义了一个全局数组和一个全局变量:pid_tprotected_pid[MAX_PROTECTED_PIDS]/*被保护的进程*/inttotal_protecte
本文标题:Linux安全性增强的研究
链接地址:https://www.777doc.com/doc-1249897 .html