На сервере CentOS 7.5 (LAMP, PHP-FPM) с включенным SELinux я столкнулся со странной проблемой с приложением 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 только с -t -i
переключает в соответствии с конфигурацией php.ini по умолчанию) он работает. Если я использую драйвер SMTP, он работает, и если я изменю путь sendmail в конфигурации почты Laraval на /usr/sbin/sendmail -t -i
оно работает.
Почему SELinux жалуется при использовании -bs
включить sendmail?
В соответствии с 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, чтобы разрешить поведение? Похоже на то, что должно Just WorkTM.
Бонусный вопрос: у меня создалось впечатление, что sebool httpd_can_sendmail
должен быть 1
чтобы PHP мог использовать mail
. Конечно, я обнаружил, что это справедливо и для других проектов. Похоже, что этот флаг никак не влияет на использование любого из вышеперечисленных почтовых драйверов, поскольку все они по-прежнему работают без его включения (кроме -bs
сценарий выше). Зачем?
Как правило, (веб) приложения не должны запускать smtpd. Этим лучше управлять и защищать на центральном SMTP-сервере. SELinux удалось ограничить sendmail только агентом отправки почты.
Альтернативный вызов sendmail помещает почту в очередь без запуска smtpd, что разрешено этой политикой.
Логические значения не действуют, потому что это не переход из контекста httpd. Обратите внимание, что отрицание было system_mail_t
к postfix_smtpd_exec_t
. Политика по умолчанию вообще не позволяет sendmail запускать smtpd.