我有一个应用程序,它向云服务提交任务,以创建某些时间敏感的资产。这些服务需要花费未知的时间来处理,此外,这些资产可能计划在未来更长时间公开,因此我需要等到处理完成,甚至可能还要等更长时间,直到资产“公开”。那时,我需要清除一些缓存以使资产可见。
可以向云服务传递一个回调 URL,这样它们就可以在处理完成时通知我。我在 CentOS 7 Apache 上创建了一个处理回调的 Web 服务。(仅供参考:Web 服务是使用 Passenger Phusion 在 Ruby 中实现的,并在其上运行 rack。)
at
我的想法是,如果资产已被处理但尚未公开,则让回调安排系统作业来清除缓存。
问题是 SELinux 不允许 Apache 调度作业at
。使用 audit2allow,我根据 audit.log 中记录的失败操作添加了以下模块。
ausearch -c 'unix_chkpwd' --raw | audit2allow -M my-unixchkpwd
semodule -i my-unixchkpwd.pp
ausearch -c 'at' --raw | audit2allow -M my-at
semodule -i my-at.pp
ausearch -c 'lspci' --raw | audit2allow -M my-lspci
semodule -i my-lspci.pp
结果是现在不失败记录在 audit.log 中,但at
命令仍然失败。
当强制执行时,我在 /var/log/messages 中看到的唯一内容是:
于:系统错误
此外,该命令的标准错误at
产生:
PAM 故障:系统错误
但如果我setenforce 0
一切都顺利的话。
因此,尽管 SELinux 阻止了该at
作业的安排,但似乎没有任何方法可以告诉它允许 Apache 执行此操作。
目前,我必须编写两个不同的程序,一个用于处理创建后立即公开的资产,另一个用于处理在未来某个已知时间安排的资产。如果我需要处理任意安排的资产,那么我将不得不实现我自己的调度程序版本at
。如果可能的话,我想避免这种复杂情况。
如果您能提供任何关于如何找出 SELinux 所反对的内容的想法,我们将不胜感激(此外,如果您能提供任何关于如何在不使用的情况下实现这一点的建议,我们将不胜感激at
)。