Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> почтовые системы —> Postfix + LDAP

Postfix + SASL + LDAP + Courier-IMAP + SSL

Автор: fr33man.


Обновленная версия статьи лежит здесь.


Потребовалось настроить почтовую систему для моего домена. Причем нужно было, как то связать почтовый сервер и базу LDAP, так как в LDAP
хранилась вся информация о пользователях. Пошарив инет, я нашел, то что меня интересовало в первую очередь — схема для ldap сервера(в принципе
можно и самому написать было, но лень :))) После этого, выбрав в качестве MTA Postfix, я быстренько все настроил, и чтобы не забыть как я все
это сделал, решил написать how-to.
Еще немного, про софт, который я использую:
cyrus-sasl используется postfix'ом для авторизации пользователей.
LDAP — база данных, где храниться информация о пользователях
Postfix — MTA, программа, которая и будет отсылать/принимать сообщения и расскладывать их в ящики пользователей
Courier-imap — MUA, программа, которая позволяет забрать письма пользователю с сервера.
Для начала советую прочесть данную статью.
Итак, приступим к установке и настройке.

Сначала, необходимо произвести изменения на стороне LDAP сервера. Качаем схемку для почты здесь и кладем ее в
/usr/local/etc/openldap/schema/mail.schema. Это схема от qmail, но она подойдет.
Вносим изменения в slapd.conf, добавляем:

include         /usr/local/etc/openldap/schema/mail.schema

После этого перезапускаем slapd. Теперь необходимо поглумиться над пользователми и добавить каждому новый класс и пару аттрибутов.
У меня 81 пользователь и мне было лень добавлять аттрибуты вручную, поэтому я написал такой скриптик:

#!/usr/bin/perl

# Открываем файл с юзверями
open(USERS, "<users" );
# и читаем все в массив
@all = <USERS>;
# Закрываем файлик
close(USERS);

