Ограничение доступа SASL-пользователей по IP в Postfix: подробное руководство

Если вы администрируете почтовый сервер на Postfix, рано или поздно может возникнуть необходимость ограничить доступ для отдельных учётных записей – например, разрешить отправку писем только с определённых IP-адресов. Это особенно актуально для системных пользователей, которые работают с критически важными сервисами.

Но как это сделать, если стандартные методы вроде check_client_access не срабатывают? Давайте разбираться вместе, без лишней теории, но с конкретными примерами.

Почему check_client_access не работает для SASL-аутентификации?

В исходной конфигурации используется параметр check_client_access, который проверяет IP-адрес клиента. Однако тут есть нюанс: SASL-аутентификация происходит после проверки клиентских ограничений. То есть Postfix сначала разрешает подключение на уровне IP, а уже потом проверяет учётные данные. Если пользователь проходит аутентификацию, ограничения из sasl_access файла просто игнорируются – сервер считает его «легитимным».

Вот типичная ошибка в настройке (обратите внимание на порядок действий):

smtpd_client_restrictions = check_client_access hash:/etc/postfix/hatters/sasl_access  
smtpd_recipient_restrictions = permit_sasl_authenticated  

После успешной аутентификации правило permit_sasl_authenticated разрешает отправку, даже если IP-адрес не совпадает.

Решение: связка check_sasl_access и mynetworks

Чтобы ограничить SASL-пользователей по IP, нужно:

  1. Добавить доверенные IP-адреса в mynetworks.
  2. Использовать check_sasl_access, который проверяет доступ после аутентификации.

Шаг 1: Настройка mynetworks

Откройте main.cf и укажите разрешённые сети (IPv4 и IPv6):

mynetworks = 208.x.x.50/32, 2001:xxx:x:xxx::53/128, 127.0.0.0/8

Не забудьте заменить адреса на свои. Если список большой, вынесите его в отдельный файл через mynetworks = hash:/etc/postfix/network_access.

Шаг 2: Изменение master.cf

В секции submission файла master.cf настройте правила проверки:

submission inet n - n - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_client_restrictions=check_sasl_access hash:/etc/postfix/sasl_access
-o smtpd_recipient_restrictions=
reject_non_fqdn_recipient,
reject_unknown_recipient_domain,
permit_mynetworks,
permit_sasl_authenticated,
reject

Здесь:

  • check_sasl_access сверяет учётную запись и IP из файла sasl_access;
  • permit_mynetworks разрешает отправку для IP из mynetworks;
  • permit_sasl_authenticated применяется только если IP не входит в доверенные сети.

Шаг 3: Создание sasl_access

Файл /etc/postfix/sasl_access должен содержать записи вида:

user1 permit_mynetworks, reject
user2 permit_mynetworks, reject

Это значит:

  • Если user1 подключился с IP из mynetworks – разрешить;
  • В противном случае – отклонить, даже если аутентификация прошла успешно.

После редактирования выполните:

postmap /etc/postfix/sasl_access
systemctl reload postfix

Возможные ошибки и как их избежать

  1. Неправильный порядок правил в smtpd_recipient_restrictions. Если поставить permit_sasl_authenticated перед permit_mynetworks, проверка IP будет игнорироваться.
  2. Опечатки в sasl_access. Убедитесь, что имя пользователя написано точно так же, как в SASL-логах (иногда добавляется домен, например user1@domain.com).
  3. Забыли обновить mynetworks. Если добавили новый IP в файл, выполните postmap и перезагрузите Postfix.

Кстати, если вам нужно разрешить разные IP для разных пользователей (например, user1 – IPv6, user2 – IPv4), просто укажите их в отдельных строках файла sasl_access. А вот группировать через запятую не получится – Postfix обрабатывает только одну запись за раз.

Альтернатива: postfwd

Если вариант с check_sasl_access кажется сложным, можно использовать postfwd – гибкий фильтр для Postfix. Но учтите:

– Настройка требует установки дополнительного пакета;
– Конфигурация пишется на отдельном языке правил;
– Не все дистрибутивы включают актуальную версию с поддержкой IPv6.

Пример правила для postfwd:

id:RULE1; action=dunno; sasl_username=user1; client_address=2001:xxx:x:xxx::53
id:RULE2; action=reject; sasl_username=user1

Но лично я рекомендую оставаться в рамках штатных средств Postfix – меньше зависимостей и проще отладка.

Заключение

Ограничение доступа по IP для SASL-пользователей в Postfix – задача нетривиальная, но решаемая за 20–30 минут. Главное:

– Использовать check_sasl_access вместо check_client_access;
– Чётко прописать порядок правил в master.cf;
– Не забывать про postmap после изменения файлов.

Если что-то пошло не так, проверьте логи командой tail -f /var/log/mail.log – там будут подробные сообщения о причинах отклонения подключения. Удачи в настройке!

Добавить комментарий

Все поля обязательны к заполнению. Ваш адрес email не будет виден никому.

Новое
Интересное