Настройка POP3 сервера Qpopper с SSL/TLS шифрованием в FreeBSD

FreeBSD ежедневно формирует письма с отчетами о статусе системы. Отчеты содержат известные уязвимости в установленных пакетах, наличие свободного места на дисках, время работы с момента последней перезагрузки системы и другую полезную информацию. Так же в почтовый ящик складываются результаты работы cron-заданий. Чтобы организовать получение этой административной корреспонденции почтовым клиентом по протоколу POP3 с SSL-шифрованием настроим Qpopper.

Статья устарела и скоро будет удалена. При сборке Qpopper с актуальной версией OpenSSL возникли проблемы с подключением через SSL/TLS. На своих серверах заменил Qpopper на Dovecot.

Установка Qpopper

Устанавливаем пакет:

pkg_add -r qpopper

Для установки из коллекции портов, обновляем коллекцию:

portsnap fetch && portsnap update || portsnap extract

И устанавливаем порт:

cd /usr/ports/mail/qpopper
make install clean

Настройка Qpopper

Генерируем ключи и задаем права доступа:

cd /usr/local/etc/qpopper
/usr/bin/openssl req -new -x509 -days 7700 -sha256 -newkey rsa:2048 -nodes -keyout server.key -out server.crt -subj '/'
chmod 600 server.*

Создаем файл конфигурации:

ee /usr/local/etc/qpopper.conf

Задаем параметры:

#Поддержка TLS/SSL шифрования:
# alternate-port - Использовать альтернативный порт для TLS/SSL сессий, обычно 995
# stls - Использовать 110 порт, шифрование инициируется командой STLS
# none или default - Не использовать шифрование
set tls-support              = alternate-port

# Путь к SSL-сертификату.
set tls-server-cert-file     = /usr/local/etc/qpopper/server.crt

# Путь к приватному ключу
set tls-private-key-file     =/usr/local/etc/qpopper/server.key

#Протоколировать статистику сессий
set statistics               = true

#Протоколировать длительность сессий
set timing                   = true

Настройка Inetd

Qpopper запускается службой Inetd при подключении клиента. Также возможен запуск и в качестве отдельного демона.

Проверяем, запущен ли inetd:

ps -ax | grep inetd

Если inetd не запущен, включаем и запускаем:

printf '\ninetd_enable=\"YES\"\n' >>/etc/rc.conf
/etc/rc.d/inetd start

В inetd.conf открываем порт 995 (pop3s) с запуском Qpopper при подключении клиента:

pop3s   stream  tcp     nowait  root    /usr/local/libexec/qpopper      qpopper -f /usr/local/etc/qpopper.conf

Добавляем строку командой:

printf "\npop3s\tstream\ttcp\tnowait\troot\t/usr/local/libexec/qpopper\tqpopper -f /usr/local/etc/qpopper.conf\n" >>/etc/inetd.conf

Либо редактором:

ee /etc/inetd.conf

Перезагружаем конфиг Inetd:

/etc/rc.d/inetd reload

Проверяем, открылся ли порт:

sockstat -4l | grep 995

Брандмауэр

Если требуется раздавать почту в интернет, разрешаем входящие TCP соединения на порт 995. Для ipfw правило будет примерно следующее:

allow tcp from any to me dst-port 995 setup keep-state

Для административного доступа, в целях безопасности, имеет смысл разрешить соединения только с IP администратора.

Переадресация почты

Доступ к root-ящику по умолчанию закрыт, настраиваем пересылку root-почты обычному пользователю.

Создаем пользователя командой adduser. Для предотвращения терминального доступа, в качестве оболочки указываем nologin.

Правим файл aliases:

ee /etc/mail/aliases

Раскомментируем строчку:

root: me@my.domain

Вместо me@my.domain задаем имя созданного пользователя. Собачку и домен указывать не обязательно. Можно указать несколько получателей через запятую.

Обновляем базу Sendmail:

newaliases

Переносим имеющуюся root-почту пользователю mailuser:

cd /var/mail
cat root >> mailuser
rm root

APOP-авторизация Qpopper

