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
() автор топика

А если так ?

tls_try_verify_hosts = *
tls_verify_certificates = /etc/ssl/1.pem

Где в 1.pem лежат цепочки сертификатов ТОЛЬКО трёх ваших доменов

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

это только про smtp mail from, который вообще поддельный бывает. тут надо dmarc на свои домены настраивать и чекать его, но это другая история...

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

Учите матчасть. Условие domains относится к получателю. acl на команду rcpt срабатывает на каждого адресата сообщения.

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

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

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

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

Типичная ошибка новичков при работе с условиями с not когда пишут if ((!a) && (!b) && (!c)) на самом деле ожидая ожидая if ((!a) || (!b) || (!c))

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
() автор топика
Ответ на: комментарий от kudrik_tt

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

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

Извините, еще нет, сегодня попробую. Я просто не знаю с чего начать в вашем способе) Попробую погуглить.

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

Видимо задача не очень сложная, создать самоподписанный сертификат pem на 3 домена и добавить строку в файл конфигурации /etc/exim.conf ?

kudrik_tt
() автор топика
Ответ на: комментарий от 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
() автор топика
Ответ на: комментарий от kudrik_tt

после слов

begin acl и смотреть опцию acl_smtp_rcpt вот здесь перевод документации по exim 4.70.

Но лучше домен получателя проверять перед роутером отправляющим во внешний мир.

libert0
()
Ответ на: после слов от 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

Спасибо за документацию, очень познавательно. Вы не подскажите, нашел в интернете статью Дублирование почты 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
() автор топика
Ответ на: Не внимательно от libert0

Я не нашел как можно «Скрытые копии» добавить,

"$h_to:, $h_cc:"
, а то все фильтруется нормально, а Скрытые пропускает, или $recipients: - это в фильтре единственный вариант?

kudrik_tt
() автор топика
Ответ на: Не внимательно от libert0

Спасибо, вы были правы, непрочел про $recipients, и в общую кучу свалил, сейчас проверю при его единичном применении в фильтре.

kudrik_tt
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.