我的系统环境是Centos-7.9,Apache2.4,Php-fpm,PHP-7.4
我已经设置了 postfix 来从网站发送电子邮件,它在独立测试电子邮件中工作,并且当我关闭 SELinux 时也是如此。
然而,如果启用了 SELinux,它将阻止从服务器发送电子邮件,并出现以下错误 /var/log/邮件日志
postfix/sendmail[10883]: fatal: execv /usr/libexec/postfix/smtpd: Permission denied
当我做
sudo setenforce 0
它会发送电子邮件,但我不想关闭 SELinux,但我想允许我的 Web 应用程序将发送电子邮件列入白名单。我尝试了以下方法,但没有成功
sudo setsebool -P httpd_can_sendmail 1
关于如何解决这个问题您有什么想法吗?
答案1
这是 RHEL 7.7 中的一个已知错误,在使用时会出错,php-fpm
而不是 Apache 的mod_php
。由于您使用的是 CentOS 7.9,因此它适用。
您可以在 Red Hat 的 Bugzilla 上阅读有关此问题的更多信息:http://bugzilla.redhat.com/show_bug.cgi?id=1754622
至于解决您的问题的方法,第一个也是最明显的方法是禁用 SELinux,但作为第二种选择,我建议执行以下操作:
- 安装包
policycoreutils-python
- 使用
audit2why
和audit2allow
创建自定义规则以便与php-fpm
启用 SELinux 一起工作。 tail -f
并/var/log/audit/audit.log
尝试从 发送邮件消息httpd
。获取输出并通过audit2why
和进行播种audit2allow
。这将是不言自明的。- 应用两个程序建议的规则。
如果您不想制定特定于此机器的自定义规则,第三个解决方案是将httpd_t
或system_mail_t
(取决于 的输出)置于宽容模式。但请记住,这样做会禁用整个上下文的 SELinux。audit2allow
可以使用以下命令完成:semanage permissive -a httpd_t
或semanage permissive -a system_mail_t
。要撤消更改,只需更改-a
为-d
。
答案2
我在这里要做的是
将 SELinux 置于宽容模式
setenforce 0
轮换审计日志,以便获得一份更干净的 AVC 拒绝列表
kill -USR1 $(cat /run/auditd.pid)
导致问题发生并生成审计消息
创建本地策略模块
grep denied /var/log/audit/audit.log | audit2allow -m mypolicy >mypolicy.te
检查生成的策略文件是否符合我的预期,并且不会“泄露”我不想要的东西,并根据需要进行编辑。
创建并安装策略
checkmodule -M -m -o mypolicy.mod mypolicy.te
semodule_package -o mypolicy.pp -m mypolicy.mod
semodule -i mypolicy.pp
您可能会发现,将所有 AVC 拒绝放入单独的文件中,然后删除与您尝试解决的问题无关的拒绝,然后再对文件使用 audit2alow,这样会更容易。如果这种方法对您更有效,您可以跳过中间步骤,直接转到 .pp 文件
cat myavcs.log | audit2allow -M mypolicy