Ода DJB
Стопроцентно безопасных программ не бывает. Но есть те, которые приблизились к этому показателю вплотную. Именно такие программы пишет американский профессор-математик Daniel Bernstein (http://cr.yp.to). Как и любой гений, он стоит в оппозиции по отношению ко многим вещам, и ему многое в этом мире не нравится. Например, ему не нравится то, что самый популярный dns-сервер BIND от Internet Systems Consortium, ставший стандартном де-факто для использования на UNIX-серверах, представляет собой весьма жалкое зрелище с точки зрения безопасности и дизайна. То же самое можно сказать о другом неписаном стандарте - почтовом сервере Sendmail. И хотя уже проходят те времена, когда эти ровесники интернета требовали исключительно права суперпользователя для работы, ожидая по свою душу очередного remote root эксплойта, хотя многое изменилось в лучшую сторону, стопроцентного доверия они так и не заслужили (и не заслужат: груз истории уязвимостей давит). Возможно, именно это побудило djb (так в интернете сокращенно зовут Бернштейна) написать свою реализацию dns-сервера под названием djbdns и smtp/pop3-сервера - qmail. Разумеется, qmail - не единственная безопасная альтернатива sendmail. Postfix - не уступающая по функциональности sendmail альтернатива от известного security-эксперта Wietse Venema. Но вот широко распространенных и безопасных, проверенных временем альтернатив BIND, кроме djbdns, похоже, не существует. Кроме того, программы djb многим не нравятся тем, что они разрушают годами складывавшиеся неписаные стандарты. Для чего? Не всегда "как есть" означает "как правильно".
Перед погружением
В качестве операционной системы для построения высокопроизводительного надежного почтового сервера выберем FreeBSD 5.3 - лучшую серверную операционную систему на сегодняшний день ;). Детально процесс обновления системы до 5.3-STABLE описан в этом же номере, так что будем считать, что у тебя уже имеется свежая система с актуальным деревом портов. Поехали!
Первым делом ставим daemontools и ucspi-tcp.
С ucspi-tcp придется немного повозиться. Дело в том, что для доступа к нашему будущему pop3/smtp-серверу с использованием безопасного ssl-соединения нужно пропатчить ucsp-tcp на предмет умения работы с SSL. По каким-то причинам этот патч отсутствует во FreeBSD-порте ucspi-tcp. Так что придется применить его руками.
Ничто не идеально. И софт djb тоже. Его основная проблема в том, что написан он был давно и "на раз". "Чистая" версия qmail обделена многим из той функциональности, которая требуется от современных почтовых серверов. SSL, TLS, SMTP AUTH, Greylisting, поддержка LDAP - все эти и многие другие возможности добавляются в qmail сторонними патчами, за которые автор qmail не отвечает. Так что если окунешься в мир программного обеспечения djb, будь готов запутаться в patch’ах, patchkit’ах, и patch’ах к patchkit’ам ;).
Вам письмо!
Пришло время ставить qmail в качестве pop3/smtp-сервера. Нас интересует порт с поддержкой SMTH-аутентификации и TLS.
Авторизацию будем выполнять с помощью утилиты checkpassword.
# cd /usr/ports/security/checkpassword && make install clean
Затем сообщим системе, что у нас теперь qmail вместо sendmail:
Добавляем необходимых пользователей. Почти каждый процесс в qmail работает под отдельной учетной записью.
Настало время настроить qmail. Делается это, как водится, командой echo ;).
Мы указали qmail его имя, то, на какие домены принимать почту и какие домены считать локальными. Затем создадим alias’ы на root'а и прочих пользователей, которым могут написать, но которые не смогут ее получить. Вся направляемая им почта будет скидываться пользователю toxa.
По умолчанию qmail использует формат почтового ящик Maildir, разработанный все тем же djb. В отличие от традиционного mbox, в котором вся почта складывается в один файл, Maildir хранит каждое письмо в отдельном файле.
По-моему, это вполне удобно, и нет нужды менять принятое по умолчанию поведение qmail. Создадим себе Maildir с помощью утилиты maildirmake:
# maildirmake /home/toxa/Maildir
В появившемся каталоге Maildir увидишь три папки, cur new tmp. Новая почта сваливается в new. Так как сервер у нас будет доступен и по защищенному SSL-протоколу, сгенерируем себе самоподписанный сертификат для почты. Заметь, файл должен содержать как открытый ключ, так и секретный, так что с точки зрения x509 это не совсем сертификат (строго говоря, сертификат = открытый ключ + дополнительная информация):
Запуск qmail будет осуществлять tcpserver из установленного нами набора ucspi-tcp. Мы запустим по два экземпляра pop3- и smtp-сервера, без SSL (на 110 и 25 портах соответственно) и с SSL (на 995 и 465 портах).
exec /var/qmail/rc
Как видно, цель этих скриптов - установить переменные окружения и запустить tcpserver, который, в свою очередь, запускает соответствующий бинарник qmail-* c аргументами. В случае использования SSL мы указали путь к сертификату, в скриптах запуска smtpd/smtpds прописали checkpassword - это и есть поддержка smth auth в qmail. Заметь, что tcpserver также контролирует доступ согласно /var/qmail/tcp.smtp.cdb. Займемся этим файлом позже.
Спаму и вирусам - бой!
Без антиспам-системы сегодня не обходится ни один приличный почтовик. То же самое можно сказать и об антивирусном контроле проходящей через сервер корреспонденции. Потому мы призовем на помощь лучшие силы OpenSource в этой области - SpamAssassin и ClamAV AntiVirus.
Существует два принципиально разных подхода к фильтрации спама: так называемые server side и client side. Фильтрация на стороне сервера направлена на то, чтобы просто не принимать соединения от машин, которые рассылают спам. Собственно, она и основывается на технологиях определения "доверия" удаленным серверам, таким как Greylisting и RBL Checking (Blacklist checking). Само же письмо при этом, разумеется, никоим образом не затрагивается. Фильтрация на стороне клиента основана на определении вероятности того, что полученное письмо является спамом. Для этого применяются сложные статистические, лингвистические и эмпирические тесты, например, Bayes analysis.
Внесем в конфигурационный файл необходимые изменения:
# В случае спама будем добавлять в заголовок письма уведомление и количество баллов.
rewrite_header Subject **[SPAM](_SCORE_)**
# Спам будет пересылаться вложением в уведомление почтовой системы.
report_safe 0
# включать статистику в заголовки письма
report_header 1
# Делаем систему самообучаемой
bayes_path /usr/local/etc/mail/spamassassin/
Протестируем работу spamd натравив на него какое-нибудь письмо:
# cat message | spamc
На stdout будет выведено письмо со статистической информацией в заголовках:
Ставим clamav:
Freshclam будет регулярно обновлять базу штаммов вирусов, clamd будет непосредственно отвечать за анализ файлов.
Объединяем все воедино
Подробнее про все опции читай в README. Принцип работы simscan заключается в подмене оригинальной программы процессинга почтовой очереди /var/qmail/bin/qmail-queue на /var/mail/bin/simscan, которая умеет обращаться к spamd/clamd, а в остальном ведет себя так же, как и qmail-queue. Вот тут мы и вернемся к файлу /var/qmail/tcp.smtp.cdb. Создай в /var/qmail файл следующего содержания:
Затем преврати его в cdb:
# tcprules tcp.smtp.cdb tcp.smtp.cdb.tmp %26lt; tcp.smtp
В этом файле устанавливаем переменные окружения для хостов. RELAYCLIENT позволяет указанному хосту использовать qmail для пересылки почты хостам, не указанным в rcpthosts, то есть использовать сервер как relay. Мы разрешили это локальному хосту и нашей подсети 192.168.0.0/24. Очевидно, что все остальные будут уметь доставлять почту только тем хостам, которые обслуживает qmail (в нашем случае это mail.mydomain.ru). Таким образом, promisc relay исключен. Как же клиенты будут отправлять почту, например, из дома? Для этого мы и включили smtp-авторизацию, а упомянутый выше checkpassword именно тем и занимается, что после проверки пароля выставляет для сессии переменную RELAYCLIENT, позволяя пересылать почту. Также для всех хостов, кроме локального, мы переписали переменную QMAILQUEUE, чтобы она указывала на simscan. Вот теперь запускаем все четыре экземпляра qmail:
Проверяем работу системы, посылая почту из локальной сети и из интернета, убеждаемся, что без smth auth снаружи не пускает, смотрим логи clamd/spamd. Если все работает, радуемся и запускаем систему в эксплуатацию. Если нет - идем на www.google.com и учимся пользоваться поиском :).
Мнение эксперта
Андрей Матвеев, редактор рубрик "Юниксоид" журнала "Хакер" (andrushock@real.xakep.ru)
В наши дни все больше внимания уделяют обеспечению комплексной безопасности систем электронной почты. Различные организации создают целые проекты по поддержанию так называемых "черных" списков, в которые занесены адреса отправителей, занимающихся массовой рассылкой информации рекламного характера. Разработчики программного обеспечения постоянно совершенствуют спам-фильтры, выпускают новые версии почтовых пользовательских агентов (MUA) и серверов SMTP/POP3/IMAP4, обладающих встроенной поддержкой аутентификации клиентов и шифрования передаваемых данных. Изо дня в день антивирусные компании трудятся не покладая рук над обновлениями к своим продуктам. Но, как показывает практика, велика вероятность того, что мы можем стать заложниками собственных средств защиты, так как добрый процент корреспонденции будет просто застревать в нашем же каскаде RBL-листов, почтовых фильтров, хэшированных базах доступа и, соответственно, не доходить до получателя. Поэтому тут главное не переборщить с защитой и выработать грамотную политику (к примеру, "что делать со спамом?" - удалять немедленно или доставлять клиенту с модифицированной темой письма).