foreach $user (@all)
{
# Удаляем символы \n в имени юзера
        chomp($user);
# Создаем ldif файл для пользователя
        open(LDIF, ">/tmp/".$user.".modify.ldif");
# Описываем ldif файл
        print LDIF "dn: cn=".$user.",ou=users,dc=l1523,dc=ru\n";
        print LDIF "changetype: modify\n";
        print LDIF "add: objectClass\n";
        print LDIF "objectCLass: qmailUser\n";
        print LDIF "-\n";
        print LDIF "add: mail\n";
        print LDIF "mail: ".$user."\@mail.teachers\n";
        print LDIF "-\n";
        print LDIF "add: mailMessageStore\n";
        print LDIF "mailMessageStore: ".$user."/\n";
        print LDIF "-\n";
        print LDIF "add: mailQuotaSize\n";
        print LDIF "mailQuotaSize: 10485760\n";
        print LDIF "-\n";
        close(LDIF);
# Вносим изменения в директории LDAP
        system("/usr/local/bin/ldapmodify -x -D \"cn=root,dc=l1523,dc=ru\" 
        -w ROOT_PASSWORD -f /tmp/".$user.".modify.ldif");
# удаляем временный файл
        system("rm -rf /tmp/".$user.".modify.ldif");
}

Для корректной работы, необходимо занести в users всех пользователей, которым необходимо добавить аттрибуты. Делается это например так:


spider@/home/fr33man/> ldapsearch -LLL -b 'ou=users,dc=l1523,dc=ru' \
? -x '(|(cn=*)(uid=*))' | \
? grep dn: | awk '{print $2}' | cut -f 2 -d "=" | cut -f 1 -d "," > users
spider@/home/fr33man/>

Теперь можно запускать скриптик. После этого, можно посмотреть изменения:


spider@/home/fr33man/> ldapsearch -LLL -x -b 'dc=l1523,dc=ru' \
?  'uid=fr33man' | grep mail
objectClass: qmailUser
mailAlternateAddress: root@mail.teachers
mail: fr33man@mail.teachers
mailMessageStore: fr33man/
mailQuotaSize: 10485760
spider@/home/fr33man/>

Да, как видите, тут присутствует еще один аттрибут: mailAlternateAddress, это alias для моего ящика. То есть письма для root@mail.teachers будут
идти на адресс fr33man@mail.teachers. Это добавил я, а не скрипт. Все, на стороне LDAP сервера изменения внесены. Теперь переходим непосредственно
к настройке mail сервера.

Первым делом, как всегда, обновляем порты, и ставим cyrus-sasl2:

mail@/> cd /usr/ports/security/cyrus-sasl2-saslauthd/
mail@/usr/ports/security/cyrus-sasl2-saslauthd> make -DWITH_OPENLDAP install clean

... skipped ...

mail@/usr/ports/security/cyrus-sasl2-saslauthd>

Теперь составим конфиг для sasl:


mail@/> cd /usr/local/lib/sasl2/
mail@/usr/local/lib/sasl2> cat smtpd.conf
pwcheck_method: saslauthd
mech_list: CRAM-MD5 DIGEST-MD5 PLAIN LOGIN
log_level: 3
mail@/usr/local/lib/sasl2>

Осталось запустить saslauthd:


mail@/usr/local/lib/sasl2> echo saslauthd_enable=\"YES\" >> /etc/rc.conf
mail@/usr/local/lib/sasl2> echo saslauthd_flags=\"-a ldap\" >> /etc/rc.conf
mail@/usr/local/lib/sasl2> /usr/local/etc/rc.d/saslauthd.sh start
Starting saslauthd.
mail@/usr/local/lib/sasl2> ps ax | grep sasl
15036  ??  Ss     0:00,01 /usr/local/sbin/saslauthd -a ldap
15037  ??  S      0:00,00 /usr/local/sbin/saslauthd -a ldap
15038  ??  S      0:00,00 /usr/local/sbin/saslauthd -a ldap
15039  ??  S      0:00,00 /usr/local/sbin/saslauthd -a ldap
15040  ??  S      0:00,00 /usr/local/sbin/saslauthd -a ldap
15042  p2  R+     0:00,00 grep sasl
mail@/usr/local/lib/sasl2>

Усе, с sasl'ом разобрались. Идем дальше — postfix:


mail@/> cd /usr/ports/mail/postfix
mail@/usr/ports/mail/postfix> make config

     ---------------------------------------------------------------------¬
     ¦                   Options for postfix 2.3.4,1                      ¦
     ¦ -----------------------------------------------------------------¬ ¦
     ¦ ¦[X] PCRE      Perl Compatible Regular Expressions               ¦ ¦
     ¦ ¦[ ] SASL      Cyrus SASLv1 (Simple Auth. and Sec. Layer)        ¦ ¦
     ¦ ¦[X] SASL2     Cyrus SASLv2 (Simple Auth. and Sec. Layer)        ¦ ¦
     ¦ ¦[ ] DOVECOT   Dovecot SASL authentication method                ¦ ¦
     ¦ ¦[ ] SASLKRB   If your SASL req. Kerberos select this option     ¦ ¦
     ¦ ¦[ ] SASLKRB5  If your SASL req. Kerberos5 select this option    ¦ ¦
     ¦ ¦[ ] SASLKMIT  If your SASL req. MIT Kerberos5 select this option¦ ¦
     ¦ ¦[X] TLS       Enable SSL and TLS support                        ¦ ¦
     ¦ ¦[ ] BDB       Berkeley DB (choose version with WITH_BDB_VER)    ¦ ¦
     ¦ ¦[ ] MYSQL     MySQL maps (choose version with WITH_MYSQL_VER)   ¦ ¦
     ¦ ¦[ ] PGSQL     PostgreSQL maps (choose with DEFAULT_PGSQL_VER)   ¦ ¦
     ¦ ¦[X] OPENLDAP  OpenLDAP maps (choose ver. with WITH_OPENLDAP_VER)¦ ¦
     ¦ ¦[ ] CDB       CDB maps lookups                                  ¦ ¦
     ¦ ¦[ ] NIS       NIS maps lookups                                  ¦ ¦
     ¦ ¦[X] VDA       VDA (Virtual Delivery Agent)                      ¦ ¦
     ¦ ¦[ ] TEST      SMTP/LMTP test server and generator               ¦ ¦
     +-L----v(+)----------------------------------------------------------+
     ¦                       [  OK  ]       Cancel                        ¦
     +---------------------------------------------------------------------

mail@/> make install clean
... skipped ...
mail@/usr/ports/mail/postfix> rehash

Составляем конфиг для postfix:

# От меня. )) 
# Сразу оговорюсь, конфиг составлял не я, а мой хороший друг Alex_hha
# Оригинал его статьи и его конфиг можно увидеть здесь:
# http://turbogaz.kharkov-ua.com/unix/mail/mail-howto-p1.php
# Мое описание тут только о LDAP и еще несколько строк, о которых я скажу
# Так что копирайт конфига не мой. )) Все дружно благодарим Алексея.

#
# /usr/local/etc/postfix/main.cf
#

# LOCAL PATHNAME INFORMATION
#
# Указываем месторасположения директории очереди postfix. Также данная
# директория является корнем, когда postfix запускается в chroot окружении.
queue_directory = /var/spool/postfix

# Задает месторасположение всех postXXX команд (postmap, postconf, postdrop)
command_directory = /usr/local/sbin

# Задает месторасположение всех программ демонов postfix. Это программы,
# перечисленные в файле master.cf. Владельцем этой директории должен быть root
daemon_directory = /usr/local/libexec/postfix

# QUEUE AND PROCESS OWNERSHIP
#
# Задает владельца очереди postfix, а также большинства демонов postfix.
# В целях безопасности, необходимо использовать выделенную учетную запись.
# Т.е. от данного пользователя не должны запускаться какие-либо процессы
# в системе, а также он не должен являться владельцем каких-либо файлов.
mail_owner = postfix

# Права по умолчанию, использующиеся local delivery agent. Не указывайте
# здесь привилегированного пользователя или владельца postfix.
default_privs = nobody

# INTERNET HOST AND DOMAIN NAMES
#
# Задает имя хоста в формате FQDN. По умолчанию, используется значение,
# возвращаемой функцией gethostname().
myhostname = mail.teachers

# Задает имя нашего домена. По умолчанию используется значение $myhostname
# минус первый компонент.
mydomain = mail.teachers

# SENDING MAIL
#
# Данный параметр указывает имя домена, которое используется при отправлении
# почты с этой машины. По умолчанию, используется имя локальной машины -
# $myhostname. Для согласованности между адресами отправителя и получателя,
# myorigin также указывает доменное имя, которое добавляется к адресу
# получателя для которого не указана доменная часть.
# myorigin = $myhostname (отправлять письма от: "alex@freebsd.turbogaz.net")
# myorigin = $mydomain (отправлять письма от: "alex@turbogaz.net")
myorigin = $mydomain

# RECEIVING MAIL
#
# Указывает адреса сетевых интерфейсов, на которых будет принимать почту
# наша почтвая система. По умолчанию используются все активные интерфейсы
# на машине. При изменении этого праметра необходимо перезапустить postfix
inet_interfaces = all

# Данный параметр указывет список доменов, для которых почта будет доставляться
# локально, а не пересылаться на другой хост.
mydestination = localhost.$mydomain, localhost

# REJECTING MAIL FOR UNKNOWN LOCAL USERS
#
# Указывает код ответа SMTP сервера для несуществующих пользователей
unknown_local_recipient_reject_code = 550

# TRUST AND RELAY CONTROL
#
# Данный параметр задает список "доверенных" клиентов, которые обладают
# некоторыми привилегиями. В частности доверенным SMTP клиентам дозволено
# пересылать почту через postfix. Если вы не доверяете никому, то оставьте
# только 127.0.0.0/8
mynetworks = 127.0.0.0/8

# ALIAS DATABASE
#
# Данный параметр указывает список алиасов, используемый local delivery agent
alias_maps = hash:/etc/mail/aliases

# JUNK MAIL CONTROLS
#
# The controls listed here are only a very small subset. The file
# SMTPD_ACCESS_README provides an overview.

# The header_checks parameter specifies an optional table with patterns
# that each logical message header is matched against, including
# headers that span multiple physical lines.
#
# By default, these patterns also apply to MIME headers and to the
# headers of attached messages. With older Postfix versions, MIME and
# attached message headers were treated as body text.
#
# For details, see "man header_checks".
#
#header_checks = regexp:/usr/local/etc/postfix/header_checks

# SHOW SOFTWARE VERSION OR NOT
#
# Желательно сообщать как можно меньше информации о нашем почтовом сервере ;)
# Согласно требованиям RFC вы должны указать $myhostname вначале текста
smtpd_banner = $myhostname mail server

# DEBUGGING CONTROL
#
# Задает уровень информативности, когда имя или адрес SMTP клиента
# или сервера соответствует шаблону заданному в параметре debug_peer_list.
# Следует использовать только во время отладки.
#debug_peer_level = 2
#debug_peer_list = 127.0.0.1
#debug_peer_list = teachers

# Это уже я писал, только про эту строчку.
# Захотелось получать сообщения ою ошибках на русском
# Если сообщения на русском не нужны, то закомментируйте данную строку
bounce_template_file = /usr/local/etc/postfix/bounce.cf

# RESTRICTIONS
#
# client, helo, sender, recipient, data, end-of-data
#
# Отклонять запрос, если хост не имеет в DNS A или MX записи.
#smtpd_helo_restrictions = reject_unknown_hostname

# Отклонять запрос, когда клиент посылает SMTP команду раньше времени.
smtpd_data_restrictions = reject_unauth_pipelining

# Отклонять команду ETRN
smtpd_etrn_restrictions = reject

# Заставляем отклонять почту с неизвестным адресом отправителя.
# Позволяет бороться с червями и некоторыми вирусами.
#smtpd_reject_unlisted_sender = yes

# Отключает SMTP команду VRFY. В результате чего, невозможно определить
# существование определенного ящика. Данная техника (применение команды
# VRFY) используется спамерами для сбора имен почтовых ящиков.
disable_vrfy_command = yes

# Требуем, чтобы удаленный SMTP клиент представлял себя
# в начале SMTP сессии с помощью команды HELO или EHLO.
smtpd_helo_required = yes

# Всегда отправлять EHLO вначале SMTP сессии
smtp_always_send_ehlo = yes

# Максимальное количество ошибок, которое может сделать удаленный SMTP клиент.
# При превышение данного числа Postfix отсоединится.
smtpd_hard_error_limit = 8

# Интервал времени в течение которого SMTP сервер Postfix должен послать ответ,
# а удаленный SMTP клиент получить запрос
smtpd_timeout = 30s

# Интервал времени, в течение которого SMTP клиент должен послать
# SMTP команду HELO или EHLO и получить ответ сервера.
smtp_helo_timeout = 15s

# Интервал времени, в течение которого SMTP клиент должен послать
# SMTP команду RCPT TO и получить ответ сервера.
smtp_mail_timeout = 15s

# Интервал времени, в течение которого SMTP клиент должен послать
# SMTP команду MAIL FROM и получить ответ сервера.
smtp_rcpt_timeout = 15s

# Включаем поддержку sasl аутентификации
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain =

# Необходимо для корректной работы клиентов, использующих устаревший
# метод AUTH, например outlook express
broken_sasl_auth_clients = yes

# Запрещаем анонимную авторизацию
smtpd_sasl_security_options = noanonymous

# Указываем, где postfix должен брать информацию о транспорте
transport_maps = hash:/usr/local/etc/postfix/transport.conf

# Указываем, где postfix должен брать информацию о алиасах
#virtual_alias_maps = mysql:/usr/local/etc/postfix/mysqlLookupMaps/alias.conf

# Указываем, где postfix должен брать информацию о доменах
virtual_mailbox_domains = $mydomain localhost localhosy.$mydomain

# Корень для почтовых сообщений
virtual_mailbox_base = /var/spool/mail/

# От меня. )
# Я не стал выносить конфиг для соединения с LDAP сервером
# в отдельный файл, поэтому все настройки будут в основном файле
# Указываем, где postfix должен брать информацию о почтовых ящиках
virtual_mailbox_maps = ldap:ldapvirtual
# Хост, на котором крутится LDAP
ldapvirtual_server_host = ldaps://spider.teachers/
# Порт на котором висит LDAP
ldapvirtual_server_port = 636
# Соединяться с сервером
ldapvirtual_bind = yes
# Версия протокола
# Очень долго мучился из-за этой опции
# Не хотело соединяться и все! 
# Кстати, есть альтернатива, можно в slapd.conf добавить:
# allow bind_v2
ldapvirtual_version = 3
# С какого объекта начинать поиск
ldapvirtual_search_base = ou=users,dc=l1523,dc=ru
# Ищем пользователя, у которого нужный нам почтовый адрес
ldapvirtual_query_filter = (mail=%s)
# Выхватываем информацию, о том, в какой директории лежит почта пользователя
ldapvirtual_result_attribute = mailMessageStore

# Описываем alias'ы.
virtual_alias_maps = ldap:ldapalias
# далее стандартные параметры. См выше для описания
ldapalias_server_host = ldaps://spider.teachers/
ldapalias_server_port = 636
ldapalias_bind = yes
ldapalias_version = 3
ldapalias_search_base = ou=users,dc=l1523,dc=ru
# Ищем пользователя, у которого есть альтернативный почтовый ящик
ldapalias_query_filter = (mailAlternateAddress=%s)
# Выхватываем настоящий ящик
ldapalias_result_attribute = mail

# Настраиваем поддержку квот
virtual_mailbox_limit_maps = ldap:ldapquota
ldapquota_server_host = ldaps://spider.teachers/
ldapquota_server_port = 636
ldapquota_bind = yes
ldapquota_version = 3
ldapquota_search_base = ou=users,dc=l1523,dc=ru
# Ищем пользователя, у которого нужный нам почтовый ящик
ldapquota_query_filter = (mail=%s)
# Хватаем размер maildir'а.
ldapquota_result_attribute = mailQuotaSize

# Относится к поддержке квот
virtual_maildir_extended=yes
virtual_mailbox_limit_override=yes
virtual_create_maildirsize = yes
virtual_overquota_bounce = yes
virtual_maildir_limit_message="Sorry, the user's maildir has 
overdrawn his diskspace quota, please try again later"

# Ограничиваем максимальный размер письма до 10Мб
message_size_limit = 10485760

# 1981 - uid и gid пользователя и группы virtual соответственно
virtual_gid_maps = static:1981
virtual_uid_maps = static:1981
virtual_minimum_uid = 1000

# Перенаправляем всю почту amavisd-new. Если вы еще не настроили amavisd,
# то пока закомментируйте эту строку. Иначе почтовая система не будет работать.
#content_filter=smtp-amavis:[127.0.0.1]:10024

# Параметры ssl
# Путь к Сертефикату
smtpd_tls_cert_file = /usr/local/etc/ssl/pop3d.pem
smtpd_tls_key_file = $smtpd_tls_cert_file
# Уровень отладки
smtpd_tls_loglevel = 1
# Использовать tls
smtpd_use_tls = yes
# Авторизация только по безопасному соединению
smtpd_tls_auth_only = yes

На этом конфиг закончился. Выполняем необходимые действия, но не запускаем postfix, не забывайте, что нам нужно создать еще и сертефикат, а пока добаляем пользователя virtual и добавляем домен mail.teachers:



mail@/> pw groupadd virtual -g 1981
mail@/> pw useradd virtual -u 1981 -g 1981
mail@/> id virtual
uid=1981(virtual) gid=1981(virtual) groups=1981(virtual)
mail@/> cd /usr/local/etc/postfix/
mail@/usr/local/etc/postfix> cat > transport.conf

mail.teachers   virtual

mail@/usr/local/etc/postfix> makemap hash transport.conf.db < transport.conf
mail@/usr/local/etc/postfix> ll transport.conf.db
-rw-r-----  1 root  wheel    16K 17 сен 19:33 transport.conf.db
mail@/> echo postfix_enable=\"YES\" >> /etc/rc.conf
mail@/> /usr/local/etc/rc.d/postfix.sh start
postfix/postfix-script: starting the Postfix mail system
mail@/>

Теперь насчет русских сообщений об ошибках. Топаем в /usr/local/etc/postfix и копируем дефолтный конфиг для сообщений об ошибках:


mail@/> cd /usr/local/etc/postfix/
mail@/usr/local/etc/postfix> cp bounce.cf.default bounce.cf
mail@/usr/local/etc/postfix>

После этого можно редактировать bounce.cf, там все понятно без комментов, просто приведу пример для одного типа сообщений:

bounce.cf

... skipped ...

failure_template = <<EOF
Charset: koi8-r
From: MAILER-DAEMON (Mail Delivery System)
Subject: Undelivered Mail Returned to Sender
Postmaster-Subject: Postmaster Copy: Undelivered Mail

Это сообщение было сгенерировано почтовой системой, $myhostname.

Ваше сообщение не может быть доставлено, из-за следующей проблемы:

EOF

... skipped ...

Теперь переходим к установке courier-imap. Сначала ставим courier-authlib:

mail@/> cd /usr/ports/security/courier-authlib
mail@/usr/ports/security/courier-authlib> make config
     ---------------------------------------------------------------------¬
     ¦                Options for courier-authlib 0.58_2                  ¦
     ¦ -----------------------------------------------------------------¬ ¦
     ¦ ¦        [ ] GDBM         Use gdbm instead of system bdb         ¦ ¦
     ¦ ¦        [X] AUTH_LDAP    LDAP support                           ¦ ¦
     ¦ ¦        [ ] AUTH_MYSQL   MySQL support                          ¦ ¦
     ¦ ¦        [ ] AUTH_PGSQL   PostgreSQL support                     ¦ ¦
     ¦ ¦        [ ] AUTH_USERDB  Userdb support                         ¦ ¦
     ¦ ¦        [ ] AUTH_VCHKPW  Vpopmail/vchkpw support                ¦ ¦
     ¦ ¦                                                                ¦ ¦
     +-L------------------------------------------------------------------+
     ¦                       [  OK  ]       Cancel                        ¦
     L---------------------------------------------------------------------

mail@/usr/ports/security/courier-authlib> make install clean
... skipped ...
mail@/usr/ports/security/courier-authlib>

Теперь переходим непосредственно к настройке:

/usr/local/etc/authlib/authdaemonrc:

# Список модулей авторизации
authmodulelist="authldap"
authmodulelistorig="authldap"
# Количество запускаемых демонов
daemons=5
authdaemonvar=/var/run/authdaemond
subsystem=mail
# Уровень отладки
DEBUG_LOGIN=2
DEFAULTOPTIONS="wbnodsn=1"
LOGGEROPTS=""

/usr/local/etc/authlib/authldaprc:

# Хост LDAP сервера
LDAP_URI                ldaps://spider.teachers/
# Версия протокола
LDAP_PROTOCOL_VERSION   3
# Корень LDAP сервера
LDAP_BASEDN             dc=l1523,dc=ru
# Под кем соединяться
LDAP_BINDDN             cn=root,dc=l1523,dc=ru
# Пароль для соединения
LDAP_BINDPW             9vpIj9
# Timeout соединения
LDAP_TIMEOUT            5
# Соединяемся с сервером
LDAP_AUTHBIND           1
# Директива, в которой храниться название почтового ящика пользователя
LDAP_MAIL               mail
# Домен
LDAP_DOMAIN             mail.teachers
# Под кем работаем
LDAP_GLOB_UID           1981
LDAP_GLOB_GID           1981
# Домащняя директория пользователя
LDAP_HOMEDIR            mailMessageStore
# Корень, где храниться почта
LDAP_MAILROOT        /var/spool/mail
# Имя пользователя храниться в cn
LDAP_FULLNAME           cn
# Защифрованный пароль пользователя храниться в UserPassword
LDAP_CRYPTPW            userPassword
LDAP_DEREF              never
LDAP_TLS                0

Запускаем:


mail@/> echo courier_authdaemond_enable=\"YES\" >> /etc/rc.conf
mail@/> /usr/local/etc/rc.d/courier-authdaemond.sh start
Starting courier_authdaemond.
mail@/>

Теперь переходим к настройке courier-imap:


mail@/> cd /usr/ports/mail/courier-imap/
mail@/usr/ports/mail/courier-imap> make config
     ---------------------------------------------------------------------¬
     ¦                 Options for courier-imap 4.1.1,1                   ¦
     ¦ -----------------------------------------------------------------¬ ¦
     ¦ ¦     [X] OPENSSL      Build with OpenSSL support                ¦ ¦
     ¦ ¦     [ ] FAM          Build in fam support for IDLE command     ¦ ¦
     ¦ ¦     [ ] DRAC         Build in DRAC support                     ¦ ¦
     ¦ ¦     [X] TRASHQUOTA   Include deleted mails in the quota        ¦ ¦
     ¦ ¦     [ ] GDBM         Use gdbm db instead of system bdb         ¦ ¦
     ¦ ¦     [ ] IPV6         Build with IPv6 support                   ¦ ¦
     ¦ ¦     [X] AUTH_LDAP    LDAP support                              ¦ ¦
     ¦ ¦     [ ] AUTH_MYSQL   MySQL support                             ¦ ¦
     ¦ ¦     [ ] AUTH_PGSQL   PostgreSQL support                        ¦ ¦
     ¦ ¦     [ ] AUTH_USERDB  Userdb support                            ¦ ¦
     ¦ ¦     [ ] AUTH_VCHKPW  Vpopmail/vchkpw support                   ¦ ¦
     +-L------------------------------------------------------------------+
     ¦                       [  OK  ]       Cancel                        ¦
     L---------------------------------------------------------------------

mail@/usr/ports/mail/courier-imap> make install clean
... skipped ...
mail@/usr/ports/mail/courier-imap>

Создаем конфиг для скрипта создания сертефиката


mail@/> cp /usr/local/etc/courier-imap/pop3d.cnf.dist \
? /usr/local/etc/courier-imap/pop3d.cnf 

/usr/local/etc/courier-imap/pop3d.cnf:


RANDFILE = /dev/random

[ req ]
default_bits = 2048
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no

[ req_dn ]
C=RU
ST=NA
L=Moscow
O=Mail Server
OU=SSL Key
CN=mail.teachers
emailAddress=root@mail.teachers


[ cert_type ]
nsCertType = server

Ну и создаем сам сертефикат:


mail@/> cd /usr/local/share/courier-imap/
mail@/usr/local/share/courier-imap>
mail@/usr/local/share/courier-imap> ll
total 8
drwxr-xr-x   2 root  wheel   512B  1 окт 21:38 .
drwxr-xr-x  33 root  wheel   1,0K 30 окт 00:01 ..
-rwxr-xr-x   1 root  wheel   1,4K 17 сен 17:03 mkimapdcert
-rwxr-xr-x   1 root  wheel   1,4K 17 сен 17:03 mkpop3dcert
mail@/usr/local/share/courier-imap> ./mkpop3dcert
Generating a 2048 bit RSA private key
..............................+++
...........+++
writing new private key to '/usr/local/share/courier-imap/pop3d.pem'
-----
512 semi-random bytes loaded
Generating DH parameters, 512 bit long safe prime, generator 2
This is going to take a long time
....................+..................................+...
....+.......+..............................................
+..........................................................
......................+........+..........+.+..............
......+.........................................+.+...
.+........................+........+..........+
..................................................................
....+.......+...+.....................+......+.........+.....+..
.+........+..................................
....................+....+...............
..........................+................
.........................+.................
.......+......+...............++*++*++*++*++*++*
subject= /C=RU/ST=NA/L=Moscow/O=Mail Server/OU=SSL Key/
CN=mail.teachers/emailAddress=root@mail.teachers
notBefore=Nov  9 19:05:09 2006 GMT
notAfter=Nov  9 19:05:09 2007 GMT
MD5 Fingerprint=11:5C:84:6A:6B:9A:AB:B0:24:34:61:18:53:FE:CE:A4
mail@/usr/local/share/courier-imap>

Теперь настраиваем imapd-ssl, /usr/local/etc/courier-imap/imapd-ssl, я ничего не менял, кроме:

# На каком адресе висим
SSLADDRESS=192.168.1.245
# Путь к сертефикату
TLS_CERTFILE=/usr/local/etc/ssl/pop3d.pem
# Maildir находится в home directory
MAILDIRPATH=.

Теперь, можно запускать это все добро:


mail@/> echo courier_imap_imapd_ssl_enable=\"YES\" >> /etc/rc.conf
mail@/> /usr/local/etc/rc.d/courier-imap-imapd-ssl.sh start
Starting courier_imap_imapd_ssl.
mail@/> /usr/local/etc/rc.d/postfix.sh start
postfix/postfix-script: starting the Postfix mail system
mail@/>

Усе, все запустилось, смотрим логи:


mail@/> tail -2 /var/log/maillog
Nov  9 23:13:23 mail postfix/postfix-script: starting the Postfix mail system
Nov  9 23:13:23 mail postfix/master[27388]: daemon started -- version 2.3.3, 
configuration /usr/local/etc/postfix
mail@/>

Теперь попробуем отправить почту пользователю fr33man@mail.teachers:


spider@/> cat /etc/passwd | mail -s 'test' fr33man@mail.teachers

Смотрим логи:


mail@/> tail -0f /var/log/maillog
Nov  9 23:15:19 mail postfix/smtpd[27482]: connect from 
spider.teachers[192.168.1.250]
Nov  9 23:15:19 mail postfix/smtpd[27482]: setting up TLS 
connection from spider.teachers[192.168.1.250]
Nov  9 23:15:19 mail postfix/smtpd[27482]: TLS connection 
established from 
spider.teachers[192.168.1.250]: TLSv1 with cipher 
DHE-RSA-AES256-SHA (256/256 bits)
Nov  9 23:15:20 mail postfix/smtpd[27482]: 03173CF02D: 
client=spider.teachers[192.168.1.250]
Nov  9 23:15:20 mail postfix/cleanup[27487]: 03173CF02D: 
message-id=<200611092015.kA9KFU2p050904@spider.teachers>
Nov  9 23:15:20 mail postfix/qmgr[27390]: 03173CF02D: 
from=<fr33man@spider.teachers>, size=2327, nrcpt=1 (queue active)
Nov  9 23:15:20 mail postfix/smtpd[27482]: disconnect 
from spider.teachers[192.168.1.250]
Nov  9 23:15:20 mail postfix/virtual[27488]: 03173CF02D: 
to=<fr33man@mail.teachers>, relay=virtual, 
delay=0.32, delays=0.2/0.06/0/0.07, dsn=2.0.0, 
status=sent (delivered to maildir)
Nov  9 23:15:20 mail postfix/qmgr[27390]: 03173CF02D: 
removed
^C
mail@/>

Отправлено, это хорошо. Теперь попробуем принять почту:


mail@/> tail -0f /var/log/maillog
Nov  9 23:16:52 mail authdaemond: Authenticated: 
sysusername=<null>, sysuserid=1981, sysgroupid=1981, 
homedir=/var/spool/mail/fr33man/, address=fr33man, 
fullname=fr33man, maildir=<null>, quota=10485760, options=<null>
Nov  9 23:16:52 mail authdaemond: Authenticated: clearpasswd=xa)), 
passwd={SSHA}SdlcxiAqmSIBXiyBSFXf7WYsdbyhEfT1
Nov  9 23:16:52 mail imapd-ssl: LOGIN, user=fr33man, 
ip=[192.168.1.197], protocol=IMAP
^C
mail@/>

