Что такое хороший почтовый сервер? Это такой почтовик, который можно один раз настроить, запустить и забыть про его существование. Забыть, потому что он никогда более не потребует внимания к себе, будет исправно гонять почту, удалять спам и вирусы. На удивление построить такой сервер очень просто, тем более под ALT Linux Master 2.4. Надо только забыть про то, что когда-то программы собирались вручную из исходников, засоряли файловую систему и были совершенно неподконтрольны администратору системы. Итак, для создания хорошего почтового сервера потребуются: * Postfix с поддержкой SASL и TLS, * Cyrus-SASL * OpenLDAP, * Courier-imap, * Amavisd-new, * Clamav, * Spamassassin.
По традиции, описание начнём с openldap. В директории будут хранится почтовые учётные записи.
Для простоты приведу только отличия от дефолтной конфигурации
# Добавим эти две схемы include /etc/openldap/schema/courier.schema include /etc/openldap/schema/qmail.schema
с qmail.schema вас ждёт засада, поскольку по недосмотру майнтейнера в пакет попала устаревшая схема, которую openldap не поймёт. Простой workaround - вытащить последнюю версию схемы из qmail-ldap patch и уложить её в /etc/openldap/schema/.
Далее описание самой базы: database bdb suffix "dc=gorodmasterov,dc=com" rootdn "cn=admin,dc=gorodmasterov,dc=com" rootpw {SSHA}***************************** directory /var/lib/ldap/bases/gm index objectClass eq index uid pres,eq,sub index cn pres,eq,sub,subany access to attrs=userPassword by self write by anonymous auth by dn="cn=courier,ou=Daemons,dc=gorodmasterov,dc=com" read by * none access to * by * read
Здесь и далее, указание {SSHA}*******.. означает пароль в формате SSHA. Сгенерировать такой пароль можно при помощи утилиты slappasswd.
dn: cn=Lettiev V.V.,ou=Users,dc=gorodmasterov,dc=com objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: qmailUser cn: Lettiev V.V. uid: admin accountStatus: active mailMessageStore: admin/Maildir/ userPassword: {SSHA} *********************************** displayName: Vladimir Lettiev sn: Lettiev givenName: Vladimir initials: V o: Gorod Masterov mail: admin@gorodmasterov.com mailAlternateAddress: crux@gorodmasterov.com mailAlternateAddress: Vladimir.Lettiev@gorodmasterov.com
Следующей командой внесём данные из файла в базу: $ ldapadd -x -W -D 'cn=admin,dc=gorodmasterov,dc=com' -f base.ldif
Итак мы получим базовый набор - организация, в ней три контейнера: Users - там будут учётки пользователей, Groups - группы пользователей, Daemons - учётки программ, которые будут подключаться к ldap. Создаются также три пользователя: courier - учётная запись, под которой будет подключаться courier-imap к ldap. Если вы обратили внимание, то для этого пользователя в настройках LDAP даётся право заглядывать в аттрибут userPassword пользователей. postfix - учётная запись, под которой будет подключаться postfix к ldap. Lettiev V.V. - это собственно первая учётная запись почтового пользователя.
2. Postfix
Postfix, идущий в поставке ALM24 не имеет патча, дающего поддержку TLS, также не собирается и поддержка SASL. Объясняется это просто - данные компоненты ухудшают безопасность почтового сервера, поскольку являются сторонними с большой историей security проблем в прошлом, а postfix разрабатывался с упором на безопасность (иначе чем он лучше sendmail, не так ли?). Но поскольку функционал востребован, сборка postfix с необходимыми патчами есть в Daedalus (репозиторий Altlinux для нестабильных пакетов или альтернативных сборок пакетов). Наша задача пересобрать данный пакет в окружении ALM24.
Тут возможно сообщение о ненайденом rpmbuild. Это значит, что вам надо сказать sudo apt-get install rpm-build. Также может (и наверняка) сказать, что для сборки требуются установить те или иные пакеты. Опять же apt-get install вам в помощь.
После сборки:
$ cd ~/RPM/RPMS/i686/ $ sudo apt-get install postfix-2.0.20-alt2.1.i686.rpm postfix-ldap-2.0.20-alt2.1.i686.rpm postfix-pcre-2.0.20-alt2.1.i686.rpm
Создадим системного пользователя vmail:vmail (uid=499, gid=499) - этот пользователь будет владеть всей почтой. Все же пользователи у нас будут виртуальными.
# имя хоста myhostname = mail.gorodmasterov.com # имя домена mydomain = gorodmasterov.com # это то, что идёт после собачки в email-адресах myorigin = $mydomain
# слушаем на всех интерфейсах inet_interfaces = all # доставка локальным юзерам отсутствует. всё делаем через виртуальный транспорт mydestination = unknown_local_recipient_reject_code = 550 # адреса локальной сети, для которых мы разрешаем релеить почту mynetworks = 192.168.1.0/24, 127.0.0.0/8
# почтовый ящик в формате Maildir home_mailbox = Maildir/ smtpd_etrn_restrictions = permit_mynetworks, reject smtpd_helo_required = yes # примаем отправляемую почту для тех, кто прошёл smtp_auth или в локальной сети. Остальных посылаем. smtpd_recipient_restrictions=permit_sasl_authenticated permit_mynetworks reject_unauth_destination smtpd_sasl_auth_enable = yes smtpd_sasl_security_options = noanonymous smtpd_sasl_local_domain = broken_sasl_auth_clients = yes
smtp_use_tls = yes
# Здесь указан путь к сертификату, который мы сгенерируем позже. smtp_tls_key_file = /var/lib/ssl/certs/imapd.pem smtp_tls_cert_file = $smtp_tls_key_file smtp_tls_CAfile = $smtp_tls_key_file smtp_tls_note_starttls_offer = yes
# включать возможность авторизации только в режиме tls smtpd_tls_auth_only = yes
# использовать tls для приема почты smtpd_use_tls = yes smtpd_tls_loglevel = 1 smtpd_tls_received_header = yes smtpd_tls_session_cache_timeout = 3600s tls_random_source = dev:/dev/urandom
Отличия в master.cf значительные (от дефолтных). Создаётся дополнительный pre-cleanup, в котором не происходит разрешения алиасов, чтобы избежать дублирования почты из-за двойного лукапа (создаваемый вследствии наличия фильтра amavis). Указываются настройки для фильтра почты - amavis.
В /etc/courier-imap/authdaemon.conf сокращается список модулей до одного: authmodulelist="authldap"
В файлах /etc/courier-imap/{imapd,pop3d} указывается параметр ADDRESS=0.0.0.0 чтобы сервис сидел на всех интерфейсах (а не только на lo).
Чтобы сгенерировать сертификаты для возможности запуска imapds и pop3ds (которые также будут использоваться и для TLS в postfix), надо отредактировать файлы: /etc/courier-imap/{imapd.cnf,pop3s.cnf} Здесь собственно требуется привести в порядок секцию [ req_dn ], где указать корректную информацию о организации и главное FQDN (имя хоста, аттрибут CN) почтового сервера. После этого запуск скриптов mkpop3dcert, mkimapdcert (/usr/share/courier-imap), создаст корректные сертификаты.
Думаете всё? Нет. Специфика АЛьТа: в файле /etc/sysconfig/courier-imap указать параметр DEFAULT_AUTHD=ldap , иначе он не будет подгружать ldap-модуль аутентификации.
5. Amavisd-new + (clamav, spamassassin) - Анти{спам|вирус} - в одном флаконе.
Что произойдёт, если вы сделаете $ sudo apt-get amavisd-new
Правильно, в вашу систему доустановится куча пакетов, включая clamav и spamassassin. Если скажет, что такого пакета нет, значит вы забыли подключить contrib'ы в настройках apt (sources.list).
Amavisd-new - служит посредником между MTA и антивирусом|антиспамом. Настраивается практически со всеми известными антивирусами и в частности clamav - опенсоурс антвирус, подающий большие надежды. Разочаровавшись в drweb и kav (из-за их тупой лицензионной политики и стоимости), я выбрал clamav и не пожалел. Spamassassin - единственный спам-фильтр, который мне удалось найти.
Настройка:
Файл настройки /etc/amavis/amavisd.conf, есть по сути perl-скрипт с настройками. Изменить пришлось всего один параметр: $mydomain = 'gorodmasterov.com'
После долгого боя с юзерами, подправил и переменную $banned_filename_re , чтобы могли отсылать файлы "*.exe".
Все остальные параметры, касаемые clamav и spamassassin уже настроены. Т.о. по уже расписанным выше настройкам postfix'а всё будет работать сразу и без промедления.
Запускаем почтовый сервер.
Теперь необходимо убедиться, что все сервисы описанные выше: postfix, amavisd, saslauthd, clamav, courier-*, slapd прописаны на запуск при старте системы (chkconfig --list). Теперь стартуем их в порядке, в котором они стартуют в /etc/rc3.d/. Если всё нормально, то мы получим работающую почтовую систему, но пока со всего одним пользователем. Чтобы пользователей стало побольше, можно использовать в качестве примера ldif-файл, приведённый выше для openldap. Стоит помнить, что атрибут mail - это основной адрес пользователя. Если вы хотите навесить ему алиасы, используйте атрибут mailAlternateAddress, которых может быть сколько угодно. Также можно незаметно читать чужую почту, навесив себе в алиас email какого-либо существующего пользователя ;)
Или вот такой простой скрипт на перле для добавления почтовых пользователей (для его работы надо установить пакет perl-ldap):
#!/usr/bin/perl # # addmailuser - adding new mail user #
#### LDAP #### use Net::LDAP;
my $ldapsrv = "localhost"; my $ldapadmin = "cn=admin,dc=gorodmasterov,dc=com"; my $ldappw = "****************";