- Опубликовано: 9 дек 2024
- 146
Контроль доступа к отправке почты в AlmaLinux 8 с использованием Exim и PHP
Введение
Отправка писем с сервера — одна из ключевых возможностей практически любого интернет-проекта. Однако обеспечив возможность отправки почты, администратор часто сталкивается с вопросами безопасности и контроля: кто может отсылать письма, как ограничить доступ к почтовому агенту (MTA), не нарушив работу важных сервисов (например, отправку писем через PHP-скрипты), и как все это правильно настроить?
В данной статье мы рассмотрим, как на сервере с AlmaLinux 8 настроить и контролировать доступ к Exim — одному из популярных MTA, а также решить возникающие проблемы с правами, SELinux и корректной работой PHP-функции mail()
.
Шаг 1: Убедиться, что порт 25 открыт и Exim работает
Прежде чем вносить ограничения, нужно удостовериться, что почтовый агент работает корректно и порт SMTP (25) открыт:
-
Проверка прослушиваемого порта:
ss -tlnp | grep :25
Если вы видите, что порт 25 прослушивается Exim, значит сервис активен.
-
Проверка брандмауэра (firewalld):
sudo firewall-cmd --list-services
Убедитесь, что
smtp
присутствует в списке. Если нет — добавьте:sudo firewall-cmd --permanent --add-service=smtp sudo firewall-cmd --reload
На этом этапе Exim должен быть доступен для отправки почты. Однако, по умолчанию, часто все пользователи системы могут запускать MTA напрямую, что не всегда безопасно.
Шаг 2: Ограничение доступа к Exim для пользователей
Предположим, нам нужно закрыть общий доступ к Exim и сделать так, чтобы только избранные пользователи могли его запускать. К примеру, мы хотим:
- Запретить доступ всем существующим пользователям.
- Не давать доступ новым пользователям по умолчанию.
- Разрешать доступ только добавлением в специально созданную группу.
Настройка:
-
Создаем группу
eximusers
:sudo groupadd eximusers
-
Меняем группу и права на бинарник 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).
- Остальные пользователи не имеют доступа к бинарнику.
- Setuid-бит (
-
Добавляем пользователя в группу: Чтобы дать доступ конкретному пользователю, добавьте его в группу:
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
Перезапустив Exim, вы избежите этой проблемы.
Шаг 5: Отладка и проверка работы
Если у вас возникают трудности с отправкой почты из PHP:
-
Проверяйте логи Exim: В
/var/log/exim/mainlog
или/var/log/maillog
вы увидите подробности об ошибках. -
Проверьте SELinux: Хотя в нашем случае SELinux был отключен при установке ISPmanager, если он включен, нужно разрешить веб-серверу отправлять почту:
sudo setsebool -P httpd_can_sendmail on
-
Убедитесь, что
mail()
корректно настроен: Вphp.ini
должен быть установлен верныйsendmail_path
, по умолчаниюmail()
использует/usr/sbin/sendmail
, который ссылается на Exim. -
Отладочный 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-скрипты работают под определенными системными пользователями, и предоставление им доступов контролируется через группу.
Такой подход повышает безопасность и управляемость почтовой инфраструктурой на вашем сервере.
Была статья полезной: