Вопрос или проблема
У меня есть небольшой почтовый сервер (работающий на Ubuntu 22.04), на котором около 10 аккаунтов разрешено отправлять почту через SASL аутентификацию (они принадлежат к системной группе).
Я бы хотел ограничить пару из этих аккаунтов, позволив им подключаться только с определенного IP адреса (один IPv6, другой IPv4).
Например, вот типичная запись в журнале для одного из аккаунтов, подключающегося с легитимного адреса (2001:xxx:x:xxx::53
– также обратите внимание, что для этих пользователей sasl нет доменного имени):
Jan 31 04:15:35 alice submission/smtpd[3140867]: 8EA36BA068: client=mail.xxx.xxx.uk[2001:xxx:x:xxx::53], sasl_method=PLAIN, sasl_username=user1
Я использую check_client_access
в своих правилах отправки следующим образом:
submission inet n - n - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sender_restrictions=
-o smtpd_milters=
-o { smtpd_client_restrictions=
HERE --> check_client_access hash:/etc/postfix/hatters/sasl_access
}
-o { smtpd_recipient_restrictions=
reject_non_fqdn_recipient
reject_unknown_recipient_domain
permit_sasl_authenticated
reject
}
...etc.
Но файл sasl_access
ниже, похоже, не оказывает никакого влияния (и ничего нет в журналах) при попытке отправить с другого IP, который должен предотвратить отправку клиентом:
user1 2001:xxx:x:xxx::53 208.x.x.50 OK
user2 2001:xxx:x:xxx::53 208.x.x.50 OK
Я запустил postmap
и перезагрузил postfix.
ИЗМЕНЕНИЕ: Я также рассмотрел вариант использования postfwd для этого, но предпочел бы решение с postfix, так как было бы немного легче в обслуживании (и я также не уверен, поддерживает ли версия postfwd, поставляемая с Ubuntu 22.04, IPv6).
Я смог это сделать, добавив соответствующие IP-адреса в $mynetworks
, а затем используя check_sasl_access в моем master.cf
вот так:
submission inet n - n - - smtpd
-o smtpd_tls_security_level=encrypt
-o smtpd_sender_restrictions=
-o smtpd_milters=
## Ограничить отправителей только с локальных сетей:
-o { smtpd_client_restrictions=check_sasl_access hash:/etc/postfix/sasl_access }
-o { smtpd_recipient_restrictions=
reject_non_fqdn_recipient
reject_unknown_recipient_domain
... etc.
Затем я могу поместить это в файл sasl_access
, который запрещает доступ этим пользователям, если они подключаются из не указанной сети:
user1 permit_mynetworks, reject
user2 permit_mynetworks, reject
Ответ или решение
Использование Postfix для ограничения SASL-учетных записей по IP-адресам является вполне выполнимой задачей, если правильно настроить соответствующие параметры. Рассмотрим теоретическую основу, пример и применение данной задачи.
Теоретическая основа
Postfix предоставляет разнообразные методы для управления доступом к вашему серверу. Два ключевых метода, которые мы будем использовать, это check_client_access
и check_sasl_access
. Каждый из них предлагает свой подход к проверке и ограничению доступа.
check_client_access
Этот метод используется для применения правил к IP-адресам, подключающимся к серверу. Обычно используется хэшированный файл, который связывает IP-адрес или диапазон адресов с определённым действием (например, разрешение или запрет доступа).
check_sasl_access
Этот метод фокусируется на учетных записях SASL и позволяет проверять и ограничивать доступ на основе имен пользователей, используя подробные правила. check_sasl_access
может использоваться для того чтобы разрешить или запретить действия в зависимости от наличия пользователя в локальных сетях, описанных в $mynetworks
.
Пример
Вы хотите ограничить отправку сообщений с вашего почтового сервера определёнными учетными записями. Например, у вас есть учетные записи user1
и user2
, которые должны быть ограничены по IP-адресам.
-
Настройка master.cf:
submission inet n - n - - smtpd -o smtpd_tls_security_level=encrypt -o smtpd_sender_restrictions= -o smtpd_milters= -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_sasl_authenticated reject
-
Настройка файла sasl_access:
Представьте, что вам нужно разрешить доступ только из определённых IP-адресов, которые находятся в
$mynetworks
. Файл/etc/postfix/sasl_access
может выглядеть так:user1 permit_mynetworks, reject user2 permit_mynetworks, reject
-
Обновление конфигурации:
После изменения конфигурационных файлов необходимо сгенерировать новый хэш-файл с помощью команды
postmap
и перезагрузить Postfix, чтобы изменения вступили в силу:postmap /etc/postfix/sasl_access systemctl reload postfix
Применение
Эта конфигурация позволяет только тем SASL-учетным записям, которые перечислены в $mynetworks
, отправлять почту, что существенно повышает уровень безопасности вашего почтового сервера.
Если кто-то попытается подключиться с другого IP-адреса, то сессия будет отклонена, так как правила check_sasl_access
явно не разрешают этот доступ. Это предотвращает несанкционированное использование вашего сервера для отправки спама или других нежелательных сообщений.
Заключение
Использование check_client_access
и check_sasl_access
может эффективно защитить ваш сервер от несанкционированного использования, а также четко разграничить, кто и откуда может отправлять почту. Эти меры необходимы для поддержания целостности и безопасности почтовой системы, особенно в условиях, когда риск эксплуатации интернет-сервисов постоянно возрастает.
Эта методика дает возможность динамически и гибко управлять доступом к вашему почтовому сервису, обеспечивая как безопасность, так и эффективность в управлении сервером. Надлежащая настройка этих параметров важна для предотвращения рисков и обеспечения оптимальной работы вашей IT-инфраструктуры.