Postfix + SASL с использованием saslauthd в 2025.

Большинство гайдов про postfix/saslauthd написаны очень давно. Сейчас более популярна конфигурация c dovecot (и в качестве SASL модуля и в качестве IMAP/POP3 сервера), но мне нужено было сделать сервер только для отправки почты, и тащить целого слона dovecot не хотелось.

Мы рассмотрим вариант построения почтового сервера на базе postfix, с легковесной SASL аутентификацией через механизм PAM из текстового файла (нам даже СУБД не потребуется).

Дополнительно поставим PostFWD чтобы сделать ограничение на количество сообщений от пользователя (На случай, если пароль утечет и через эту SASL учетку начнут спамить).

Установка пакетов

apt install -y rsyslog postfix python3 python-is-python3 python3-passlib pipx libpam-pwdfile pamtester libsasl2-modules sasl2-bin

# ставим hostname если надо
hostnamectl set-hostname stmpout

Настройка PAM аутентификации для SMTP

Создадим PAM модуль для SMTP: /etc/pam.d/smtp

/etc/pam.d/smtp 
auth    required   pam_pwdfile.so pwdfile=/etc/postfix-sasl-users
account required   pam_permit.so

Для создания учетных записей - будем использовать htpasswd

# создаем тестовый аккаунт test с паролем testpass
htpasswd -Bbc /etc/postfix-sasl-users test testpass

Значения ключей: -B - сохранять учетную запусь в формате bcrypt, -b - брать пароль с командной строки, -c - создать файл паролей, это нужно только первый раз.

Теперь, содержимое /etc/postfix-sasl-users будет примерно таким:

test:$2y$05$AJ3YLhPGFtKx.cybVPYZ2uOVvidhIwEYO2ZVAbd38xRotWK9xCj7K

Проверяем (вводим пароль testpass):

# pamtester smtp test authenticate
Password: 
pamtester: successfully authenticated

Настройка SASL аутентификации через PAM

Редактируем файл /etc/default/saslauthd и меняем (добавляем если нет) эти строчки .

MECHANISMS="pam"
# MECH_OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd"
START=yes

Перезапускаем:

systemctl restart saslauthd

Проверяем (указываем путь не только к каталогу, а к файлу mux в этом каталоге):

# testsaslauthd -u test -p testpass -s smtp -f /var/spool/postfix/var/run/saslauthd/mux
0: OK "Success."

Подключаем saslauthd к Postfix

В /etc/postfix/main.cf

smtpd_sasl_auth_enable = yes
smtpd_tls_auth_only = yes

Убедитесь, что у вас настроено:

# Настройка STARTTLS
smtpd_tls_security_level = may
smtpd_tls_cert_file = /etc/ssl/certs/postfix.pem
smtpd_tls_key_file = /etc/ssl/private/postfix.pem

И что существуют указанные файлы.

В /etc/postfix/sasl/smtpd.conf

pwcheck_method: saslauthd
mech_list: plain login

Добавляем пользователя postfix в группу sasl и перезапускаем:

$ usermod -aG sasl postfix
$ groups postfix
postfix : postfix sasl
$ sudo systemctl restart postfix

Проверяем

Для проверки - устанавливаем testmsg:

# Настраиваем $PATH для pipx-instaled binaries
$ pipx ensurepath

# перезаходим

# устанавливаем testmsg
$ pipx install testmsg

# проверяем....
$ testmsg -v --starttls --lorem --send localhost --user test --password testpass --from [email protected] --to [email protected]

Готово!

Бонус: Устанавливаем PostFWD и настраиваем ограничения

apt install postfwd

Делаем файл /etc/postfix/postfwd.cf

# limit sender
id=RATE01
  sasl_username=~^(.+)$ 
  action=rate(sasl_username/2/60/REJECT $$sasl_username - Sorry, limit exceeded: 100 emails per hour)

# recipient count limit 100 per hour per client
id=RCPT01
  sasl_username=~^(.+)$
  action=rcpt(sasl_username/100/3600/REJECT $$sasl_username - Sorry, 100 recipients maximum per hour)

# size limit 20mb per hour per client
id=SIZE01 
  sasl_username=~^(.+)$  
  action=size(sasl_username/20971520/3600/REJECT $$sasl_username - Sorry, maximum 20 MB per hour)

В первом правиле (RATE01) мы (временно, для теста) поставили ограничение 2/60 - 2 сообщения в 60 секунд. Чтобы сделать ограничение в 100 сообщений в час поменяйте на 100/3600.

Проверить конфигурацию postfwd можно так:

postfwd -C -f /etc/postfix/postfwd.cf

В /etc/postfix/main.cf добавляем:

smtpd_recipient_restrictions =
    check_policy_service inet:127.0.0.1:10040

Рестартуем…

systemctl restart postfix postfwd

Проверяем:

root@smtpout:~# testmsg --starttls --lorem --send localhost --user test --password testpass --from [email protected] --to [email protected]
root@smtpout:~# testmsg --starttls --lorem --send localhost --user test --password testpass --from [email protected] --to [email protected]
root@smtpout:~# testmsg --starttls --lorem --send localhost --user test --password testpass --from [email protected] --to [email protected]
{'[email protected]': (554, b'5.7.1 <[email protected]>: Recipient address rejected: test - Sorry, limit exceeded: 100 emails per hour')}

Как видим, первые два сообщения принимаются, а вот третье - уже нет.

Действия после установки

  • Создайте другие (реальные) учетки пользователей
  • Уберите запись про пользователя test из файла /etc/postfix-sasl-users
  • Установите лимит 100/3600 в ограничении RATE01 и пройдитесь по другим ограничениям, чтобы выставить нужные вам лимиты
comments powered by Disqus