новости
статьи
.sysadmin

exim + dovecot с использованием в качестве базы данных пользователей домена Windows 2003

предисловие

Возникла как-то нужда собрать эталонный сервер для филиалов - у нас их много, и, наконец, пришло время децентрализовать почту. После разборов, что же там будет в итоге жить, вроде остановились на exim + dovecot. Авторизация — доменная, домен живет на Win2003 AD. Было одно интересное требование, продиктованное реалиями жизни - необходимо уменьшить число запросов к серверу AD. Тут дело в том, что каналы в регионах не резиновые, что не очень важно, поскольку трафик копеечный, и падучие, что более актуально - лучше пусть юзер авторизуется из кэша, проверит, что ничего не пришло, отправит свою почту - хотя бы до локального сервера, чем будет по каждому пропаданию связи на несколько минут теребить админа на местах (или в головном офисе, при отсутствии админа местного).

Собственно с exim затруднений особых не возникло - saslauthd умеет лазить в AD и кэшировать результаты. Однако вот dovecot не умеет работать с saslauthd - автор посчитал, что вполне хватит встроенного sasl`a... Вот с этого момента начались пляски с бубном - напрямую в AD dovecot лазить умеет, умеет даже авторизоваться от имени пользователя, однако, у меня не заработало - искался пользователь vasya@my-domain.local, а LDAP в результате поиска возвращал просто vasya, что dovecot’у решительно не нравилось. Указание просто Васи приводило к invalid credentials :( Подумавши, сообразил, что на машинке живет самба (железка мультифункциональная, до кучи выполняющая также роль файлопомойки) с авторизацией из AD, а winbindd тоже умеет кэшировать данные.

В итоге родилось такое чудо с разными методами авторизации - dovecot через pam winbindd и exim через saslauthd (или же напрямую через LDAP - в процессе поисков нашел и такое решение). Все работало - но не понравилось, что методы разные, соответственно, exim был причесан к авторизации через pam. Сие решение и представляю на суд общественности.

за работу!

Для начала ставим exim, добавляя следующие строки в /etc/make.conf:

PORTSDIR?= /usr/ports
.if ${.CURDIR} == ${PORTSDIR}/mail/exim

# Поддержка MySQL
WITH_MYSQL= yes

# Контентное сканирование
WITH_CONTENT_SCAN= yes

# Дефолтовая кодировка заголовков
WITH_DEFAULT_CHARSET?= koi8-r

# Отключаем IPv6
WITHOUT_IPV6= yes

# Подрубаем LDAP
WITH_OPENLDAP= yes

# Версия BDB - в чем ведет свои БД подсказок
WITH_BDB_VER= 1

# Проверки SPF
WITH_SPF= yes

# Подержка перекодировки (для заголовков)
WITH_ICONV= yes
WITH_PAM= yes
WITH_AUTH_CRAM_MD5= yes
WITH_AUTH_PLAINTEXT= yes
#WITH_AUTH_SPA= yes
#WITH_AUTH_SASL= yes
# для авторизации через saslauthd
#WITH_SASLAUTHD= yes
#
.endif


После чего собираем exim.

Затем рисуем конфиг, из которого я привожу тока аутентификаторы, ибо полный приводить лень, да и не за чем: у меня там свой конфиг - с поисками филиалов по LDAP’у и прочей хиромантией:

plain_pam:
driver = plaintext
public_name = PLAIN
server_prompts = :
server_condition = ${if pam{$auth2:${sg{$auth3}{:}{::}}}}
server_set_id = $auth2

login_pam:
driver = plaintext
public_name = LOGIN
server_prompts = Username:: : Password::
server_condition = ${if pam{$auth1:${sg{$auth2}{:}{::}}}}
server_set_id = $auth1


Для saslauthd (если используем его) пишем примерно такой конфиг (/usr/local/etc/saslauthd.conf):

ldap_servers: ldap://my-domain.local/
#ldap_bind_dn: cn=lissyara,DC=my-domain,DC=local
ldap_bind_dn: lissyara@my-domain.local
ldap_bind_pw: secret_passwd
ldap_version: 3
ldap_search_base: dc=my-domain,dc=local
#ldap_filter: (sAMAccountName=%u)
ldap_filter: (&(sAMAccountName=%u))
ldap_debug: -1


Дальше ставим dovecot, с такими опциями:

+-------------------------------------------------------+
| Options for dovecot 1.0.0 |
| +---------------------------------------------------+ |
| | [X] KQUEUE kqueue(2) support | |
| | [X] SSL SSL support | |
| | [ ] IPV6 IPv6 support | |
| | [ ] POP3 POP3 support | |
| | [X] LDA LDA support | |
| | [ ] GSSAPI GSSAPI support | |
| | [ ] VPOPMAIL VPopMail support | |
| | [ ] LDAP OpenLDAP support | |
| | [ ] PGSQL PostgreSQL support | |
| | [ ] MYSQL MySQL support | |
| | [ ] SQLITE SQLite support | |
| | | |
| | | |
| | | |
| | | |
|-+---------------------------------------------------+-|
| [ OK ] Cancel |
+-------------------------------------------------------+

Собираем devcot. И, конечно же, рисуем для него конфиг:

protocols = imap
listen = *
disable_plaintext_auth = no
ssl_disable = yes
mail_location = maildir:/var/mail/exim/%Lu
mail_extra_groups = mail
verbose_proctitle = yes
first_valid_uid = 26
last_valid_uid = 26
first_valid_gid = 6
last_valid_gid = 6
maildir_copy_with_hardlinks = yes

protocol imap {
imap_client_workarounds = delay-newmail outlook-idle tb-extra-mailbox-sep
}

protocol lda {
postmaster_address = lissyara@my-domain.local
sendmail_path = /usr/sbin/sendmail

# UNIX socket path to master authentication server to find users.
auth_socket_path = /var/run/dovecot/auth-master
# log_path = /var/log/dovecot/deliver.log
# info_log_path = /var/log/dovecot/deliver.log
}

auth_cache_size = 1024
auth_username_format = %Lu

auth default {
mechanisms = plain

passdb pam {
args = exim
}

userdb static {
args = uid=26 gid=6 home=/var/mail/exim/%Lu allow_all_users=yes
}
user = root

socket listen {
master {
path = /var/run/dovecot/auth-master
mode = 0600
# Default user/group is the one who started dovecot-auth (root)
user = mailnull
#group = mail
}
}
}


Для доставки почты используется deliver, и при таком конфиге dovecot он примет и положит в заданную директорию всю почту, что будет ему передана. Несмотря на то, что пользователи практически системные, deliver почему-то пытается сохранить почту в директории, проставив на нее группу пользователя, такую же, как его имя, что некорректно - нет таких групп в виндовом домене. Поэтому я и извратился с жестким заданием одного пользователя, от которого сохраняется вся почта. После этого ставим samba, если она у вас еще не установлена.

Теперь нарисуем файлик для pam-авторизации exim`a (/etc/pam.d/exim):

# auth
auth required /usr/local/lib/pam_winbind.so try_first_pass


После чего все запускаем и оно должно работать :).



lissyara
обсудить статью
© сетевые решения
.
.