Страница 1 из 2
Exim: запретить части народа слать письма в мир
Добавлено: 2006-10-04 15:16:28
Urgor
Как можно в Exim'e запретить части народа слать письма в мир, оставив возможность переписываться внутри компании? То что надо еще одну колонку добить в базу -- это я догадался

А вот как модифицировать правила так чтоб это заработало?
Добавлено: 2006-10-04 15:30:01
dikens3
В начале поставь это:
Код: Выделить всё
# Запрещаем, если невозможно проверить лок. отправителя.
require verify = sender
Код: Выделить всё
# Принимаем, если аутентифицировался, получаетель наш домен, и пользователь существует.
accept authenticated = *
domains = +local_domains
message = "Unknown user"
verify = recipient
Потом
Код: Выделить всё
# Прибиваем заблокированные E-mail'ы и Домены
deny message = E-Mail: "$sender_address" is blocked
senders = dbm*@;/usr/local/etc/exim/files/dbm/bad_emails.dbm
Сам файл у меня выглядит так:
Код: Выделить всё
ECM-2005@list.ru
renault.media@renault.com
mebel@elturista.com
info@dip.ru
*@orlando.quik.com
*@metro.quik.com
*@slo.quik.com
*@kzbz.biz
*@obravybr.com
*@mydomain.ru
Это пример, не перемудри с ним.
Добавлено: 2006-10-05 6:50:47
Urgor
Не. Ты просто зарезал часть доменов для всех, а мне надо чтоб для части моих юзеров нельзя было слать письма в инет. Остальные же могут слать как внутри компании, так и наружу -- в инет.
Добавлено: 2006-10-05 7:58:16
Alex Keda
ну так добавь выше кондишен, типа если шлют из локалки - и пользователям этого сервера - allow. Тогда они до этого правила и не дойдут даже.
Ну а следующим - список тех кому нелья наружу - deny
Добавлено: 2006-10-05 8:56:15
Urgor
Лис, у тя в конфиге
http://www.lissyara.su/?id=1175 написано:
Код: Выделить всё
# Делаем список локальных доменов. Далее этот
# список будет фигурировать в виде +local_domains
# В данном случае домены выбираются из БД MySQL. Также
# можно их просто перечислить через двоеточие. Есть интересная
# возможность, можно указать юзер@[хост] - lissyara@[222.222.4.5]
domainlist local_domains = ${lookup mysql{SELECT `domain` \
FROM `domain` WHERE \
`domain`='${domain}' AND \
`active`='1'}}
А где у тебя проверяется активность юзверьских аккаунтов?
Добавлено: 2006-10-05 10:01:32
Alex Keda
в последней строке приведёного тобою листинга

))
Добавлено: 2006-10-05 10:22:47
dikens3
Как бы сделал я:
1. Проверяем пользователя (т.е без аутентификации никому нельзя в мир ничего посылать)
2. Пропускаем всех авторизованных на наши домены и сущ. E-Mail
3. Авторизованных (пофиг даже если неавторизованы) из моего домена с E-Mail'ами (senders) прибиваем.
4. Пропускаем всех авторизованных на внешние домены и сущ. E-Mail.
можешь hosts использовать конечно, вместо аутентификации.
Добавлено: 2006-10-05 10:24:57
dikens3
О, примерно следующее можно замутить
Код: Выделить всё
deny message "Запрещено посылать почту в мир"
hosts = 192.168.1.0/24
senders = asasas@mydomain
domain = !local_domains
Добавлено: 2006-10-05 10:53:41
Urgor
lissyara писал(а):в последней строке приведёного тобою листинга

))
И не смешно
Ксли active=0 то он все равно дает отсылать почту, и получать тоже, а это не хорошо.
dikens3 писал(а):Код: Выделить всё
deny message "Запрещено посылать почту в мир"
hosts = 192.168.1.0/24
senders = asasas@mydomain
domain = !local_domains
Хмм. Интересная идея

Ща попробуем

