我希望Postfix检查每个发出的 smtp邮件的“发件人”字段(发送之前),以便发件人匹配服务器中托pipe的任何域的有效创build帐户(邮件用户)(作为批准发送)。
其原因是因为每当一个域被垃圾邮件发送者脚本感染时,它通常使用一个类似于'random-name'@infected-domain.tld的模式,所以通过应用发送者 – 用户存在的filter ,可以减less对服务器信誉的影响,从而防止被列入黑名单(当其中一个托pipe域被恶意脚本感染时)。
所以在这里,我没有要求特定的域限制,而是在Postfix发送邮件之前( 不是在接收传入的邮件时 )对特定用户的“邮件发件人:”字段进行限制。
编辑1
最后我猜想这里的问题是/ usr / sbin / sendmail可以使用Postfix发送,不需要身份validation,不是吗? 或者,是否configuration在别的地方,而我不知道?
请至less请帮助我一些sendmail的有用和可理解的文档? 我找不到任何真正有用的东西来了解它是如何工作的,而对于Plesk 11.5等多用户环境来说则更less。
这就是为什么我想直接从Postfix过滤,因为是依靠或发送电子邮件的中心点。
编辑2
最后search我已经放弃了Postfix 2.4+ authorized_submit_users => 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
正则expression式过滤选项,使用负向视图 :
#/etc/postfix/header_checks /^From: ".*(?!user1|user2|user3).*@infected-domain.tld/ REJECT
任何想法? 我可以打开另一个线程吗?
解决了!
我已经在下面自己回答了这个特定情况的定制解决scheme。 感谢大家的信息,合作和支持!
看这个图 ,有三个独立的入口,电子邮件可以inputpostfix,sendmail(通过皮卡),smtpd和qmqpd。 最后的入口很less用在这里。
当电子邮件通过smtpd发送,然后从外部可能的电子邮件源(从127.0.0.1连接的例外)。 外面的电子邮件被认为是不可信的 。 因此,后缀有标准的function,如RBL检查器,打开中继检查器,白名单和其他。 请参阅Postfix SMTP中继和访问控制 。
默认情况下,服务器和127.0.0.1的IP地址被认为是可信的,因为从这个主机连接的任何人都可能导致垃圾邮件的进一步破坏。 例如:如果一个脚本已经上传到networking服务器,那么他们可能会导致删除网页根,种植后门等等。
另一个可信的邮件入口是通过sendmail / mail程序。 基本上当php调用邮件函数或者你从terminal调用邮件时,你指示sendmail把邮件放在postfix队列中。 Sendmail不能被调用,除非有人访问你的文件夹,比如上传的脚本。
现在,我们准备回答您的主要问题:如何根据数据库检查发件人?
对于smtpd连接,您可以使用postfixfunctionPostfix SMTP中继和访问控制 check_sender_access重新检查您的用户数据库。 我从不使用Plesk,因此无法提供详细信息。 对于sendmail / mail命令,则需要后缀内容检查 (milter或队列内容filter),因为上面的filter不受电子邮件源的影响。
最后,我find了一个解决scheme, 用header_checks过滤掉传出的垃圾邮件 ,但是我不知道它是如何有效和高效的。
警告 :
From: :)发送垃圾邮件时才是有用的。 From: :)时,这个正则expression式不能有效。 假设受感染脚本使用/usr/sbin/sendmail发送垃圾邮件,只要它使用随机不存在的邮件帐户(即[email protected]),而不是真正的帐户作为发件人(即user1 @ my-domain)。 tld),可以使用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文件中的正则expression式应该排除域的任何真实用户(即user1,user2,…):
#/etc/postfix/header_checks /^From:((?![^@]*?user1|[^@]*?user2|[^@]*?user3|[^@]*?webmaster)[^@]*?)@my-domain\.tld/ REJECT invalid sender
正则expression式的解释(任何改变都可以用这个正则expression式testing器 ):
[^@]除@之外的任何字符 [^@]*? 任何字符,除了@ ,零次或多次,懒惰的非贪婪( *? )。 (?!user1|user2|etc)否定前瞻与替代品:丢弃域的真实用户。 (?![^@]*?user1|[^@]*?user2|etc)允许每个用户的电子邮件地址之前的字符。 在改变之前,可以通过(第一次通过,第二次拒绝)来testing:
$ postmap -q "From: [email protected]" pcre:/etc/postfix/header_checks $ postmap -q "From: [email protected]" pcre:/etc/postfix/header_checks REJECT invalid sender $
甚至可以通过使用带有感染期间捕获的消息头的文件来testing(注意:破折号在这里很重要):
$ postmap -q - pcre:/etc/postfix/check_headers < captured_headers.txt From: "[email protected] REJECT invalid sender From: "[email protected] REJECT invalid sender $
一旦testing,如果它符合所需的结果,只需重新启动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'
希望这会帮助其他人。
编辑
正则expression式的一些更正:
#/etc/postfix/header_checks /^From:(?![^@]*?user1@|[^@]*?user2@|[^@]*?user3@|[^@]*?webmaster@)([^@]*?@my-domain\.tld)/ REJECT invalid sender $1
邮政地图检查工作正常,但后缀不是过滤伪造的电子邮件用户的域名(最后感染它没有过滤)。 我不知道为什么。
我用amavisd-new做这个。 我有amavis设置扫描所有的电子邮件,无论它来自(本地或外部)。 这些types的垃圾邮件有很多不好的头文件,很容易被amavisd抓到。 你将不得不禁用几个标题检查,很多邮件客户端(如Outlook)不正确。
如果这个post适用于plesk的身份validation方法,这个post也可能对您有用。 在postfix中检查已validation发件人的标头
在这个问题中,他们检查一个经过身份validation的发件人,但是您必须添加一条规则,以便将经过身份validation的用户邮件头与发件人邮件头进行匹配。
您正在讨论的function在Plesk 12中已经开箱即用