Необходимо установить пакеты (из портов или пакаджей) cyrus-sasl-saslauthd, cyrus-sasl, cyrus-imapd. После этого добавляем в системный /etc/make.conf следующие параметры
SENDMAIL_CFLAGS+= -I/usr/local/include -DSASL=2 -DSOCKETMAP SENDMAIL_LDFLAGS+= -L/usr/local/lib SENDMAIL_LDADD+= -lsasl2и пересобираем системный sendmail:
cd /usr/src/lib/libsm && make clean obj depend all cd /usr/src/lib/libsmutil && make clean obj depend all cd /usr/src/usr.sbin/sendmail && make clean obj depend all install
cd /etc/mail makemap -d btree userdb.db <<EOF EOF
Алиасы в данном файле должны быть в следующем виде:
user@domain.tld:maildrop alias@some.tld
таких записей для одного e-mail'а можно делать множество, они все будут раскрыты по правилам файла алиасов.
если необходимо что бы почта не только перенаправлялась на какой-либо внешний адрес, но и попадала в cyrus-овский ящик, то нужно сделать две записи такого вида:
user@domain.tld:maildrop alias@some.tld user@domain.tld:maildrop user@domain.tld
Так же в данном файле у нас будет поддерживаться специальная конструкция вида
@domain.tld:maildrop alias@some.tldдля перенаправления почты для всего домена на один адрес. записи для отдельных e-mail'ов имеют приоритет и отменяют ее действие.
для аутентификации в /etc/mail/userdb.db добавляем специальные записи вида
user@domain.tld:password passwordhash
проверка осуществляется pam-модулем pam_maildb, для этого в каталог /etc/pam.d добавляем два файла pop и imap одинакового содержания:
auth required pam_maildb.so try_first_pass sufix=password db=/etc/mail/userdb.db account sufficient pam_permit.so no_warnдля редактирования /etc/mail/userdb.db можно использовать любые средства, на свой вкус.
Добавляем строки в /etc/rc.conf.local для запуска saslauthd и cyrus-imapd:
saslauthd_enable="YES" saslauthd_flags="-r -a pam" cyrus_imapd_enable="YES"
В /usr/local/etc/cyrus.conf в секцию SERVICES добавляем запуск демона для проверки из sendmail доступности imap-ящиков:
# Sendmail socket map smmapd(8) smmap cmd="smmapd" listen="/usr/local/cyrus/socket/smmapd" prefork=0
В /usr/local/etc/imapd.conf меняем некоторые умолчания для корректной работы:
unixhierarchysep: yes servername: imap.host.name virtdomains: userid lmtp_downcase_rcpt: yes username_tolower: yes sieveusehomedir: false sievedir: /usr/local/cyrus/sieve sasl_pwcheck_method: saslauthd sasl_mech_list: plain lmtpsocket: /usr/local/cyrus/socket/lmtp idlesocket: /usr/local/cyrus/socket/idle notifysocket: /usr/local/cyrus/socket/notify
Остальные настройки исправляем по вкусу
В .mc добавляем следующие настройки:
FEATURE(local_lmtp) FEATURE(mailertable, `hash -o /etc/mail/mailertable') TRUST_AUTH_MECH(`GSSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl define(`confAUTH_MECHANISMS',`GSSAPI KERBEROS_V4 DIGEST-MD5 CRAM-MD5 PLAIN LOGIN')dnl define(`confAUTH_OPTIONS', `A')dnl define(`confUSERDB_SPEC', /etc/mail/userdb.db)dnl Kvluser btree -m -a<> /etc/mail/userdb LOCAL_CONFIG # Cyrus smmapd(8)'s map for verifying mailboxes of local recipients Kcyrus socket -a<OK> -T<TMPF> /usr/local/cyrus/socket/smmapd MAILER_DEFINITIONS Mvirtual, P=[IPC], F=lsDFMnqXzA@/:|m5, S=EnvFromSMTP/HdrFromSMTP, R=VDom/HdrToSMTP, E=\r\n, T=DNS/RFC822/SMTP, A=FILE /usr/local/cyrus/socket/lmtp LOCAL_RULESETS SVDom R$+ $: $> "EnvToSMTP" $1 R$+ < @ $* .> $: $1 < @ $2 > R$+ < @ $* > $: $1 $(mailertable $2 $) R$+ virtual : $* $: $1 @ $2 R$* $: $(vluser $1:maildrop $) R$* :maildrop<> $@ $1 R$* :maildrop $: <!> $1 $| $(cyrus $1 $: $) R<!> $* $| $* <OK> $@ $1 R<!> $* $| $* <TMPF> $@ $1 R<!> $* $| $* $: $1 R$+ @ $+ $: $1 $(vluser @$2:maildrop $) R$+ @ $+ :maildrop<> $@ @$2 R$* :maildrop $: $1 SLocal_localaddr R$+ @ $* $: $1 @ $2 <!> $(mailertable $2 $) R$+ <!> virtual : $* $@ $> "ckuser_cyrus" $1 R$+ <!> $* $: $1 Sckuser_cyrus #Query smmapd(8) R$+ $: <!> $1 $| $(cyrus $1 $: $) #Cyrus OK, skip R<!> $* $| $* <OK> $@ $1 #Over quota or lookup failure R<!> $* $| $* <TMPF> $# error $@ 4.3.0 $: "451 TEMPFAIL." #Mailbox doesn't exist or its ACL forbids posting R<!> $* $| $* $# error $@ 5.1.1 $: "550 Mailbox is not available."
Остальные настройки, опять же, по вкусу.
Теперь для обработки какого-либо домена в данной конструкции необходимо
domain.tld virtual:domain.tld
cyradm --user=cyrus --password=password localhost localhost> cm user/name@domain.tld localhost> sq user/name@domain.tld STORAGE 1000000
name@domain.tld:password passwordhash
В принципе ничего не мешает для аутентификации использовать и любую другую схему — LDAP, Keberos, radius, tacacs+ или любую другую. Основное требование — наличие PAM-plugin и возможность иметь логины вида name@domain.tld.
Enjoy!
Замечания и предложения отправлять сюда