LINUX.ORG.RU

Как подключить python скрипт к Postfix для «отклонить/пропустить дальше»?

 


0

1

Возможно ли это вообще?

А именно, зашить какую-то логику обработки в python/ruby/что-то еще скрипт для «отклонить подключившего чела/пропустить дальше на след. шаг» и как-то сослаться на этот скрипт из «NNN_restrictions» из конфига postfix'a?


Запросто. Используя spawn или pipe. Для примера посмотрите как устанавливается altermime ( скрипт на перле).

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

Не только возможно, но и нужно, так как это основная штука postfix, что его можно обвешивать внешними скриптами, как елку.

Если именно по рестрикшенам, то:

mail.cf

какой-то_restrictions =
что-то
что-то
check_policy_service unix:private/your_script_pipe_name

master.cf
your_script_pipe_name     unix  -       n       n       -       30    spawn user=user_name argv=/path/to/your/script

В самом скрпите ты получаешь от постфикса кучу переменных, типа sasl_username, sender, client_name и тд , их можешь обрабатывать и отдавать на выходе «DUNNO причина» - пропускаем или «REJECT причина» - не пропускаем

Еще можно мильтер, но там скрипт будет обрабатываться всегда, а не так как в рестрикшенах.

constin ★★★★
()
Последнее исправление: constin (всего исправлений: 4)

А вообще я больше не буду помогать этому типу. Он создал три темы в ни в одной из них никому не ответил.

тут тебе не служба тех поддержки, нужен какой-то фитбэк.

constin ★★★★
()
Последнее исправление: constin (всего исправлений: 1)
Ответ на: комментарий от constin

Наверное нужно ТС только общее направление указывать. Ну а если будут встречные вопросы.. А так конечно: бесплатный автоответчик какой получается. :) У меня вопросик. Свои скрипты я запускал в основном через aliases. Нормальное описание spawn никак не нагуглю. Если я скормлю шеловскому скрипту, то в каком порядке он получит аргументы? И какие.

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

И какие.

Вот список, того, что оно отдаст скрипту.

Отдаст в виде словаря.


Postfix version 2.1 and later:
request=smtpd_access_policy
protocol_state=RCPT
protocol_name=SMTP
helo_name=some.domain.tld
queue_id=8045F2AB23
sender=foo@bar.tld
recipient=bar@foo.tld
recipient_count=0
client_address=1.2.3.4
client_name=another.domain.tld
reverse_client_name=another.domain.tld
instance=123.456.7
Postfix version 2.2 and later:
sasl_method=plain
sasl_username=you
sasl_sender=
size=12345
ccert_subject=solaris9.porcupine.org
ccert_issuer=Wietse+20Venema
ccert_fingerprint=C2:9D:F4:87:71:73:73:D9:18:E7:C2:F3:C1:DA:6E:04
Postfix version 2.3 and later:
encryption_protocol=TLSv1/SSLv3
encryption_cipher=DHE-RSA-AES256-SHA
encryption_keysize=256
etrn_domain=
Postfix version 2.5 and later:
stress=
Postfix version 2.9 and later:
ccert_pubkey_fingerprint=68:B3:29:DA:98:93:E3:40:99:C7:D8:AD:5C:B9:C9:40
Postfix version 3.0 and later:
client_port=1234
Postfix version 3.1 and later:
policy_context=submission
Postfix version 3.2 and later:
server_address=10.3.2.1
server_port=54321



Я скрипты на питоне для жэтого пишу и забираю вот так:

sasl_username = attrib.get("sasl_username", None)
        send_as = attrib.get("sender", None)
	clientname = attrib.get("client_name",  None)

attrib - это как раз то, что оно загнало в stdin

Вот пример:

attrib={'reverse_client_name': 'mail-ot1-f50.google.com', 'ccert_pubkey_fingerprint': '', 'ccert_subject': '', 'sasl_sender': '', 'protocol_state': 'RCPT', 'encryption_protocol': 'TLSv1.2', 'ccert_issuer': '', 'client_address': '209.85.210.50', 'size': '19972', 'protocol_name': 'ESMTP', 'client_name': 'mail-ot1-f50.google.com', 'policy_context': '', 'helo_name': 'mail-ot1-f50.google.com', 'etrn_domain': '', 'instance': '3a5.5c5d64e0.530b3.0', 'encryption_keysize': '256', 'encryption_cipher': 'ECDHE-RSA-AES256-GCM-SHA384', 'ccert_fingerprint': '', 'recipient_count': '0', 'client_port': '36580', 'queue_id': '', 'sasl_method': '', 'recipient': 'test@mydomain.com', 'sasl_username': '', 'stress': '', 'sender': 'vasyapupkin@gmail.com', 'request': 'smtpd_access_policy'}

Я думаю, выведи башем то, что скрипт получил в stdin и увидишь формат и уже придумаешь , как его распарсить.

И важная штука, если вдруг на продакшен сервере это будешь делать, включи в main на время отладки

smtpd_policy_service_default_action=DUNNO

тогда , если скрипт вылетит с ошибкой, то постфикс все равно письмо доставит.

constin ★★★★
()
Последнее исправление: constin (всего исправлений: 3)
Ответ на: комментарий от constin

Большое спасибо за подробное описание. Нехватает иногда штатных средств постфикса. В плане сбивать спамеров еще на подлете. Я так понимаю что само сообщение проверить нельзя?

Bootmen ☆☆☆
()
Последнее исправление: Bootmen (всего исправлений: 1)
Ответ на: комментарий от Bootmen

Я так понимаю что само сообщение проверить нельзя?

Можно, надо на пайп повесить:

-o content_filter

амавис же как-то проверяет дату

но я сам такое не делал

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

constin ★★★★
()
Последнее исправление: constin (всего исправлений: 1)
Ответ на: комментарий от Bootmen

я сейчвс весь спам разруливаю через мильтер , на котором весит rspamd. Отличная штука в кучей плагинов, статистикой и вебом.

А check_policy_service использую, чтобы узнать кому куда можно от какого имени и на какую группу отправлять письмо ( опрашиваю ldap)

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

Можно, надо на пайп повесить:

Да это получше. Я пример и посоветовал altermime для ТС, Ну припрет и rspamd задействую.

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