Усе работает. Кстати, квоты тоже работают. Сейчас пытаюсь прикрутить maildrop в качестве транспорта. Так что скоро ждите новой статьи. ))



размещено: 2006-11-09,
последнее обновление: 2007-01-31,
автор: fr33man


Морская Сова, 2007-03-06 в 22:42:49

Что-то я недопонял, а какой смысл в настройке:
myhostname = [color=blue]mail.teachers
mydomain = mail.teachers[/color]

??
т.е. имя машинки mail совпадает с именем домена?
не приведёт ли это к путанице, и зачем так делать?

LLIAMAY, 2007-03-15 в 15:18:49

Не вышло что-то с virtual_alias. Подумав, добавил
ldapvirtual_query_filter = (|(mailAlternateAddress=%s)(mail=%s))

Вроде тоже работает :)

swallowed, 2007-05-04 в 13:28:03

у меня что то вот ругнулся

Starting slapd.
/usr/local/etc/openldap/schema/mail.schema: line 37: AttributeType not found: "homeDirectory"

f0s, 2007-05-10 в 12:44:22

Соединение с сервером www.fr33man.ru сбой (Сервер не отвечает.)

artem, 2007-11-21 в 17:46:52

"Для начала советую прочесть данную статью."
ссылка не работает
http://turbogaz.kharkov-ua.com/unix/mail/mail-architech.php
и www.fr33man.ru тоже
Лиссяра помоги!

