在启用了 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_t
。postfix_smtpd_exec_t
默认策略根本不允许 sendmail 执行 smtpd。