- 操作系统:Linux Ubuntu 12.04 TLS
- 语境:Plesk 11.5
- 公用事业:Postfix 2.9.6(更新受 Plesk 11.5 发行版限制)
我希望 Postfix 检查每个传出smtp 邮件(发送前),以便发件人匹配服务器中托管的任意域的任意有效创建的账户(邮件用户)(作为批准发送的条件)。
原因是,每当一个域名被垃圾邮件发送者脚本感染时,它通常会使用类似的模式'随机名称'@infected-domain.tld,因此通过应用发送者用户存在过滤器,可以减少对服务器声誉的影响,从而防止像现在这样迅速被列入黑名单(每当托管域之一被恶意脚本感染时)。
因此,在这里,我并不是要求对特定域进行限制,而是要求在通过 Postfix 发送之前对“邮件发件人:”字段进行特定用户限制(接收邮件时不)。
编辑1
最后我猜这里的问题是 /usr/sbin/sendmail 可以使用 Postfix 发送而无需身份验证,不是吗?或者,它在其他地方配置而我不知道?
请至少帮我提供一些有关 sendmail 的有用且易懂的文档?我找不到任何真正有用的资料来了解它的工作原理,对于 Plesk 11.5 等多用户环境就更少了。
这就是为什么我想直接从 Postfix 进行过滤,因为它是依赖或发送电子邮件的中心点。
编辑2
经过搜索,我最终放弃了 Postfix 2.4+ 的指令授权提交用户=>http://www.postfix.org/postconf.5.html#authorized_submit_users
它仅检查 /usr/sbin/sendmail 进程的 UID,即受感染域的用户。
添加:
authorized_submit_users = !unknown, static:all
并不能解决问题。
编辑3
与……合作
#/etc/postfix/main.cf
header_checks = regexp:/etc/postfix/header_checks
以及正则表达式过滤选项,使用负面前瞻:
#/etc/postfix/header_checks
/^From: ".*(?!user1|user2|user3).*@infected-domain.tld/ REJECT
有什么想法吗?我可以再开一个帖子吗?
解决了!
我通过以下亲自回答,为这个具体案例提供了定制解决方案。感谢大家提供的信息、合作和支持!
答案1
期待此图, 有三种独立的邮件可以进入postfix、sendmail(通过pickup)、smtpd、qmqpd的入口。最后一个入口在这里很少使用。
当电子邮件发送通过邮件传输协议,则电子邮件来源可能来自外部(从 127.0.0.1 连接时除外)。外部电子邮件被视为不受信任显然。因此,postfix 具有阻止它的标准功能,例如 RBL 检查器、开放中继检查器、黑名单/白名单等。请参阅Postfix SMTP 中继和访问控制。
默认情况下,服务器的 IP 地址和 127.0.0.1 被视为值得信赖因为任何人只要能从这个主机连接,除了垃圾邮件之外,他们还可能造成进一步的破坏。例如:如果脚本已上传到网络服务器,则他们可能导致删除网络根目录、植入后门等行为。
其他值得信赖邮件入口是通过发送邮件/邮件程序。基本上,当 php 调用邮件函数或您从终端调用邮件时,您会指示 sendmail 将电子邮件放在 postfix 队列中。除非某些人对您的盒子有某种访问权限(例如上传脚本),否则无法调用 Sendmail。
现在,我们准备回答您的主要问题:如何根据数据库检查发件人?
对于 smtpd 连接,您可以使用 postfix 功能Postfix SMTP 中继和访问控制check_sender_access 再次检查您的用户数据库。我无法向您提供详细信息,因为我从未使用过 Plesk。对于 sendmail/mail 命令,您需要 postfix内容检查(milter 或队列内容过滤器之后)因为上述过滤器不受电子邮件来源的影响。
答案2
最后我找到了解决办法使用 header_checks 过滤外发垃圾邮件,尽管我不知道它有多么有效和高效。
警告:
- 这种缓解技术解决方案并不能清除感染。
- 它仅当攻击使用真实域名和虚假用户名或电子邮件帐户作为发件人发送垃圾邮件时才有用(
From:
)。 - 当感染使用其他域名作为发件人(
From:
)时,此正则表达式无法生效。
鉴于/usr/sbin/sendmail
受感染脚本会使用随机不存在的邮件账户发送垃圾邮件(即[电子邮件保护]),而不是真实账户作为发送者(即[电子邮件保护]), 可以使用 postfix 内置的内容检查来检查邮件头header_checks
如下:
#/etc/postfix/main.cf
# add it for example before TLS paramaters
# Anti-SPAM options
header_checks = pcre:/etc/postfix/header_checks
header_checks 文件中的正则表达式应该排除域的任何真实用户(即 user1、user2、...):
#/etc/postfix/header_checks
/^From:((?![^@]*?user1|[^@]*?user2|[^@]*?user3|[^@]*?webmaster)[^@]*?)@my-domain\.tld/ REJECT invalid sender
正则表达式的解释(对于任何更改都可以使用此正则表达式测试器):
[^@]
除以下字符之外的任何字符@
[^@]*?
除 之外的任意字符,@
零次或多次,惰性非贪婪(*?
)。(?!user1|user2|etc)
具有替代方案的负面前瞻:丢弃域中的真实用户。(?![^@]*?user1|[^@]*?user2|etc)
允许每个用户的电子邮件地址前有字符。
在任何更改之前都可以通过以下方式进行测试(第一个通过,第二个被拒绝):
$ postmap -q "From: [email protected]" pcre:/etc/postfix/header_checks
$ postmap -q "From: [email protected]" pcre:/etc/postfix/header_checks
REJECT invalid sender
$
甚至可以使用感染期间捕获的消息头文件进行测试(注意:这里的破折号很重要):
$ postmap -q - pcre:/etc/postfix/check_headers < captured_headers.txt
From: "[email protected] REJECT invalid sender
From: "[email protected] REJECT invalid sender
$
测试完成后,如果达到预期结果,只需重新启动 Postfix:
# service postfix restart
* Stopping Postfix Mail Transport Agent postfix [ OK ]
* Starting Postfix Mail Transport Agent postfix [ OK ]
要检查其进展情况,可以使用一个命令:
# tail -n 10000 /var/log/mail.log | grep reject
or
# tail -n 10000 /var/log/mail.log | grep 'invalid sender'
希望这对其他人有帮助。
编辑
正则表达式的一些修正:
#/etc/postfix/header_checks
/^From:(?![^@]*?user1@|[^@]*?user2@|[^@]*?user3@|[^@]*?webmaster@)([^@]*?@my-domain\.tld)/
REJECT invalid sender $1
Postmap 检查运行良好,但 Postfix 未过滤该域的伪造电子邮件用户(上次感染时未过滤)。我不知道为什么。
答案3
我在 amavisd-new 中执行此操作。我已将 amavis 设置为扫描所有电子邮件,无论其来自何处(本地或外部)。这些类型的垃圾邮件有大量坏标头,很容易被 amavisd 捕获。您必须禁用一些标头检查,许多邮件客户端(例如 Outlook)无法正确执行这些检查。
如果它适用于 plesk 的身份验证方法,那么这篇文章可能对您也有用。检查 Postfix 中已验证发件人的标头
在这个问题中,他们会检查经过身份验证的发件人,但您只需添加一条规则,将经过身份验证的用户标头与发件人标头进行匹配。