为什么 sendmail 上的 -bs 开关会导致 PHP 应用程序内部的 SELinux 拒绝?

为什么 sendmail 上的 -bs 开关会导致 PHP 应用程序内部的 SELinux 拒绝?

在启用了 SELinux 的 CentOS 7.5 服务器(LAMP、PHP-FPM)上,当 Laraval 5.3 应用程序尝试发送电子邮件时,我遇到了一个奇怪的问题。

应用程序的邮件配置设置为使用/usr/sbin/sendmail -bs,当尝试发送电子邮件时,应用程序会抛出Swift_TransportException' with message 'Expected response code 220 but got code "", with message ""' in vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php:383

怀疑 SELinux 后,我深入挖掘并audit2why发现:

type=AVC msg=audit(1553606152.177:1240981): avc: denied { execute } for pid=3896 comm="sendmail" name="smtpd" dev="vda1" ino=12904557 scontext=system_u:system_r:system_mail_t:s0 tcontext=system_u:object_r:postfix_smtpd_exec_t:s0 tclass=file

如果我禁用 SELinux,问题就解决了。如果我改用mail驱动程序,我相信它会指示 SwiftMailer 使用 PHP 的mail()功能(随后 sendmail bin 只-t -i按照默认的 php.ini 配置进行切换),它就可以正常工作。如果我使用 SMTP 驱动程序,它就可以正常工作;如果我将 Laraval 邮件配置 sendmail 路径更改为,/usr/sbin/sendmail -t -i它就可以正常工作。

为什么在 sendmail 上使用开关时 SELinux 会抱怨-bs

根据man sendmail

-bs Stand-alone SMTP server mode. Read SMTP commands from standard input, and write responses to standard output.  In stand-alone SMTP server mode, mail relaying and other access controls are disabled by default. To enable them, run the process as the mail_owner user.

如果要继续使用该配置(我猜它存在是有原因的),是否真的需要编译并安装 SELinux 模块来允许该行为?这似乎是应该可以正常工作的事情。

附加问题:我以为PHPhttpd_can_sendmail需要sebool1才能使用mail。当然,我发现其他项目也是这样。使用上述任何邮件驱动程序时,此标志似乎没有任何影响,因为它们即使没有打开也能正常工作(除上述-bs情况外)。为什么?

答案1

一般来说,(网络)应用程序不应该执行 smtpd。这在中央 SMTP 服务器上管理和保护起来更好。SELinux 成功将 sendmail 限制为仅作为邮件提交代理。

替代的 sendmail 调用会在不启动 smtpd 的情况下对邮件进行排队,这是本策略所允许的。

布尔值没有效果,因为这不是从 httpd 上下文转换而来的。请注意,拒绝的是system_mail_tpostfix_smtpd_exec_t默认策略根本不允许 sendmail 执行 smtpd。

相关内容