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

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

  • 146

Контроль доступа к отправке почты в 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 и сделать так, чтобы только избранные пользователи могли его запускать. К примеру, мы хотим:

  • Запретить доступ всем существующим пользователям.
  • Не давать доступ новым пользователям по умолчанию.
  • Разрешать доступ только добавлением в специально созданную группу.
Начните с нами: 6 месяцев бесплатного хостинга!
Используйте промокод FREE6MONTH и раскройте потенциал своего сайта без финансовых вложений.

Настройка:

  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 сможет обращаться к самому себе без отказов:

sudo usermod -aG eximusers exim
Начните с нами: 6 месяцев бесплатного хостинга!
Используйте промокод FREE6MONTH и раскройте потенциал своего сайта без финансовых вложений.

Перезапустив 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("test@example.com", "Test", "Hello world", "From: no-reply@example.com\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 — это быстрый и простой хостинг для тех, кто ценит удобство и стабильность.

  • Без падений и нервов — наш uptime почти всегда 100%.
  • Гибкие тарифы — только нужные функции, ничего лишнего.
  • Скорость— сайты грузятся, как пуля!
  • Удобно — разобраться сможет даже новичок, всё под рукой.
  • Поддержка всегда рядом 24/7 поможем решить любой вопрос.

Заходите на Siteko.net и попробуйте нас бесплатно первый месяц! Мы делаем всё, чтобы ваш сайт работал без проблем.

Siteko.net — просто, быстро и надёжно!