divert(-1) # # Copyright (c) 2003, 2004 Victor Ustugov # This hack is under BSD License # Redistributions of source code must retain the above copyright notice # # hacks disscussion's maillist - http://www.mta.org.ua/mailman/listinfo/sendmail-conf # # # SMTP Auth based restrict outbound mail # Ограничение исходящей почты на основании данных аутентификации # dnl # применяется для жесткого ограничения почты, исходящей за пределы домена dnl # все отправители почты за пределы LAN должны быть аутентифицированы dnl # dnl # права отдельных пользователей описываются в access_db в виде: dnl # SendOuboundMail:auth_id OK dnl # SendOuboundMail:auth_id REJECT dnl # SendOuboundMail:auth_id DISCARD dnl # SendOuboundMail:_default_ OK dnl # SendOuboundMail:_default_ REJECT dnl # SendOuboundMail:_default_ DISCARD dnl # SendOuboundMail:auth_id<@>rcpt_addr OK dnl # SendOuboundMail:auth_id<@>rcpt_addr REJECT dnl # SendOuboundMail:auth_id<@>rcpt_addr DISCARD dnl # SendOuboundMail:auth_id<@> OK dnl # SendOuboundMail:auth_id<@> REJECT dnl # SendOuboundMail:auth_id<@> DISCARD dnl # dnl # где dnl # auth_id - логин пользователя, использованный при SMTP auth dnl # rcpt_addr - адрес получателя сообщения dnl # при использовании ключа _default_ подразумевается политика по умолчанию для ограничения почты dnl # аутентифицированных пользователей, исходящей за пределы домена dnl # dnl # вместо возвращаемого значения "OK" в тем же успехом могут быть применены "Accept" или "RELAY" dnl # dnl # последние три примера, в которых не указан адрес получателя, являются политикой по умолчанию dnl # для отправителя, авторизованного как auth_id dnl # dnl # дополнительные настройки (не производить проверку если): dnl # define(`confRESTR_OUT_MAIL_SKIP_W') - если домен получателя есть в $w dnl # define(`confRESTR_OUT_MAIL_SKIP_R') - если домен получателя есть в $R dnl # define(`confRESTR_OUT_MAIL_SKIP_SAME_DOMAIN') - если логин отправителя имеет вид user@domain dnl # divert(0) VERSIONID(`$Id: restrict_outbound_mail.m4,v 8.12-0.02 2004/07/23 15:22:37 corvax Exp $')dnl divert(-1) dnl ifdef(`_ACCESS_TABLE_', `', ` errprint(`*** ERROR: HACK(restrict_outbound_mail) requires FEATURE(access_db) ')') dnl HACK(`precheck_envelope')dnl dnl dnl LOCAL_RULESETS dnl dnl SLocal_check_rcpt dnl dnl R $* $: $>Parse0 $>3 $1 dnl # ставим метку необходимости проверки прав на отправку почты за пределы LAN R $+ $: $1 $| ifdef(`confRESTR_OUT_MAIL_SKIP_W',` # убираем метку, если домен получателя локальный R $+ < @ $=w . > $| $* $: $1 < @ $2 . > $| R $+ < @ $=w > $| $* $: $1 < @ $2 > $| ') ifdef(`confRESTR_OUT_MAIL_SKIP_R',` # убираем метку, если мы рилеим входящую почту данного домена R $+ < @ $=R . > $| $* $: $1 < @ $2 . > $| R $+ < @ $=R > $| $* $: $1 < @ $2 > $| ') # получаем логин, использованный при аутентификации, для проверки наличия прав на отсылку исходящих сообщений за пределы LAN R $+ < @ $+ > $| $: $1 < @ $2 > $| <$&{auth_authen}> # если отправитель не аутентифицировался, отвергаем сообщение R $+ $| <> $#error $@ 5.7.1 $: "550 Relaying denied. Proper authentication required." ifdef(`confRESTR_OUT_MAIL_SKIP_SAME_DOMAIN',` # очищаем макро {authen_domain} R $* $: $(macro {authen_domain} $) $1 # если логин отправителя состоит из локальной и доменной части, сохраняем доменную часть в макро {authen_domain} R $+ < @ $+ > $| < $+ @ $+ > $: $1 < @ $2 > $| < $3 @ $4 > $(macro {authen_domain} $@ $4 $) # выделяем доменную часть для проверки R $+ < @ $+ > $| < $+ @ $+ > $: $1 < @ $2 > $| < $3 @ $4 > < $2 > R $+ < @ $+ > $| < $+ @ $+ > < $+ . > $: $1 < @ $2 > $| < $3 @ $4 > < $5 > # убираем метку, если доменная часть логина совпала с доменной частью адреса получателя R $+ < @ $+ > $| <$+> <$&{authen_domain}> $: $1 < @ $2 > $| R $+ < @ $+ > $| <$+> <$*> $: $1 < @ $2 > $| <$3> ') # проверяем наличие в access_db ключа, состоящего из квалификатора SendOuboundMail и логина R $+ $| <$+> $: $1 $| < $(access SendOuboundMail:$2 $: ? $) > <$2> # если запись не найдена, ищем запись со значением по умолчанию R $+ $| <$+> $: $1 $| < $(access SendOuboundMail:_default_ $: ? $) > <$2> # обрабатываем результаты поиска в access_db R $+ $| < REJECT:$* > $* $#error $: $2 R $+ $| < REJECT > $* $#error $: $@ 5.7.1 $: "550 You don't have permision to send outbound messages" R $+ $| < REJECT $* > $* $#error $: $2 R $+ $| < DISCARD:$* > $* $#discard $: $2 R $+ $| < DISCARD > $* $#discard $: discarded by SendOuboundMail check R $+ $| < DISCARD $* > $* $#discard $: $2 # опять ставим метку необходимости проверки пары отправитель/получатель R $+ < @ $+ > $| <$+> <$+> $: $1 < @ $2 > $| < $4 > < $1@$2 > R $+ $| < $+ > < $+@$+ . > $: $1 $| < $2 > < $3@$4 > # теперь проводим проверку на права отправителя отсылать почту конкретному получателю R $+ $| < $+ > < $+@$+ > $: $1 $| < $(access SendOuboundMail:$2<@>$3@$4 $: ? $) > < $2 > < $3@$4 > # если запись не найдена, ищем запись со значением по умолчанию для данного отправителя R $+ $| < $+ > < $+@$+ > $: $1 $| < $(access SendOuboundMail:$2<@> $: ? $) > < $2 > < $3@$4 > # если запись со значением по умолчанию не найдена, отвергаем почту R $+ $| < $+ > < $+@$+ > $: $1 $| < REJECT "couldn't find default policy in access_db" > # обрабатываем результаты поиска в access_db R $+ $| < REJECT:$* > $* $#error $: $2 R $+ $| < REJECT > < $+ > < $+ > $#error $: $@ 5.7.1 $: "550 You don't have permision to send messages to $3" R $+ $| < REJECT $* > $* $#error $: $2 R $+ $| < DISCARD:$* > $* $#discard $: $2 R $+ $| < DISCARD > $* $#discard $: discarded by SendOuboundMail check R $+ $| < DISCARD $* > $* $#discard $: $2 # в случае успешного резальтата всех проверок приводим адрес получателя к виду mailbox < @ domain >, пригодному для дальнейших проверок R $+ $| $* $: $1 dnl