我有一个脚本,当调用时,它的内容将dmesg
被写入一个文件,文件的名称基本上是一个时间戳。 SELinux 阻止了这种情况。根据 Fedora 的 SELinux 故障排除应用程序的建议,我尝试了:
grep dmesg /var/log/audit/audit.log | grep dmesg /var/log/audit/audit.log | audit2allow-M mypol
semodule -i mypol.pp
然而,这似乎不起作用,可能是因为它创建的文件的名称每次都不同。那么我如何告诉 SELinux 允许dmesg
在某个目录中创建(并写入)任何文件呢?或者告诉它有问题的脚本(及其生成的所有进程)可以做到这一点?
答案1
您需要了解如何过滤 AVC 拒绝以及如何编写自定义策略模块以允许访问特定操作(在本例中为您的脚本)。
我首先删除上面插入的模块,然后开始一个新的:
# semodule -r mymodule.pp
然后,运行您的脚本:
# date && ./my_script.sh
该date
调用对于根据时间戳过滤 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
这将产生一个type enforcement
描述。
您应该继续检查代码以确保其正确性并将代码编译type enforcement
为module
:
# checkmodule -M -m -o my_script.mod my_script.te
该模块必须打包成 apolicy package
以便您能够随意加载和卸载它:
# semodule_package -o my_script.pp -m my_script.mod
现在,您可以使用以下方式加载策略:
# semodule -i my_script.pp
检查是否正确加载:
# semodule -l | grep my_script
然后,尝试再次触发拒绝,并查看审核日志中是否有关于同一进程的更多(不同)警报。
代码的进一步版本type enforcement
将需要更新version
( ),否则加载包将失败。1.0
编译和打包后,更新policy package
就完成了:
# semodule -u my_script.pp
开始使用 SELinux 时需要学习很多东西。一些有用的参考:
- 命令的联机帮助页。
- 还检查 的输出
apropos selinux
。
来自 RHEL 文档
Dave Quigley 做了一个很好的介绍性演讲:
答案2
你可以跑semanage permissive -a dmesg_t
。然后/bin/dmesg
,其类型为dmesg_t
,将以宽容模式运行。将允许访问,但 SELinux 仍会生成 AVC 消息。