我有一个脚本,当被调用时,将导致dmesg的内容被写入文件,文件的名称基本上是一个时间戳. SELinux阻止了这一点.根据Fedora的SELinux故障排除应用程序的建议,我试过:
grep dmesg /var/log/audit/audit.log | audit2allow -M mypol
semodule -i mypol.pp
但是,这似乎不起作用,可能是因为它创建的文件的名称每次都不同.那么如何告诉SELinux允许dmesg创建(并写入)某个目录中的任何文件?或者告诉它有问题的脚本(以及它产生的所有进程)可以做到这一点?
解决方法:
您需要了解如何过滤AVC拒绝以及如何编写自定义策略模块以允许访问特定操作(在本例中为脚本).
我首先删除你上面插入的模块,开始一个新的:
# semodule -r mymodule.pp
然后,运行您的脚本:
# date && ./my_script.sh
日期调用对于根据时间戳过滤AVC拒绝很有用.
接下来,使用常用方法调试AVC拒绝,这使用了ausearch(8)命令:
# ausearch -m avc -ts $timestamp | audit2allow
有关可以使用的开关的详细信息,请查看联机帮助页,特别是-ts标志.
有了这些信息,您就可以根据现有政策了解被拒绝的内容.
现在,您应该确定是否授予此访问权限.我们假设您要授予访问权限.您需要创建一个自定义策略模块,用于描述定义您要授予的访问权限的规则.根据脚本的复杂程度,这或多或少都很简单:
# ausearch -m avc -ts 10:40:00 | audit2allow -m my_script > my_script.te
这将产生类型强制描述.
您应该继续检查代码以确保其正确性并将类型强制代码编译到模块中:
# checkmodule -M -m -o my_script.mod my_script.te
必须将该模块打包到策略包中,以便您能够加载它并随意卸载它:
# semodule_package -o my_script.pp -m my_script.mod
现在,您可以使用以下命令加载策略:
# semodule -i my_script.pp
检查它是否正确加载:
# semodule -l | grep my_script
然后,尝试再次触发拒绝,并查看审核日志中是否有更多(不同)警报有关此同一过程.
进一步版本的类型强制执行代码将需要更新版本(1.0),否则加载包将失败.编译和打包后,更新策略包完成后发出:
# semodule -u my_script.pp
从SELinux开始,有很多东西需要学习.一些有用的参考:
>命令的联机帮助页.
>还检查apropos selinux的输出.
来自RHEL文档
Dave Quigley的一个很好的介绍性演讲:
标签:selinux,linux,security,fedora
来源: https://codeday.me/bug/20190813/1649036.html