Большинство гайдов про 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
и пройдитесь по другим ограничениям, чтобы выставить нужные вам лимиты