SendmailLDAP
Так все стандартно из sendmail. Вкратце: копируем sendmail.schema в схемы и включаем индексы в slapd.conf
index sendmailMTAKey eq,pres,sub index sendmailMTAMapValue eq index sendmailMTAAliasValue eq
далее в sendmail.mc
dnl информация на подключение к ldap define(`confLDAP_DEFAULT_SPEC',`-w3 -H ldaps://ldap.local -b dc=ldap,dc=local') dnl здесь описывается идентификатор сервера, dnl т.к. в ldap возможно хранить для каждого sendmail свои данные define(`confLDAP_CLUSTER',`mail.local') dnl альясы храним в ldap, предыдущие естественно комментируем define(`ALIAS_FILE', `ldap:') dnl списки access также в ldap FEATURE(`access_db',`LDAP')
типовое описание aliases.ldif:
dn: sendmailMTAKey=postmaster,sendmailMTAAliasGrouping=aliases,dc=ldap,dc=local sendmailMTAKey: postmaster sendmailMTAAliasValue: root sendmailMTAAliasGrouping: aliases sendmailMTACluster: mail.local description: system aliases objectClass: top objectClass: sendmailMTA objectClass: sendmailMTAAlias objectClass: sendmailMTAAliasObject
типовое описание access.ldif:
dn: sendmailMTAKey=com.br,sendmailMTAMapName=access,dc=ldap,dc=local sendmailMTAKey: com.br sendmailMTACluster: mail.local sendmailMTAMapName: access sendmailMTAMapValue: REJECT objectClass: top objectClass: sendmailMTA objectClass: sendmailMTAMap objectClass: sendmailMTAMapObject description: spam top 10
далее необходимо мне разграничить пользователей, включаем авторизацию в sendmail.mc:
TRUST_AUTH_MECH(`LOGIN PLAIN') define(`confAUTH_MECHANISMS', `LOGIN PLAIN')
авторизация естественно через sasl
/usr/lib/sasl2/Sendmail.conf: pwcheck_method:saslauthd
/etc/saslauthdb.conf:
ldap_servers: ldaps://ldap.local ldap_bind_dn: cn=login,dc=ldap,dc=local ldap_password: login_pass #юзер имеющий права на чтение userPassword ldap_search_base: ou=users,dc=ldap,dc=local
/etc/sysconfig/saslauthd:
SOCKETDIR=/var/run/saslauthd MECH=ldap FLAGS="-O /etc/saslauthdb.conf"
пускаем демон:
service saslauthd start
описание доступа пользователя имеет вид:
dn: sendmailMTAKey=fedorova,sendmailMTAMapName=outside,dc=ldap,dc=local sendmailMTAMapName: outside sendmailMTAKey: fedorova sendmailMTAMapValue: OK sendmailMTACluster: mail.local description: Access to external mail objectClass: top objectClass: sendmailMTA objectClass: sendmailMTAMap objectClass: sendmailMTAMapObject
но это небудет работать без дополнительной подстройки sendmail.mc в самый конец:
LOCAL_CONFIG dnl таблица outside хранится в ldap Koutside_table ldap -1 -v sendmailMTAMapValue -k (&(objectClass=sendmailMTAMapObject)(sendmailMTAMapName=outside)(sendmailMTAKey=%0)) Kaccess2_table ldap -1 -v sendmailMTAMapValue -k (&(objectClass=sendmailMTAMapObject)(sendmailMTAMapName=access)(sendmailMTAKey=%0)) LOCAL_RULESETS Scheck_compat dnl # разрешаем если отправитель и получатель из локального домена R<$+@$=w> $| <$+@$=w> $@ OK RMAILER-DAEMON $| <$+> $@ OK Rroot $| <$+> $@ OK dnl # отправка наружу, проверяем авторизацию и включение в группу outside_table и локальной сети 10/8 !! R$+ $| $+ $: $1 $| $2 $| $&{auth_authen} R<$+@$=w> $| $+ $| $+ $: <$(outside_table $4 $: $1 $)@$2> $| $3 R$+ $| $+ $: $1 $| $2 $| $&{client_addr} dnl # если все нормально то пропускаем (сеть 10. прописана ниже!) R<OK@$=w> $| $+ $| 10.$+ $@ OK dnl # если ip адрес или hostname прописан в таблице ldap_access с RELAY R$+ $| $+ $| $+ $: $1 $| $2 $| $3 $| $(access2_table $&{client_addr} $: $&{client_addr} $) R$+ $| $+ $| $+ $| RELAY $@ OK R$+ $| $+ $| $+ $: $1 $| $2 $| $3 $| $(access2_table $&{client_name} $: $&{client_name} $) R$+ $| $+ $| $+ $| RELAY $@ OK dnl R<$+@$=w> $| $+ $| $+ $#error $: 550 Relay denied for you IP address. dnl # получение письма, проверяем на включение в группу outside_table R$+ $| <$+@$=w> $| $* $: $1 $| $(outside_table $2 $: $2 $) dnl # если все нормально то пропускаем R$+ $| OK $@ OK dnl # возможно короткое имя это альяс R$+ $| $+ $| $+ $: $1 $| $(outside_table $2 $: $2 $) R$+ $| OK $@ OK dnl # иначе REJECT R$* $#error $: "553 Sorry, you can not send letter to this user"
Не уверен за форматирование. но понять думаю можно. Теперь все юзеры у нас имеют право только на получение почты из локальной сети 10/8 и отправку на домены в local-host-names. Если будет письмо снаружи то получит "user not found".
Для управления доступом достаточно сгенерировать запись в таблицу sendmailMTAMapName=outside,dc=ldap,dc=local со значением sendmailMTAMapValue: OK После авторизации пользователь имеет право на релей, но только из локальной сети.
Схема работает уже 1.5 года. Комментарии приветствуются. :)