MDV, 2007-12-28 в 8:34:45

В smtpd.conf указаны механизмы
mech_list: CRAM-MD5 DIGEST-MD5 PLAIN LOGIN
Однако при наличии записи CRAM-MD5 в логах появляются варнинги:
Dec 28 13:05:39 mail postfix/smtpd[45754]: warning: SASL authentication failure: Could not open db
Dec 28 13:05:39 mail postfix/smtpd[45754]: warning: SASL authentication failure: Could not open db
Dec 28 13:05:39 mail postfix/smtpd[45754]: warning: SASL authentication failure: no secret in database
Dec 28 13:05:39 mail postfix/smtpd[45754]: warning: unknown[192.10.10.1]: SASL CRAM-MD5 authentication failed: authentication failure

А так и не понял, так и должно быть, или всё таки где-то, что-то нужно до править?

Плюс автор совсем забыл про конфиг sasluathd.conf

svol, 2008-12-22 в 15:55:11

ошибка в main.cf
вместо virtual_mailbox_base = /var/spool/mail/
нужно указывать virtual_mailbox_base = /var/spool/mail
(без завершающего слэша, если кто не понял)

sasl, 2009-02-27 в 18:22:33

Да, а меня то и не настроили как положено, в итоге я хрен работаю :)))

skliz, 2009-03-30 в 10:31:21

