SELinuxが有効になっているCentOS7.5サーバー(LAMP、PHP-FPM)で、Laraval5.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()
関数(およびその後、デフォルトのphp.iniに従って_-t -i
_スイッチのみを含むsendmailビン)を使用するように指示すると思います。 config)動作します。 SMTPドライバーを使用すると機能し、Laravalメール構成のsendmailパスを_/usr/sbin/sendmail -t -i
_に変更すると機能します。
Sendmailで_-bs
_スイッチを使用するとSELinuxが文句を言うのはなぜですか?
_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モジュールをコンパイルしてインストールすることが本当に期待されていますか? JustWorkTMが必要なもののようです。
ボーナスの質問:PHPがmail
を使用できるようにするには、sebool _httpd_can_sendmail
_が_1
_である必要があるという印象を受けました。確かに、他のプロジェクトにも当てはまることがわかりました。このフラグは、上記のメールドライバーのいずれかを使用する場合、(上記の_-bs
_シナリオを除いて)すべてがオンでなくても機能するという点で、まったく影響がないようです。どうして?
通常、(Web)アプリはsmtpdを実行しないでください。これは、中央のSMTPサーバーでより適切に管理および保護されます。 SELinuxは、sendmailをメール送信エージェントのみに制限することに成功しました。
代替のsendmail呼び出しは、このポリシーで許可されているsmtpdを開始せずにメールをキューに入れます。
これはhttpdコンテキストからの移行ではなかったため、ブール値は効果がありませんでした。拒否はsystem_mail_t
からpostfix_smtpd_exec_t
であったことに注意してください。デフォルトのポリシーでは、sendmailがsmtpdを実行することはまったく許可されていません。