怎么做木马网站,站长工具收录,wordpress比价插件,咖啡网站建设市场分析本文讲述 SELinux 保护安全的基本原理 首发公号#xff1a;Rand_cs
安全检查顺序
不废话#xff0c;直接先来看张图 当我们执行系统调用的时候#xff0c;会首先对某些错误情况进行检查#xff0c;如果失败通常会得到一些 error 信息#xff0c;通过查看全局变量 errno …本文讲述 SELinux 保护安全的基本原理 首发公号Rand_cs
安全检查顺序
不废话直接先来看张图 当我们执行系统调用的时候会首先对某些错误情况进行检查如果失败通常会得到一些 error 信息通过查看全局变量 errno 可以知道到底是哪一类错误
随后进行 DAC 检查简单理解就是 Linux 里面 rwx 那一套检查逻辑如果检查失败通常会得到类似 permission denied 的信息
再之后便会进行 MAC 检查在这里就是进行 SELinux 的检查它会根据当前主体和客体的类型查询策略检查是否允许当前类型的主体访问客体检查失败的话则也是会得到类似 permission denied 的信息
以上检查都通过则该调用执行成功。
何时检查
从上图可以知道是在 LSM Hook 点出执行的 SELinux 检查大家可能对 LSM 概念比较陌生。LSM 全称 Linux Security Module但其实并不是一个模块而是一个安全框架为安全模块提供的一个安全框架。
Linux 源码目录中有个 security 的目录其下的子目录比如说 apparmorselinux 等等就是目前 Linux 支持的一些安全模块。此系列文章主要就是讨论其中的一个安全模块 SELinux。
LSM 框架提供的服务之一就是在内核中的关键处埋下了许多 hook 点在看内核代码的时候你应该会经常发现类似 security_xxx 的函数这就是 LSM Hook 点。
举个例子经典的调用 open 打开一个文件其简化版的调用路径如下所示
open
-------sys_opendo_filp_openpath_openatdo_openvfs_opendo_dentry_opensecurity_file_openerror security_file_open(f);if (error)goto cleanup_all;其中 security_file_open 就是 open 系统调用的一个 LSM Hook 点当执行到此处的时候它会执行所有挂在此hook点上的安全检查函数如果 SELinux 使能那么便会执行 selinux_file_open 函数来检查当前的进程(主体)是否被允许打开文件(客体)。
这一步还不止一个安全检查函数是的这取决于当前系统使能了多少个 LSM 安全模块如果使能了 ABC 三个安全模块那么每到 security_xxx hook 点便会将 A、B、C 对应的安全检查函数启动顺序全都执行一遍。每一个检查都通过才算最终通过如果这一步检查不过可以看出直接就返回了。
如何检查 这是 SELinux 在内核中的一个极简的架构图当需要权限检查的时候首先去访问 AVC(Access Vector Cache)从名称当中就可以看出它是存放权限访问的一个 cache如果能从 AVC 里面直接查询到是否允许访问的结果那么将查询结果返回。
如果 AVC 中没有相关权限访问的结果则去 Security Server 查找Security Server 会去查询策略然后将查询的结果存储到 AVC再将结果返回。
所以 SELinux 的权限检查主要就是这么一个逻辑哈我们从头用一个例子来捋一捋比如说 p_t 类型的 P 进程想要打开 f_t 类型的 F 文件这期间会进行的安全检查
首先检查是否有逻辑错误存在比如说 F 文件不存在然后进行 DAC 检查当前进程有效id和文件属主id比较等等操作进入 security_file_open 这个 LSM hook 点执行每一个使能的安全模块对应的 xxx_file_open 函数来进行安全检查。 执行 selinux_file_open 函数来执行 SELinux 权限检查首先查找 AVC查询 p_t 对 f_t 类型的文件是否有 open 权限如果 AVC 中有记录将结果返回如果 AVC 中没有记录Security Server 查询策略库将查询结果写到 AVC然后将结果返回
以上检查都通过基本上 open 系统调用就成功了如果第一步失败则可以从 errno 找到错误原因如果后面的 DAC 和 MAC 权限检查失败通常则会出现 permission denied 的提示
好了本文就先到这里有什么问题欢迎来讨论交流 首发公号Rand_cs