如何查看SELinux策略模块中的具体规则?
如何查看SELinux策略模块中的具体规则?
我太懂你这种需求了——毕竟随便装个带SELinux模块的rpm,谁不想搞清楚里面到底藏了啥规则,会不会有风险?之前你试了semodule -l、seinfo、sesearch没找到方法,还踩了/var/lib/selinux下文件的坑,我来给你捋捋可行的办法:
方法一:从已加载的模块中导出规则
如果模块已经加载到系统里,你可以先把它导出成.pp包,再解压成可读的规则文件:
- 第一步,导出模块到临时.pp文件:
这里的semodule -X 100 -e 模块名 /tmp/模块名.pp-X 100是设置优先级,确保能正确导出(有些高优先级模块需要调整这个值) - 第二步,把.pp包解压成.mod文件:
semodule_unpackage /tmp/模块名.pp /tmp/模块名.mod - 第三步,把.mod转换成可读的TE(Type Enforcement)文件:
现在打开sedismod /tmp/模块名.mod > /tmp/模块名.te/tmp/模块名.te就能看到模块里的所有规则了!
方法二:直接从RPM包中提取模块并解析
如果模块是通过RPM安装的,你可以先把RPM里的.pp文件提取出来再处理:
- 先找到RPM里的.pp文件路径:
rpm -ql 你的RPM包名 | grep "\.pp" - 然后按照方法一的第二步、第三步,把.pp转成可读的TE文件就行。
为什么你之前看/var/lib/selinux里的文件不行?
你提到的/var/lib/selinux/<store>/active/modules/<priority>/<module_name>/hll文件,其实是SELinux编译模块时生成的缓存文件,不是原始的.pp包——它已经是编译后的中间格式,所以semodule_unpackage会报“magic number不对”的错误,这个文件本来就不是给用户直接解析用的。
关于“为什么这个操作这么麻烦”的疑问
确实,SELinux的这个设计一开始会让人困惑,主要原因有两个:
- 性能优先:编译后的模块加载更快,系统默认只保留编译后的缓存,不会存原始的可读规则,节省资源;
- 策略完整性:防止用户随意修改已加载的规则(虽然还是可以改,但增加了门槛)。
不过现在有了上面的方法,你就能轻松查看任何模块的规则,再也不用糊里糊涂地装模块啦!
备注:内容来源于stack exchange,提问作者Wang
相关产品推荐
相关产品推荐

