Postfix 2.9或sendmail,传出垃圾邮件防范(检查发件人是否存在)

  • 操作系统: Linux Ubuntu 12.04 TLS
  • 上下文: Plesk 11.5
  • 实用程序: Postfix 2.9.6 (更新受Plesk 11.5发行版的限制)

我希望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过滤掉传出的垃圾邮件 ,但是我不知道它是如何有效和高效的。

警告

  • 这种缓解技术解决scheme不会清除感染。
  • 只有当攻击通过使用真实的域名和伪造的用户名或电子邮件帐户作为发件人( 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的用户邮件头与发件人邮件头进行匹配。