3.实现方法介绍:对Linux内核的修改

Linux安全模块(LSM)目前作为一个Linux内核补丁的形式实现。其本身不提供任何具体的安全策略,而是提供了一个通用的基础体系给安全模块,由安全模块来实现具体的安全策略。其主要在五个方面对Linux内核进行了修改:

在特定的内核数据结构中加入了安全域

在内核源代码中不同的关键点插入了对安全钩子函数的调用

加入了一个通用的安全系统调用

提供了函数允许内核模块注册为安全模块或者注销

将capabilities逻辑的大部分移植为一个可选的安全模块

下面对这五个方面的修改逐个做简要的介绍。

安全域是一个void*类型的指针,它使得安全模块把安全信息和内核内部对象联系起来。下面列出被修改加入了安全域的内核数据结构,以及各自所代表的内核内部对象:

task_struct结构:代表任务(进程)

linux_binprm结构:代表程序

super_block结构:代表文件系统

inode结构:代表管道,文件,或者Socket套接字

file结构:代表打开的文件

sk_buff结构:代表网络缓冲区(包)

net_device结构:代表网络设备

kern_ipc_perm结构:代表Semaphore信号,共享内存段,或者消息队列

msg_msg:代表单个的消息

另外,msg_msg结构,msg_queue结构,shmid_kernel结构被移到include/linux/msg.h和include/linux/shm.h这两个头文件中,使得安全模块可以使用这些定义。

Linux安全模块(LSM)提供了两类对安全钩子函数的调用:一类管理内核对象的安全域,另一类仲裁对这些内核对象的访问。对安全钩子函数的调用通过钩子来实现,钩子是全局表security_ops中的函数指针,这个全局表的类型是security_operations结构,这个结构定义在include/linux/security.h这个头文件中,这个结构中包含了按照内核对象或内核子系统分组的钩子组成的子结构,以及一些用于系统操作的顶层钩子。在内核源代码中很容易找到对钩子函数的调用:其前缀是security_ops->。对钩子函数的详细说明留到后面。

Linux安全模块(LSM)提供了一个通用的安全系统调用,允许安全模块为安全相关的应用编写新的系统调用,其风格类似于原有的Linux系统调用socketcall(),是一个多路的系统调用。这个系统调用为security(),其参数为(unsigned int id, unsigned int call, unsigned long *args),其中id代表模块描述符,call代表调用描述符,args代表参数列表。这个系统调用缺省的提供了一个sys_security()入口函数:其简单的以参数调用sys_security()钩子函数。如果安全模块不提供新的系统调用,就可以定义返回-ENOSYS的sys_security()钩子函数,但是大多数安全模块都可以自己定义这个系统调用的实现。

在内核引导的过程中,Linux安全模块(LSM)框架被初始化为一系列的虚拟钩子函数,以实现传统的UNIX超级用户机制。当加载一个安全模块时,必须使用register_security()函数向Linux安全模块(LSM)框架注册这个安全模块:这个函数将设置全局表security_ops,使其指向这个安全模块的钩子函数指针,从而使内核向这个安全模块询问访问控制决策。一旦一个安全模块被加载,就成为系统的安全策略决策中心,而不会被后面的register_security()函数覆盖,直到这个安全模块被使用unregister_security()函数向框架注销:这简单的将钩子函数替换为缺省值,系统回到UNIX超级用户机制。另外,Linux安全模块(LSM)框架还提供了函数mod_reg_security()和函数mod_unreg_security(),使其后的安全模块可以向已经第一个注册的主模块注册和注销,但其策略实现由主模块决定:是提供某种策略来实现模块堆栈从而支持模块功能合成,还是简单的返回错误值以忽略其后的安全模块。这些函数都提供在内核源代码文件security/security.c中。

Linux内核现在对POSIX.1e capabilities的一个子集提供支持。Linux安全模块(LSM)设计的一个需求就是把这个功能移植为一个可选的安全模块。POSIX.1e capabilities提供了划分传统超级用户特权并赋给特定的进程的功能。Linux安全模块(LSM)保留了用来在内核中执行capability检查的现存的capable()接口,但把capable()函数简化为一个Linux安全模块(LSM)钩子函数的包装,从而允许在安全模块中实现任何需要的逻辑。Linux安全模块(LSM)还保留了task_struck结构中的进程capability集(一个简单的位向量),而并没有把它移到安全域中去。Linux内核对capabilities的支持还包括两个系统调用:capset()和capget()。Linux安全模块(LSM)同样保留了这些系统调用但将其替换为对钩子函数的调用,使其基本上可以通过security()系统调用来重新实现。Linux安全模块(LSM)已经开发并且移植了相当部分的capabilities逻辑到一个capabilities安全模块中,但内核中仍然保留了很多原有capabilities的残余。这些实现方法都最大程度的减少了对Linux内核的修改影响,并且最大程度保留了对原有使用capabilities的应用程序的支持,同时满足了设计的功能需求。以后要使capabilities模块完全独立,剩下要做的主要步骤是:把位向量移到task_struct结构中合适的安全域中,以及重新定位系统调用接口。

