LINUX.ORG.RU
ФорумAdmin

Фильтр для Exim, запрета исходящей почты

 ,


0

1

Уважаемые форумчане, столкнулся вот с какой проблемой, есть у нашей организации почта на Cpanel - Exim, пользователи, как правило, пользуются для работы RoundCube. Потребовалось ограничить пользователей, чтобы они могли отправлять письма только на 3 домена, входящие обрезал быстро, с помощью файла /usr/local/cpanel/etc/exim/sysfilter/options/Incoming_email_blocking со следующим содержимым:

if (("$h_from:" does not contain "@domain1.com") and ("$h_from:" does not contain "@domain2.com") and ("$h_from:" does not contain "@domain3.com"))
then fail "Mailbox does not exist!"
endif
Написал на коленке, и забыл. Для исходящей почты:
if (("$h_to:, $h_cc:, $h_bcc:" does not contain "@domain1.com") and ("$h_to:, $h_cc:, $h_bcc:" does not contain "@domain2.com") and ("$h_to:, $h_cc:, $h_bcc:" does not contain "@domain3.com")  and ("$h_to:, $h_cc:, $h_bcc:" does not contain "undisclosed-recipients:"))
then fail "Email sending blocked!!!"
endif

Но не выходит, если отправлять по одному письму - все хорошо блокируется, если отправить нескольким пользователям, например, user100@domain1.com, user@mail.com - все прекрасно доходит. Пытался через does not match, все равно не блокирует. Подскажите мне пожалуйста, если можете. Спасибо.

Ответ на: комментарий от fbiagent

Спасибо за ответ, но это действительно странно, но если я ставлю необходимый здесь or он видимо принимает его за and. Я проводил эксперимент если поставить or и написать два значения, то пока оба значения не совпадут - письмо заблокирована не будет. Я обращался в техподдержку, те ответили что это нормально(

kudrik_tt ()
Ответ на: комментарий от kudrik_tt

здесь or он видимо принимает его за and

Нет за or. У вас условие «does not contain» - «не содержит», читаем так «не содержит A» или «не содержит Б» или «не содержит В».

anc ★★★★★ ()
Ответ на: комментарий от anc

Извините, а мою проблему реально решить? Техподдержка отправила меня на ветку форума 5 летней давности с заявлением что проблему производитель скоро решит, но пока, фильтра исходящей почты не предусмотрено. Это меня как то из колеи выбило. Поэтому принялся сам что то писать, но думал что я в фильтре что то неправильно указал, поэтому он и ищет по первому совпадению.

kudrik_tt ()
Ответ на: комментарий от anc

Я уже начал писать малопродуктивные костыли, типа:

if "$h_to:, $h_cc:, $h_bcc:" matches "@(mail.ru|bk.ru|yandex.ru)"
then fail "Email sending blocked!!!"
elif (("$h_to:, $h_cc:, $h_bcc:" does not contain "@domain1.com") and ("$h_to:, $h_cc:, $h_bcc:" does not contain "@domain2.com") and ("$h_to:, $h_cc:, $h_bcc:" does not contain "@domain3.com")  and ("$h_to:, $h_cc:, $h_bcc:" does not contain "undisclosed-recipients:"))
then fail "Email sending blocked!!!"
endif

которые конечно решением не являются.

kudrik_tt ()
Ответ на: комментарий от kudrik_tt

Я думал вы её решили. Отписал только про неправильное понимание логических условий. А так Exim это не ко мне, сорри не помогу. Я его только «палочкой тыкал» не более того.

anc ★★★★★ ()
Ответ на: комментарий от kudrik_tt

Две строки :)

А так да - три цепочки сертификатов создать - по одной для каждого вашего домена. Прикрутить эти сертификаты на почтовый сервер этих доменов.

Ну а затем все три цепочки добавить в файл (в нашем случае 1.pem) и добавить в exim.conf те две строчки.

suffix ()
Ответ на: комментарий от suffix

Создал сертификаты:

sudo openssl req -x509 -newkey rsa:4096 -keyout key1.pem -out cert1.pem -nodes -days 365 -subj '/CN=domain1.com'
sudo openssl req -x509 -newkey rsa:4096 -keyout key1.pem -out cert1.pem -nodes -days 365 -subj '/CN=domain2.com'
sudo openssl req -x509 -newkey rsa:4096 -keyout key1.pem -out cert1.pem -nodes -days 365 -subj '/CN=domain2.com'
Соединил в один файл
cat cert1.pem cert2.pem cert3.pem > cert.pem
Переместил sudo cp cert.pem /etc/ssl/certblock.pem Не знаю куда добавлять в /etc/exim.conf Тут есть кусок кода:
tls_on_connect_ports = 465

