SELinux:允许进程在某个目录中创建任何文件

SELinux:允许进程在某个目录中创建任何文件

我有一个脚本,当调用时,它的内容将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 enforcementmodule

# 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 消息。

相关内容