Я начал с новой установки OpenBSD 6.0, которая имеет chroot (/ var / www) на их сервере httpd (не Apache). Я установил PHP 7.0 и настроил php-fpm, используя двоичные файлы. В корневом веб-каталоге существуют объекты как sendmail, так и femail. Я переместил веб-сайт на место, и php работает очень хорошо, а php запрашивает базу данных postgresql (также установленную из двоичного кода), и все работает хорошо, кроме mail ().
Я создал файл журнала в /var/www/logs/php.mail.log, и он видит, что почта распознается php с такими записями журнала:
[09-Dec-2016 15:04:34 UTC] mail() on [/do_quick_mail_test.php:23]: To: myemail@domain.com -- Headers: From: support@domain.com (domain.com Robot)
Ошибок в /var/www/logs/error.log или в системных сообщениях не возникает.
Нет указания на адрес электронной почты в системном почтовом журнале.
когда я запускаю команду из командной строки, она работает, и почта доставляется нормально, без проблем:
echo 'Subject: test' | chroot /var/www /usr/sbin/sendmail -v myemail@domain.com
Программа php, которую я использую в своем браузере, очень проста:
<?php
session_start();
header( "Content-Type: text/plain" );
echo( 'Configuration Tests:'."\n" );
echo('Testing DNS:'."\n" );
print_r( dns_get_record("trialtoaster.com") );
echo( 'localhost lookup: '.gethostbyname( "localhost" )."\n" );
echo('Testing DateTime:'."\n" );
print_r( getdate() );
echo('Sending test email:'."\n" );
if ( mail("myemail@domain.com", "PHP Test mail", "PHP email - test message.", "From: support@domain.com (domain.com Robot)") ) {
echo '- PHP thinks the email went normally.';
} else {
echo '- PHP thinks the email failed.';
}
?>
Программа не выдает сбоев, кроме mail (), который умирает. Тест DNS возвращает все записи, включая записи MX, с точной датой. Несмотря на то, что в почтовый журнал php правильно ведется лог.
При отображении phpinfo () правильно отображает конфигурацию:
sendmail_path: /usr/sbin/sendmail -t
SMTP: localhost
smtp_port: 25
Когда я проверяю фильтр пакетов, он позволяет всему, что находится на lo0, перемещаться куда угодно, и когда я запускаю команду, я вижу ее на pftop, но ничего не отображается, когда я запускаю mail () из браузера.
Я связал установку sendmail.ini в том же каталоге, что и chrooted sendmail, и это не имеет никакого значения.
Это начинает выглядеть так, как будто установка OpenBSD chrooted httpd является неполной, поскольку для использования команды php mail () что-то просто полностью отсутствует, и я боюсь, что это может быть оболочка и библиотеки bash, поскольку почта отправляется нормально из команды линия. Мне это кажется неуместным, так как цель chroot - заключить в тюрьму взломы, а предоставление оболочки и библиотек bash системе, находящейся в тюрьме, кажется очень большой площадью поверхности для атаки.
Я просто чувствую, что это НЕ МОЖЕТ быть проблемой, потому что в противном случае вы могли бы просто сбросить chroot и просто запустить его без тюрьмы (казалось бы).
Кто-нибудь видит, что мне не хватает - а если нет, и я копирую в оболочку и библиотеки, каков самый безопасный способ сделать это с минимальным воздействием и без написания пользовательских оболочек, которые злоумышленник может просто перевернуть?
Я считаю, что это можно решить одним из двух способов:
(1) Вы МОЖЕТЕ решить эту проблему, установив исполняемую оболочку в chroot, чтобы можно было запустить двоичный файл sendmail. Если вы это сделаете, даже если вы установите его в оболочке, вы увеличите площадь поверхности для атаки, и вы можете просто отбросить chroot. Оболочки можно повторно обернуть, и все, что вам нужно сделать, это выполнить перезагрузку, и ваша система взломана. Мой голос - не делать этого.
(2) Лучший вариант - отказаться от почты и использовать SMTP напрямую через сокет - почти так же, как PHP и сам веб-сервер уже работают. В chroot нет оболочки, и все, что вы делаете, - это устанавливаете дополнительный php-код и позволяете этому коду открывать сокет на локальном хосте на порт 25, где ваш MTA уже прослушивает и передает во внешний мир, но не выполняет какой-либо произвольный код.
Вот как это работает:
Установите Pear, если он еще не установлен, а затем установите почтовые скрипты. Вы можете сделать это легко вот так:
pkg_add install Pear
pear install Mail_smtp
pear install Net_SMTP
В зависимости от вашей системы - первая установка груши может сделать вторую за вас как зависимость.
Оттуда я добавил функцию php в ее собственную программу php:
<?php
/**
* Sends an email using SMTP directly rather than using the sendmail binary (which requires
* a shell environment to run). This allows the chrooted server to run with less exposure.
*/
require_once "Mail.php";
function SMTP_mail($recipients, $subjectHeader, $message, $fromHeader)
{
$headers['From'] = $fromHeader;
$headers['Subject'] = $subjectHeader;
$smtpinfo["host"] = "localhost";
$smtpinfo["port"] = "25";
$smtpinfo["auth"] = false;
// Create the mail object using the Mail::factory method
$mail_object = Mail::factory("smtp", $smtpinfo);
$mail_object->send($recipients, $headers, $message);
}
Все, что оставалось сделать, это просмотреть код, который я переносил, и преобразовать почтовые инструкции для использования этой функции:
SMTP_mail($sendToEmailAddr, $subjectLine, $messageBody, 'From: Support@domain.com (Domain.com Robot)');
Если вы еще этого не сделали, возможность отправлять почту за пределами chroot уже должна работать. Важное, но для нас здесь находится в файле /etc/mail/smtp.conf:
listen on lo0
# Since we are only listening on the lo0 (local) we can safely use
# commands that are "accept from any" or bare "accept" commands.
# accept from any for domain "example.org" alias <aliases> deliver to mbox
accept for local alias <aliases> deliver to mbox
# accept from the lo0 (local) interface anything and relay it out
accept for any relay
# This was the original command - use it if you ever open up
# the external interface by doing a "listen on any" rather than
# the above command - that will keep us from being an open relay:
#accept from local for any relay
Дайте ему хорошую перезагрузку, и она должна просто работать - учитывая, что у вас такая же настройка, как я в своем вопросе. PHP откроет SMTP-соединение через локальный хост в chroot с локальным хостом за пределами chroot, отправит электронное письмо, которое вы запрограммировали для отправки, и закроет соединение. Файл mailer.conf OpenBSD гарантирует, что «настоящий» sendmail (smtpctl) получит его и направит во внешний мир на основе записи MX в DNS почтового хоста для этого адреса электронной почты. Вы хотите убедиться, что SMTP работает, установив smtpd_flags в системном файле /etc/rc.conf.local.
Все они управляются демонами и так же безопасны, как ваш программный код. Надеюсь, это поможет!