linux的lsm--简单高效并且周到(机制和策略)

晨曦之光 发布于 2012/04/10 15:00
阅读 753
收藏 0

lsm是linux可加载的安全模块,它非常简单,这个机制又一次体现了linux内核的高度可定制特性,它的效率很高,不会带来很大的开销,这一切归功于内核考虑的周到以及内核架构的高级
如果你了解linux的netfilter,你是否会十分崇拜它的设计者呢,反正我真的很惊叹,深深地挖掘一下内核会发现有一个类似的东西更加全面的做了和netfilter相似的事情,这就是lsm,关于lsm具体的事情比如接口,编程规范本文不谈,本文还是谈它的架构思想。
     lsm框架实现了一个机制,这个机制实现的很纯粹,很简单,几乎可以说是linux内核当中最简单的机制了,这个机制下你可以实现自己的策略,根据这个自 己实现的策略你可以进行安全验证,安全管理等等工作,这个机制之所以简单是因为它的设计者几乎罗列了任何可能出现安全问题的地方,然后在这些地方安插钩子,并且这些钩子的实现定义为回调函数,而这些回调函数就是用户自己可以实现的策略了,这点和netfilter类似,但是范围却比netfilter广 泛的多。netfilter框架考虑的仅仅是网络情况,比如在哪些地方安放钩子,其实也就那几个地方,像路由前,路由后,发送前,发送后等等之类的,可是在一般情况下,出现安全问题的地方可就多了去了,比如读写文件,挂载文件系统等等,幸运的是,lsm的作者已经将钩子安放好了,我们要做的仅仅是实现它们,为何要用这种方式实现安全策略呢?比如读写文件,我们完全可以在lkm中直接拦截sys_read/sys_write啊,其实那是可以的,而且比 lsm范围更广,更具有一般性,但是那不是标准的做法而只是黑客的做法,试想当前内核导出了sys_read函数,如果下一个版本不再导出该函数了,那么 模块就要大改,改用扫描内存的方式进行黑客式的操作,用lsm就不同了,接口是标准的,非常好用,最重要的是,接口非常稳定。我在想有那么一天,lsm经过进一步改进以后,netfilter也可以融入进来,这样内核就更加紧凑了,不会是这里一个钩子那里一个钩子。
我们来看看简单的文件过滤,比如我想保护一些文件,我该怎么办呢?很简单,先看看:

ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)

{

...

                 ret = security_file_permission (file, MAY_WRITE);

                 if (!ret) {

                         if (file->f_op->write)

                                 ret = file->f_op->write(file, buf, count, pos);

...

}

static inline int security_file_permission (struct file *file, int mask)

{

         return security_ops->file_permission (file, mask);

}

这样的话,我们只要提供一个security_operations就可以了,然后实现file_permission函数,在file_permission当中实现自己的策略,就这么简单,简单的让人不敢相信。


原文链接:http://blog.csdn.net/dog250/article/details/5303643
加载中
返回顶部
顶部