Ой, ничего не найдено!

К сожалению, по вашему запросу пока ничего нет (но это только пока!), зато вы можете подписаться на нашу замечательную email-рассылку, чтобы не пропустить самое интересное в будущем.

  • 683

Контроль доступа к отправке почты в AlmaLinux 8 с использованием Exim и PHP

  • 2 минуты на чтение

Введение

Отправка писем с сервера — одна из ключевых возможностей практически любого интернет-проекта. Однако обеспечив возможность отправки почты, администратор часто сталкивается с вопросами безопасности и контроля: кто может отсылать письма, как ограничить доступ к почтовому агенту (MTA), не нарушив работу важных сервисов (например, отправку писем через PHP-скрипты), и как все это правильно настроить?

В данной статье мы рассмотрим, как на сервере с AlmaLinux 8 настроить и контролировать доступ к Exim — одному из популярных MTA, а также решить возникающие проблемы с правами, SELinux и корректной работой PHP-функции mail().

Шаг 1: Убедиться, что порт 25 открыт и Exim работает

Прежде чем вносить ограничения, нужно удостовериться, что почтовый агент работает корректно и порт SMTP (25) открыт:

  1. Проверка прослушиваемого порта:

    ss -tlnp | grep :25

    Если вы видите, что порт 25 прослушивается Exim, значит сервис активен.

  2. Проверка брандмауэра (firewalld):

    sudo firewall-cmd --list-services

    Убедитесь, что smtp присутствует в списке. Если нет — добавьте:

    sudo firewall-cmd --permanent --add-service=smtp sudo firewall-cmd --reload

На этом этапе Exim должен быть доступен для отправки почты. Однако, по умолчанию, часто все пользователи системы могут запускать MTA напрямую, что не всегда безопасно.

Шаг 2: Ограничение доступа к Exim для пользователей

Предположим, нам нужно закрыть общий доступ к Exim и сделать так, чтобы только избранные пользователи могли его запускать. К примеру, мы хотим:

  • Запретить доступ всем существующим пользователям.
  • Не давать доступ новым пользователям по умолчанию.
  • Разрешать доступ только добавлением в специально созданную группу.
Подключение за минуту
Попробуйте Siteko.net бесплатно в течение месяца
Проверьте хостинг на реальном сайте: скорость, стабильность и поддержка доступны сразу после подключения.
Начать бесплатно

Настройка:

  1. Создаем группу eximusers:

    sudo groupadd eximusers
  2. Меняем группу и права на бинарник exim: По умолчанию Exim установлен в /usr/sbin/exim. Изменим его группу и права:

    sudo chgrp eximusers /usr/sbin/exim sudo chmod 4750 /usr/sbin/exim

    Здесь 4750 означает, что:

    • Setuid-бит (4) гарантирует, что при запуске exim будет иметь права root, необходимые для работы с почтовой очередью.
    • Владелец (root) может читать, писать и выполнять (rwx).
    • Группа (eximusers) может читать и выполнять (rx).
    • Остальные пользователи не имеют доступа к бинарнику.
  3. Добавляем пользователя в группу: Чтобы дать доступ конкретному пользователю, добавьте его в группу:

    sudo usermod -aG eximusers username

Теперь только пользователи из группы eximusers смогут воспользоваться Exim напрямую. Новые пользователи, по умолчанию, не входят в эту группу и доступа не имеют.

Шаг 3: Учёт фактора PHP и веб-сервера

Часто отправка писем идет не только вручную из консоли, но и через PHP-скрипты (например, при использовании mail() функции).

  • Если PHP запущен как модуль Apache (mod_php), все скрипты выполняются от имени одного системного пользователя (например, apache). Это усложняет разграничение прав.
  • В более безопасной архитектуре, где используется PHP-FPM, каждый сайт может работать от своего UNIX-пользователя. Тогда у каждого проекта свои права и, добавив этого пользователя в группу eximusers, вы можете управлять правами отправки почты.

Чтобы запретить использование mod_php, вы можете отключить или удалить соответствующий модуль, переключившись на PHP-FPM. В случае PHP-FPM достаточно добавить пользователя, под которым работает пул, в eximusers.

Шаг 4: Решение проблемы с правами и re-exec

В процессе настройки мы столкнулись с проблемой: после установки ограничений на exim, при перезапуске (re-exec) самого себя Exim выдавал ошибку:

re-exec of exim (/usr/sbin/exim) with -q failed: Permission denied

Это происходит, когда Exim пытается переинициализировать очередь, но не может заново исполниться из-за недостатка прав. Решение в том, чтобы пользователь exim, под которым работает служба, тоже был в группе eximusers. Тогда при повторных вызовах Exim сможет обращаться к самому себе без отказов:

Старт без оплаты
Месяц хостинга бесплатно для новых проектов
Разместите сайт, проверьте скорость и оцените удобство Siteko.net. Просто выберите тариф и начните тестовый месяц.
Посмотреть тарифы
sudo usermod -aG eximusers exim

Перезапустив Exim, вы избежите этой проблемы.

Шаг 5: Отладка и проверка работы

Если у вас возникают трудности с отправкой почты из PHP:

  1. Проверяйте логи Exim: В /var/log/exim/mainlog или /var/log/maillog вы увидите подробности об ошибках.

  2. Проверьте SELinux: Хотя в нашем случае SELinux был отключен при установке ISPmanager, если он включен, нужно разрешить веб-серверу отправлять почту:

    sudo setsebool -P httpd_can_sendmail on
  3. Убедитесь, что mail() корректно настроен: В php.ini должен быть установлен верный sendmail_path, по умолчанию mail() использует /usr/sbin/sendmail, который ссылается на Exim.

  4. Отладочный PHP-скрипт: Добавьте вывод ошибок и убедитесь, что mail() возвращает true:

    <?php ini_set('display_errors', 1); error_reporting(E_ALL); $res = mail("[email protected]", "Test", "Hello world", "From: [email protected]\r\n"); var_dump($res); ?>

    Если почта уходит, но mail() возвращает false, возможно, дело в заголовках или настройках PHP. Подкорректируйте From: или убедитесь, что на receiving-сервере ничего не блокируется.

Итоги

Мы начали с задачи отправки почты через Exim на AlmaLinux 8, затем решили ограничить доступ к Exim определенной группой пользователей, чтобы новые пользователи не могли автоматически отправлять почту. Мы рассмотрели вопросы SELinux, прав доступа, необходимость setuid-бита и проблемы с re-exec демона Exim. Также затронули, как PHP отправляет почту, и что делать, если возникают ошибки при вызове mail().

Основная идея — обеспечить безопасность и предсказуемость:

  • Только одобренные пользователи или сервисы, добавленные в группу eximusers, могут отправлять почту.
  • Сетевые и системные настройки (файрволы, SELinux, права на файлы) должны быть согласованы.
  • PHP-скрипты работают под определенными системными пользователями, и предоставление им доступов контролируется через группу.

Такой подход повышает безопасность и управляемость почтовой инфраструктурой на вашем сервере.

Первый месяц бесплатно

Хостинг Siteko.net для стабильного запуска сайта

Разместите проект на Siteko.net и проверьте скорость, панель управления и поддержку без стартовой оплаты.

  • 1 месяц бесплатно для новых клиентов сразу после выбора тарифа.
  • Быстрый старт для лендинга, блога или корпоративного сайта.
  • Поддержка рядом поможет с переносом и настройкой проекта.
Выбрать тариф