system_filter_user = cpaneleximfilter

system_filter_group = cpaneleximfilter

smtputf8_advertise_hosts = :

openssl_options = +no_sslv2 +no_sslv3

tls_require_ciphers = ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256$

timezone = America/New_York

spamd_address = 127.0.0.1 783 retry=30s tmo=3m

tls_certificate = ${if and \
    { \
        {gt{$tls_in_sni}{}} \
        {!match{$tls_in_sni}{/}} \
    } \
    {${if exists {/var/cpanel/ssl/domain_tls/$tls_in_sni/combined} \
        {/var/cpanel/ssl/domain_tls/$tls_in_sni/combined} \
        {${if exists {${sg{/var/cpanel/ssl/domain_tls/$tls_in_sni/combined}{(.+/)[^.]+(.+/combined)}{\$1*\$2}}} \
            {${sg{/var/cpanel/ssl/domain_tls/$tls_in_sni/combined}{(.+/)[^.]+(.+/combined)}{\$1*\$2}}} \
            {/etc/exim.crt} \
        }} \
    }} \
    {/etc/exim.crt} \
}

tls_privatekey = ${if and \
    { \
        {gt{$tls_in_sni}{}} \
        {!match{$tls_in_sni}{/}} \
    } \
    {${if exists {/var/cpanel/ssl/domain_tls/$tls_in_sni/combined} \
        {/var/cpanel/ssl/domain_tls/$tls_in_sni/combined} \
        {${if exists {${sg{/var/cpanel/ssl/domain_tls/$tls_in_sni/combined}{(.+/)[^.]+(.+/combined)}{\$1*\$2}}} \
            {${sg{/var/cpanel/ssl/domain_tls/$tls_in_sni/combined}{(.+/)[^.]+(.+/combined)}{\$1*\$2}}} \
            {/etc/exim.key} \
        }} \
    }} \
    {/etc/exim.key} \
}


# +incoming_port, +smtp_connection, +all_parents are needed for cPanel email tracking.
# +retry_defer, +subject, +arguments, +received_recipients are suggested settings that may be disabled.
log_selector = +incoming_port +smtp_connection +all_parents +retry_defer +subject +arguments +received_recipients


system_filter = /etc/cpanel_exim_system_filter
до него или после?

kudrik_tt ()
Ответ на: комментарий от suffix

Были бы эти способы, пока работает с запретом всяких почтовых доменов впереди, это конечно не выход. Вот только интересно, почему не могу скрытые копии перекрыть.

kudrik_tt ()
Ответ на: после слов от libert0

Спасибо, сейчас обязательно попробую. А можно так написать фильтр

if "$h_to:, $h_cc:, $h_bcc:" matches "@[^abc]"
теперь он отбрасывает все домены кроме тех которые начинаются на a,b,c. А можно написать фильтр чтобы он срабатывал,как
if "$h_to:, $h_cc:, $h_bcc:" matches "@[^(domain1.com)]"
что то типа этого, или этого сделать нельзя.

kudrik_tt ()
Ответ на: читать от libert0

Re: читать

Спасибо за документацию, очень познавательно. Вы не подскажите, нашел в интернете статью Дублирование почты Exim где была использована команда:

$recipients:
Решил применить в фильтре:
if (("$h_to:, $h_cc:, $h_bcc:, $recipients:" does not contain "@domain1.com") and ("$h_to:, $h_cc:, $h_bcc:" does not contain "@domain2.com") and ("$h_to:, $h_cc:, $h_bcc:" does not contain "@domain3.com")  and ("$h_to:, $h_cc:, $h_bcc:" does not contain "undisclosed-recipients:"))
then fail "Email sending blocked: Your mailbox is forbidden to send mail outside the company, thank you!!!!!!"
endif

Но web-интерфейс стал тормозить, письма долго приходят-отправляются, нагрузка на сервере возросла. Этот же фильтр без

$recipients:
- работает вообще не заметно. Это нормально?
$recipients:
добавил чтобы фильтровались исходящие сообщения «Скрытые копии». Вы не могли бы подсказать указатели регулярных выражений, типа (?!шаблон) работают в фильтрах exim, а то все мострячил типа
*@(?!domain1)*
. Но он отказывается выполняться.

kudrik_tt ()