OpenBSD 6.0 chrooted httpd с php 7.0 mail () работает, но почта не выходит?

Я начал с новой установки 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 и просто запустить его без тюрьмы (может показаться).

Кто-нибудь видит, что мне не хватает - а если нет, и я копирую в оболочку и библиотеки, что такое самый безопасный способ сделать это с минимальной уязвимостью и без написания пользовательских оболочек, которые злоумышленник может просто перевернуть?

0
задан 9 December 2016 в 19:38
1 ответ

Я считаю, что это можно решить за один из двух способов:

(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.

Все они управляются демонами и так же безопасны, как и ваш программный код. Надеюсь, это поможет!

0
ответ дан 5 December 2019 в 09:06

Теги

Похожие вопросы