linux内核安全模块,对Linux内核的修改 - Linux 安全模块(LSM)简介_Linux安全_Linux公社-Linux系统门户网站...相关推荐

  1. 外网主机访问虚拟机下的Web服务器_服务器应用_Linux公社-Linux系统门户网站

    外网主机访问虚拟机下的Web服务器_服务器应用_Linux公社-Linux系统门户网站 之前在CentOS虚拟机上安装了LAMP,搭建起了自己的web服务器,具体流程见: http://www.lin ...

  2. s5pv210 linux内核移植,简单根文件系统制作 - S5PV210 Linux3.8.3内核移植_Linux编程_Linux公社-Linux系统门户网站...

    1.这里为什么选nfs文件系统呢? 在产品开发阶段,因为nfs根文件系统并不需要编译进内核,方便调试. 2.制作根文件系统需要用到BusyBox 解压进入busybox目录: root@linuxid ...

  3. win驱动移植linux,LCD移植 - 基于Tiny210v2的Linux-3.9.6内核驱动移植_Linux编程_Linux公社-Linux系统门户网站...

    友善的tiny210v2我买的是7寸电容屏,具体型号得再查查,说是S70. 用原本的LINUX内的SMDKV210的LCD驱动能实现LINUX LOGO的输出,但是有一定的偏差. 主要参考: arm9 ...

  4. 2440 linux文件写,添加yaffs2文件系统 - Linux2.6.39在S3C2440上的移植_Linux编程_Linux公社-Linux系统门户网站...

    1.主机环境:VMare下Ubuntu10.04 ,1G内存. 2.编译编译环境:arm-linux-gcc 3.开发板:Micro2440,2M nor flash,256M nand flash. ...

  5. linux软路由关闭超线程,结论 - Linux 软路由性能测试及分析[图文]_Linux教程_Linux公社-Linux系统门户网站...

    6.结论 软路由的 CPU.内存处理速度已经远远超过网络卡和 PCI 总线速度:在百兆以太网中软路由数据报转发速度仅决定于网络卡的线速度.笔者曾用赛扬450MHZ 的 CPU,256M 的旧机器架构, ...

  6. 幼儿linux教程,新增20多种小游戏 - 专为3岁儿童设计的Ubuntu 10.10应用体验_Linux教程_Linux公社-Linux系统门户网站...

    新增20多种小游戏 也许是开发者觉得儿童最喜欢的就是游戏了,所以集成了20多种游戏,包括:贪吃蛇.俄罗斯方块.对对碰.国际象棋.黑白棋以及十几种逻辑等. 游戏 其中,在逻辑游戏中,有一款gbralny ...

  7. apache1.3 php编译,安装Apache1.3.29 - Linux+Apache+Mysql+PHP典型配置详解_Linux教程_Linux公社-Linux系统门户网站...

    2.安装Apache1.3.29. 我没有选择安装Apache2.0是我对他还是不放心,因为网上最新公布的apache的漏洞基本上是针对2.0,当然大家可以自己选择安装相应的版本.我这里讲的都是采用D ...

  8. 显示驱动包含在Linux内核层,驱动程序层(上) - Linux内核--网络栈实现分析_Linux编程_Linux公社-Linux系统门户网站...

    经过前面两篇博文的分析,已经对Linux的内核网络栈的结构有了一个模糊的认识,这里我们开始从底层开始详细分析Linux内核网络栈的实现.由于这是早期版本,代码的层次隔离做的还不是很好,这里说是从底层分 ...

  9. 给linux内核传递数组,数组与指针 - Linux C编程实战之路_Linux编程_Linux公社-Linux系统门户网站...

    谈到C语言编程,数组和指针是很多人的心头大石,总觉得它们是重点难点,重点是没错的,但绝不是什么难点,要说C语言的难点,客观地讲应该是带参宏,而数组和指针,概念浅显易懂,操作简洁方便,根本不是很多初学者 ...

  10. linux内核添加usb键盘驱动,配置USB外设 - linux-2.6.32在mini2440开发板上移植_Linux编程_Linux公社-Linux系统门户网站...

    linux-2.6.32在mini2440开发板上移植 配置USB外设 [日期:2013-04-08] 来源:Linux社区 作者:ssdsafsdsd [字体:大 中 小] 编者:因为LINUX内核 ...

最新文章

  1. 制作模拟器和真机通用静态库
  2. 2018个人写作计划~
  3. html radio 默认图片替换_html,css_如何更改radio、checkbox选项框背景图?,html,css - phpStudy...
  4. C/C++【顺序表】【初始化、赋值、打印、取值、查找、插入、删除、销毁、综合举例】
  5. 孔子、老子、墨子,春秋时期的三位人杰,谁更厉害?
  6. 那些侵占我碎片时间的“强盗”
  7. 利用openpyxl,Python对excel读写文件
  8. HTTP Header 详解【转】
  9. 压缩数据库扩展名为.ldf的日志文件
  10. 泛微oa java 源码_FineReport和泛微OA(Ecology)的单点登录集成方案
  11. 群体遗传进化专题之选择性清除分析
  12. 计算机画图星星怎么画,教你尺规作图画五角星!
  13. c语言中合法整型常量负号,C语言中整型常量的表示方法
  14. jmeter基础之MD5加密
  15. 对javaWeb理解
  16. Android8.0未知来源应用安装权限
  17. python从列表中随机抽取n个元素
  18. 我的世界java史莱姆生成条件_关于我的世界史莱姆的生成条件分析介绍
  19. Python基础教学5:第一阶段知识复习
  20. WinCE下GPRS自动拨号软件(GPRS AutoDial)

热门文章

  1. 自立,霸者的生存之道
  2. 给datagrid模板页里面的控件动态赋值
  3. mybatis-plus 自定义UpdateWrapper(一)实现列自增
  4. 计算机操作系统应用,.计算机操作系统应用技巧 (转
  5. mysql关键字 distinct去重
  6. Serial垃圾回收器总结
  7. SpringBoot整合RabbitMQ之Topic Exchange通配符交换机(学习总结)
  8. Spring依赖注入@Autowired原理解析(一)之寻找需要注入的属性
  9. Ubuntu下多个gcc版本之间的切换
  10. 【思路】Gym - 101173F - Free Figurines