Подскажите плиз, а с двумя LDAP серверами работать будет, один постфикс обслуживает два домена и пересылает в разные ексченджи назодяжиеся в разных домен AD????

mavriq, 2009-06-01 в 12:07:13

- ldapsearch -LLL -b 'ou=users,dc=l1523,dc=ru' -x '(|(cn=*)(uid=*))' | grep dn: | awk '{print $2}' | cut -f 2 -d "=" | cut -f 1 -d "," > users
+ ldapsearch -LLL -b 'ou=Users,dc=standart,dc=md' -x '(|(cn=*)(uid=*))' | grep dn: | sed -e 's/^dn. //' | cut -f 2 -d "=" | cut -f 1 -d "," > users
не надо забывать что cn могут содержать пробелы и awk разрывает его на 2-е части $2 и $3. вроде так правильней должно быть. незнаю почему раньше никто не заметил

krz, 2009-07-15 в 14:57:02

ссылочка на mail.schema не работает, где же теперь её брать

scompy, 2009-10-25 в 19:55:29

то.. ссылочку надобно починить !

scompy, 2009-10-26 в 0:33:31

рабочая схема qmail

марк, 2012-04-05 в 22:41:52

Для отключения пользователя, сделал такой файлик (подставте свои значения в скобках <>):

# cat disable.ldif
dn: uid=<USER>,ou=users,dc=<DOMAIN>,dc=<RU>
changetype: modify
replace: accountStatus
accountStatus: inactive



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0733 секунд
Из них PHP: 60%; SQL: 40%; Число SQL-запросов: 77 шт.
Исходный размер: 82198; Сжатая: 17758