Добавлено: 2006-10-05 10:57:43
dikens3
Urgor писал(а):
Ксли active=0 то он все равно дает отсылать почту, и получать тоже
По поводу получать exim не причём, копай Курьер или что у тебя там.
Код: Выделить всё
PGSQL_PORT 5432
PGSQL_USERNAME exim
PGSQL_PASSWORD eximpassword
PGSQL_DATABASE mail
PGSQL_USER_TABLE users
PGSQL_CLEAR_PWFIELD password
PGSQL_UID_FIELD 26
PGSQL_GID_FIELD 6
PGSQL_LOGIN_FIELD login
PGSQL_NAME_FIELD name
PGSQL_HOME_FIELD '/mnt/tmp/'
PGSQL_MAILDIR_FIELD maildir
PGSQL_QUOTA_FIELD quota
PGSQL_WHERE_CLAUSE status = '1'
Вот это посмотри, у меня называется status, у тебя active.
PGSQL_WHERE_CLAUSE status = '1'
Добавлено: 2006-10-05 10:59:37
Alex Keda
Urgor писал(а):lissyara писал(а):в последней строке приведёного тобою листинга

))
И не смешно
Ксли active=0 то он все равно дает отсылать почту, и получать тоже, а это не хорошо.
dikens3 писал(а):Код: Выделить всё
deny message "Запрещено посылать почту в мир"
hosts = 192.168.1.0/24
senders = asasas@mydomain
domain = !local_domains
Хмм. Интересная идея

Ща попробуем

неверный ответ.
Он для этого пользователя почту не принимает.
А чтобы не отсылалось - копай авториаию .и там допиши это же...
Добавлено: 2006-10-05 11:44:43
Urgor
Для этого
домена -- да не принемает, а вот для юзера у меня принял. Поправил:
Код: Выделить всё
mysqluser:
driver = accept
condition = ${if eq{} {${lookup mysql{SELECT home FROM users \
WHERE (id='${quote_mysql:$local_part@$domain}' OR \
id='${quote_mysql:@$domain}') AND \
active=1}}}{no}{yes}}
Теперь не принемает. Ок.
Добавлено: 2006-10-05 11:45:56
Alex Keda

Просто у меня не было необходимсоти делать ограничения - поэтому этот функционал тут - на птичьих правах, для интересу

))
Добавлено: 2006-10-05 12:33:46
dikens3
lissyara писал(а):
неверный ответ.
Он для этого пользователя почту не принимает.
А чтобы не отсылалось - копай авториаию .и там допиши это же...
Это почему?
Не пробовал конечно, но по логике всё путём, должно работать.
Для хостов 192.168.1.0/24, если отправитель
asasas@mydomain.ru и домен получателя не у нас -
идёт в лес.
Добавлено: 2006-10-05 13:35:39
Urgor
Что-то никак не вьеду

Написал так:
Код: Выделить всё
addresslist local_users = ${lookup mysql{SELECT id FROM users \
WHERE `active`='1' and `noinet`='1'}}
deny message = "Запрещено посылать почту в мир"
hosts = 192.168.0.0/24
senders = +local_users
domains = !local_domains
Но не работает, пропускает и все

Запрос в мускуле отрабатывает и выдает запрещенные ящики....
Добавлено: 2006-10-05 14:09:30
dikens3
Вобщем самое разумное аутентификация млин!!!
Додумался я наконец. (Так устроен почтовый сервер вообщето..Трудные времена настали. Звёзды так сложились. :-))
Всем кому нужно писать в мир пропиши пароли в клиентах, а кому запрещено, установи какие-нибудь, пофиг. Пусть подбирают.. :-)
Получится то, что ты хочешь. Кто не аутентифицирован пишет на твой домен. :-)
Добавлено: 2006-10-05 15:46:29
Urgor
Если написать:
Код: Выделить всё
deny message = "Запрещено посылать почту в мир"
hosts = 192.168.0.0/24
senders = mymail@domain.ru
domains = !+local_domains
Все отлавливает и ругается. А если:
Код: Выделить всё
addresslist local_users = ${lookup mysql{SELECT id FROM users \
WHERE `active`='1' and `noinet`='1'}}
deny message = "Запрещено посылать почту в мир"
hosts = 192.168.0.0/24
senders = +local_users
domains = !+local_domains
Не ловит