В случае с шифрованием трафика, безопасная авторизация не имеет особого смысла. Но для APOP-авторизации Qpopper использует собственную базу паролей. При этом пароль пользователя может не совпадать с паролем на вход в систему. Настраиваем только если это необходимо.

Обновить пути поиска (чтобы найти свежеустановленный qpopauth):

rehash

Создать базу APOP-авторизации:

qpopauth -init

Задать пароль пользователя:

qpopauth -user mailuser

Отобразить список пользователей в базе:

qpopauth -list ALL

Удалить пароль пользователя:

qpopauth -delete mailuser

Тестирование и решение проблем

Отправляем тестовое сообщение:

echo test | mail -E -s 'Test mail' root

Настраиваем почтовый клиент. Указываем, что используется шифрование SSL/TLS и 995 порт. Получаем почту.

В случае проблем смотрим сообщения в /var/log/messages

grep qpopper /var/log/messages

Выполняем тестовое подключение к серверу:

openssl s_client -connect 127.0.0.1:995

Мониторим трафик:

tcpdump -ni if0 tcp port 995

Если подключение к серверу проходит успешно, но почтовый ящик пуст. Проверяем наличие почтового ящика и его содержимое:

ls -l /var/mail
cat /var/mail/mailuser

Проверяем лог sendmail на предмет ошибок доставки:

cat /var/log/maillog

Если лог содержит: "gethostbyaddr(192.168.0.1) failed: 1", задаем в /etc/hosts полное имя узла, включая домен для данного адреса.

Проверяем связь c локальным SMTP сервером:

telnet 127.0.0.1 25

Если получаем ошибку соединения, проверяем, запущен ли sendmail, и разрешены ли локальные подключения в брандмауэре.

Пользовательские уведомления

Отчеты о статусе системы формируются командой periodic. Формирование отчета выполняется путем запуска сценариев из /etc/periodic и /usr/local/etc/periodic, ниже следуют подпапки соответствующие дневному, недельному и месячному отчету. Параметры системных сценариев можно задать, создав файл /etc/periodic.conf. Значения по умолчанию задаются в /etc/defaults/periodic.conf.

Вывод заданий cron также отправляется в почтовый ящик пользователя, от имени которого выполняется задание.

Командой mail можно отправить уведомления из любого сценария.

В качестве примера, рассмотрим скрипт уведомления о перезагрузках системы.

ee /usr/local/etc/rc.d/RebootNotify

 Создаем rc-скрипт, который при запросе остановки, отправляет уведомление об остановке системы, при запросе старта - уведомляет о старте. Если получаем письмо о старте но не получаем об остановке, значит имеем факт некорректной перезагрузки.

#!/bin/sh
#
# PROVIDE: RebootNotify
# REQUIRE: mail
# KEYWORD: shutdown
#

. /etc/rc.subr

name="RebootNotify"
rcvar=${name}_enable

load_rc_config $name

start_cmd='RebootNotify_start'
stop_cmd='RebootNotify_stop'

RebootNotify_start() {
echo Send start notify
echo System start | /usr/bin/mail -E -s System\ start root
}

RebootNotify_stop() {
echo Send stop notify
echo System stop | /usr/bin/mail -E -s System\ stop root
}

run_rc_command "$1"

 

Задаем права доступа:

chmod 755 /usr/local/etc/rc.d/RebootNotify

Включаем запуск скрипта в rc.conf:

printf '\nRebootNotify_enable=\"YES\"\n' >>/etc/rc.conf

Проверяем:

/usr/local/etc/rc.d/RebootNotify restart

Хорошей практикой в плане безопасности будет настроить формирование статистики для всех публичных служб, работающих на сервере. Чтобы быть в курсе того, как используются ваш сервер. Реализация статистики зависит от конкретных служб и интенсивности их использования.

Ссылки:

Документация к Qpopper: http://www.eudora.com/products/unsupported/qpopper/documentation.html

Настройка SMTP-сервера Postfix: FreeBSD: Почтовая система среднего офиса на базе Postfix

Другие реализации POP3, IMAP протоколов: Dovecot, Courier Mail Server (courier-imap)