LINUX.ORG.RU
ФорумAdmin

Postfix, сочетание mime_header_checks и recipient_restrictions

 


0

1

Есть задача: не принимать к отправке письма с определённым вложением в определённом направлении.

В общем случае, фильтрацию вложения по названию возможно сделать встроенным средством: mime_header_checks. Если мы правильно составим фильтр, то письмо с заданным вложением, в данном случае: $ANYSTRING-test.txt, не будет принято.

main.cf:

# main.cf
mime_header_checks = regexp:$config_directory/conf.d/mime_header_checks.regexp
фильтр:
# conf.d/mime_header_checks.regexp
/^\s*Content-(Disposition|Type).*name\s*=\s*"?(.+(-test)+\.(txt))"?\s*$/
   REJECT Attachment type not allowed.
   File "$2" has the unacceptable name

Это будет относиться ко всей почте, однако нам надо применить это правило к определённому направлению, то есть в сочетании с проверкой получателя. Но, насколько я прочёл, в postfix проверки выполняются последовательно: header_checks, body_checks, mime_header_checks; и во время проверки заголовка (smtpd_sender_restrictions) невозможно вызвать проверку mime_header, и наоборот.

Похожий пример рассматривается например здесь, в самом начале: http://www.sys-adm.org.ua/mail/postfix-faq.php . Отличие в том, что там задача сложнее, письмо необходимо отправить но вложение удалить. Для этого там используется внешний фильтр. В нашем случае внешний фильтр избыточен, и достаточно просто не принимать письмо к отправке.

Здесь автор использует класс ограничений аналогичный такому:

# main.cf

smtpd_restriction_classes = test_attach

test_attach =
   check_recipient_access hash:$config_directory/conf.d/test_access.map

smtpd_sender_restrictions =
   check_sender_access hash:$config_directory/conf.d/sender_access.map

В этой карте данный класс используется:

# conf.d/sender_access.map

testuser@domain1  test_attach

А это карта непосредственно самого класса.

# conf.d/test_access.map

domain2 reject	# здесь, в  используемом описании, 
		# автор передаёт письмо на обработку
		# внешнему фильтру:  FILTER altermime:

Если в описании класса (test_attach = ...) поставить проверку mime_header, то при использовании этого класса письмо не отправляется с сообщением: 4.3.5 Server configuration error, что, в общем, ожидаемо.

Возможно ли всё же как нибудь использовать сочетание проверки отправителя/назначения с проверкой mime_header, или только через внешние фильтры?

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

а почему невстроить в регекспы проверки вложения - еще и проверку на то куда отсылают ?

ae1234 ★★
()

В постфиксе это принципиально невозможно. Только через милтер, ну или через policy демон простенький, но в него передаются только заголовки.

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

Спасибо, такое впечатление уже и начало складываться. Значит можно не биться головой об стенку и думать о пересмотре постановки задачи.

Только через милтер,

Это как раз внешний фильтр (или произвольная программа обработчик)?

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

В постфикс происходит последовательная проверка частей сообщения. И во время проверки одной части (например заголовков) вызвать проверку другой части (тела или вложения) невозможно.

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

Да, милтер это сендмейловский протокол для внешних фильтров, антивирусов там и прочих антиспамов.

Если попроще, то можно через check_policy_service в *_restrictions. Описание тут: http://www.postfix.org/SMTPD_POLICY_README.html

Вот простейший скрипт из моей практики:

#!/usr/bin/perl -wT

use strict;
use warnings;

### Unbuffer output ###
$|=1;

### Postfix attribute parsing ###
my %attr;
my $tmp = '';

while(my $row = <STDIN>) {
    $tmp .= $row;

    $row =~ s/\r?\n//;
    if($row =~ /^([^=]+)=(.*)$/) {
        $attr{$1} = $2;
    } else {
        last;
    }
}

my $rcpt = lc($attr{'recipient'});
my $sender = lc($attr{'sender'});

if($rcpt =~ /a\@domain\.ru/ and $sender =~ /b\@domain2\.ru/) {
    print "action=DISCARD Ololo\n\n";
} else {
    print "action=DUNNO\n\n";
}

exit 0;

Но тут парсить тело письма не получится, только по тем полям, которые передает тебе постфикс.

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

А вот такой вопрос. Если вызвать внешний фильтр, например как в описании по ссылке в начале, то им можно только модифицировать письмо и вернуть его постфиксу или можно вернуть письмо неизменным, но с определённым вердиктом?

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

Да. Но мне нужно проверить сочетание адреса (например назначения) и определённого вложения. А вложения проверяются отдельно.

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

Через полиси модифицировать почти ничего нельзя. Можно добавить заголовок, можно редиректнуть куда-нибудь. Вот тут действия возможные описаны: http://www.postfix.org/access.5.html

Если вердикт DUNNO, то письмо идёт дальше по другим фильтрам, если REJECT/OK, то, соответственно, сразу отшибает или принимает, не проходя дальше по цепочке.

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

Написал фильтр взяв за основу http://www.sys-adm.org.ua/mail/postfix-faq.php . Но не знаю как избавиться от петли. Он там определяет в main.cf параметр

altermime_destination_recipient_limit = 1
Но откуда он берёт это название?

В документации вроде говориться о параметре -o content_filter= в master.cf при описании транспорта, для этих целей. Но это, насколько я понял, для smpt. У меня же просто pipe, как по ссылке.

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

Да, уже нашёл. Но с этим всё равно письмо по кругу ходит. В понедельник буду дальше разбираться.

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