В доке сказано:
Код: Выделить всё
senders = +my_list
senders = *@+my_list
In the first one, my_list is a named address list, whereas in the second example it is a named domain list.
И если ввести запрос в мускуле он нормально выдает список запрещенных адресов... мдя. Можно как-нить поглядеть что попадает в этот список у Exim'а?
Добавлено: 2006-10-05 16:06:59
Alex Keda
отладку включи. тогда запросы показываются.
http://www.lissyara.su/?id=1205
Добавлено: 2006-10-05 16:07:08
dikens3
Код: Выделить всё
logwrite = Это сообщение пишется в лог экзима
Думаю так :-)
Добавлено: 2006-10-06 7:04:02
Urgor
Вот что попало в лог:
Код: Выделить всё
86283 processing "deny"
86283 check hosts = 192.168.0.0/24
86283 host in "192.168.0.0/24"? yes (matched "192.168.0.0/24")
86283 check senders = ${lookup mysql{SELECT id FROM users WHERE noinet = 1 }}
86283 search_open: mysql "NULL"
86283 cached open
86283 search_find: file="NULL"
86283 key="SELECT id FROM users WHERE noinet = 1 " partial=-1 affix=NULL starflags=0
86283 LRU list:
86283 internal_search_find: file="NULL"
86283 type=mysql key="SELECT id FROM users WHERE noinet = 1 "
86283 database lookup required for SELECT id FROM users WHERE noinet = 1
86283 MYSQL query: SELECT id FROM users WHERE noinet = 1
86283 MYSQL using cached connection for localhost/exim/exim
86283 lookup yielded: admin@mbfkk.spb.ru
86283 device@mbfkk.spb.ru
86283 faxmaster@mbfkk.spb.ru
86283 fax@mbfkk.spb.ru
86283 address match: subject=admin@mbfkk.spb.ru pattern=admin@mbfkk.spb.ru
86283 device@mbfkk.spb.ru
86283 faxmaster@mbfkk.spb.ru
86283 fax@mbfkk.spb.ru
86283 admin@mbfkk.spb.ru in "admin@mbfkk.spb.ru
86283 device@mbfkk.spb.ru
86283 faxmaster@mbfkk.spb.ru
86283 fax@mbfkk.spb.ru"? no (end of list)
86283 deny: condition test failed
Есть мысли как это поправить?
Добавлено: 2006-10-06 9:20:53
Urgor
Странно. Такое чувство что списки адресов не работают.

Покурив доки переписал правило так:
Код: Выделить всё
deny message = Sorry. Sender Access Limited.
hosts = +relay_from_hosts
domains = !+local_domains
senders = ${lookup mysql{SELECT id FROM users \
WHERE `id`='${quote_mysql:$sender_address}' \
and `noinet`='1'}}
Заработало!

