postfix - hock - 从已处理的电子邮件中提取信息

postfix - hock - 从已处理的电子邮件中提取信息

设置

Linux,Debian Wheezy,为大约 1000 名用户提供邮件服务器。Courier 和 Postfix 安装在该机器上。

有关服务器的信息

它是一个 postfix 设置,可将电子邮件发送到下面的邮箱/home/vmail/$domain/$user- 此部分正在运行。

我计划做什么:

我希望实现当电子邮件通过服务器发送时/home/vmail/mail_logger.sh触发脚本 ( ),以便我可以记录并采取行动。为什么?如果某个帐户被黑客入侵并且有人开始通过系统发送垃圾邮件,我希望对该帐户实施减速/禁用操作。

现在我正在轮换日志文件并提取哪个用户在一段时间内发送了多少封电子邮件,然后如果他们每小时发送的电子邮件超过 x 封(可配置),则锁定该帐户。这种日志轮换实现并不好,所以我认为最好有一个 hock,每次通过 smtps 发送电子邮件时都会触发该 hock(目前只允许用户使用 smtps - 没有 smtp)。

我已经发现本手册它给了我一些关于如何为不同的传送方法(smtp、smtpd、pickup)实现“hocks”的想法

在 main.cf 中我添加了以下几行

hooksmtp   unix  -       n       n       -       -       pipe  flags=F user=vmail argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} smtp
hooksmtps  unix  -       n       n       -       -       pipe  flags=F user=vmail argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} smtps
hookpickup unix  -       n       n       -       -       pipe  flags=F user=vmail argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} pickup`

并在 main.cf 中修改了以下几行

smtp       inet  n       -       -       -       -       smtpd -o content_filter=hooksmtp:dummy
smtps     inet  n       -       -       -       -       smtpd -o content_filter=hooksmtps:dummy  -o syslog_name=postfix/smtps  -o smtpd_tls_wrappermode=yes   -o smtpd_sasl_auth_enable=yes  -o smt
pickup    fifo  n       -       -       60      1       pickup -o content_filter=hookpickup:dummy

来号召大家采取具体的行动。

现在触发的脚本看起来像这样,我稍后会改进它.....

cat /home/vmail/mail_logger.sh
#!/bin/bash
echo $(date +%Y.%m.%d_%H:%M:%S) $@ >> /home/vmail/mail_logger.log

我现在遇到的问题是,现在所有的电子邮件都由“钩子”处理(这是好的),但没有传递到原始目的地(这是坏的)。

我查看了 Postfix 手册并发现我可以实现将所有电子邮件的密件抄送给本地电子邮件然后进行处理,但我认为应该有另一种方法来处理这个问题。

所以问题是如何更改这些行以使“hocks”收到通知并且邮件仍像以前一样得到处理而不需要执行 BCC 然后处理该 BCC。

也欢迎提出其他解决上述问题的想法。但请注意,我不想在该框上运行垃圾邮件扫描程序,因为垃圾邮件扫描由服务器前面的 4 个 MX 节点(运行 debian 和 sa-exim)处理。

更新 1:根据这些评论,我的第一个发现是

我已关注评论并做出了这些更改

在 main.cf 中我添加了以下几行

local_transport = hookpickup
always_bcc = extract@localhost

在 master.cf 中,我确保 hookpickup 已安装到位

hookpickup unix  -       n       n       -       -       pipe  flags=F user=vmail
    argv=/home/vmail/mail_logger.sh ${sender} ${size} ${recipient} pickup

我做了一些测试,发现

  • 如果我通过 SMTP 发送邮件,BCC 会被发送到 extract@localhost,然后“钩子”会拾取它,脚本会处理内容。- 很好
  • 如果我从本地向 root 发送电子邮件,“钩子”会拾取它,脚本会处理其内容,但电子邮件无法到达目的地——糟糕。

我现在需要设置,如果电子邮件来自邮箱 extract@localhost,local_transport = hookpickup 就会被“触发”。

更新 2:我的下一个发现是

我遵循了第一个答案并做了这些改变

transport_maps = hash:/etc/postfix/map_mytransport
always_bcc = extract@localhost
# removed: local_transport = hookpickup

文件 /etc/postfix/map_mytransport 包含内容

extract@localhost hookpickup:

每次您更改 /etc/postfix/map_mytransport 的内容时,您都必须运行,postmap /etc/postfix/map_mytransport这将生成 postfix 实际使用的文件 /etc/postfix/map_mytransport.db。

请确保您transport_maps之前没有定义过,否则您将用此设置覆盖它,并且可能会导致意外行为。我按照 70% 进行操作本手册 设置服务器但尚未设置,但我知道其他人已经设置了。

在 master.cf 中,我修改了 hookpickup 并添加了更多值以便进行调试

hookpickup unix  -       n       n       -       -       pipe  flags=F user=vmail
    argv=/home/vmail/mail_logger.sh client_address=${client_address} client_hostname=${client_hostname} client_port=${client_port} client_protocol=${client_protocol} domain=${domain} extension=${extension}mailbox=${mailbox} nexthop=${nexthop} original_recipient=${original_recipient} recipient=${recipient} sasl_method=${sasl_method}  sasl_sender=${sasl_sender} sasl_username=${sasl_username} sender=${sender} size=${size}

可以找到参数的完整描述这里

为了使解决方案发挥作用,我将用户提取添加到系统并重新启动了 postfix。

如果一个帐户发送了许多电子邮件(根据数据库中配置的阈值定义),该脚本/home/vmail/mail_logger.sh现在“实时”获取我需要锁定该帐户的信息。

答案1

而不是local_transport用你的搭讪者,即可设置transport_maps

#main.cf
transport_maps = hash:/etc/postfix/mytransport

#/etc/postfix/mytransport
extract@localhost hookpickup:

在此模式下,只需将电子邮件发送到 extract@localhost 即可发送给 hookpickup

相关内容