В логе же видим:
Код: Выделить всё
90068 processing "deny"
90068 check hosts = +relay_from_hosts
90068 cached yes match for +relay_from_hosts
90068 cached lookup data = NULL
90068 host in "+relay_from_hosts"? yes (matched "+relay_from_hosts" - cached)
90068 check domains = !+local_domains
90068 search_open: mysql "NULL"
90068 cached open
90068 search_find: file="NULL"
90068 key="SELECT domainname FROM domains WHERE domainname='mail.ru' AND (type='LOCAL' OR type='VIRTUAL') AND `active`='1'" partial=-1 affix=NULL starflags=0
90068 LRU list:
90068 internal_search_find: file="NULL"
90068 type=mysql key="SELECT domainname FROM domains WHERE domainname='mail.ru' AND (type='LOCAL' OR type='VIRTUAL') AND `active`='1'"
90068 cached data used for lookup of SELECT domainname FROM domains WHERE domainname='mail.ru' AND (type='LOCAL' OR type='VIRTUAL') AND `active`='1'
90068 lookup failed
90068 mail.ru in ""? no (end of list)
90068 mail.ru in "!+local_domains"? yes (end of list)
90068 check senders = ${lookup mysql{SELECT id FROM users WHERE `id`='${quote_mysql:$sender_address}' and `noinet`='1'}}
90068 search_open: mysql "NULL"
90068 cached open
90068 search_find: file="NULL"
90068 key="SELECT id FROM users WHERE `id`='admin@mbfkk.spb.ru' and `noinet`='1'" partial=-1 affix=NULL starflags=0
90068 LRU list:
90068 internal_search_find: file="NULL"
90068 type=mysql key="SELECT id FROM users WHERE `id`='admin@mbfkk.spb.ru' and `noinet`='1'"
90068 database lookup required for SELECT id FROM users WHERE `id`='admin@mbfkk.spb.ru' and `noinet`='1'
90068 MYSQL query: SELECT id FROM users WHERE `id`='admin@mbfkk.spb.ru' and `noinet`='1'
90068 MYSQL using cached connection for localhost/exim/exim
90068 lookup yielded: admin@mbfkk.spb.ru
90068 address match: subject=admin@mbfkk.spb.ru pattern=admin@mbfkk.spb.ru
90068 mbfkk.spb.ru in "mbfkk.spb.ru"? yes (matched "mbfkk.spb.ru")
90068 admin@mbfkk.spb.ru in "admin@mbfkk.spb.ru"? yes (matched "admin@mbfkk.spb.ru")
90068 deny: condition test succeeded
90068 SMTP>> 550 Sorry. Sender Access Limited.
90068 LOG: MAIN REJECT
90068 H=(URGOR2) [192.168.0.37] F=<admin@mbfkk.spb.ru> rejected RCPT <xxxxx@mail.ru>: Sorry. Sender Access Limited.
Т.е. он сначала сравнивает домен, а потом полностью мыло??? Гм. Понял лишь то, что нифига не понял

Re:
Добавлено: 2010-02-08 16:26:12
qwertykma
Urgor писал(а):Странно. Такое чувство что списки адресов не работают.

Покурив доки переписал правило так:
Код: Выделить всё
deny message = Sorry. Sender Access Limited.
hosts = +relay_from_hosts
domains = !+local_domains
senders = ${lookup mysql{SELECT id FROM users \
WHERE `id`='${quote_mysql:$sender_address}' \
and `noinet`='1'}}
Заработало!

В логе же видим:
Код: Выделить всё
90068 processing "deny"
([/quote]
Все работает, спасибо Вам! М.б. поместить это в "полезные скрипты"?
Re: Re:
Добавлено: 2010-02-09 7:49:44
Urgor
qwertykma писал(а):Все работает, спасибо Вам! М.б. поместить это в "полезные скрипты"?
По этому правилу чел отправлять в нет письма не сможет, но сможет получать из инета. Плюс не проверяется аутентификация, т.е. если юзер Петя в заголовках письма укажет что он юзер Вася и васе можно слать в нет, письмо пройдет.
Re: Re:
Добавлено: 2010-02-09 9:34:12
dikens3
Urgor писал(а):qwertykma писал(а):Все работает, спасибо Вам! М.б. поместить это в "полезные скрипты"?
По этому правилу чел отправлять в нет письма не сможет, но сможет получать из инета. Плюс не проверяется аутентификация, т.е. если юзер Петя в заголовках письма укажет что он юзер Вася и васе можно слать в нет, письмо пройдет.
В полезные скрипты загляни.
Re: Re:
Добавлено: 2010-02-09 10:00:36
Urgor
dikens3 писал(а):В полезные скрипты загляни.
Ты это мне? Так года два как уже решили с тобой в другой теме

Все тип-топ работает. Но вот коллегу предупредить стоило...