在具有100多个虚拟主机的共享Debian服务器上监控postfix活动

我有一个独特的情况。 我有一个共享的Debian Lenny服务器,有100多个虚拟主机供不同的客户使用。 最近我注意到在我的Munin图中postfix活动的激增。 在服务器上的许多虚拟主机中,似乎有一个PHP脚本用于发送电子邮件爆炸。 有一件事我明白,Postfix不会与任何设置绑定,以帮助节省传出的电子邮件。 我环顾四周,似乎postfix-policyd是一个可行的解决scheme。 这是我想要做的。

  1. 安装软件来帮助我确定哪个虚拟主机发送的邮件最多
  2. 哪个PHP脚本特别是被利用

你有几个选项,取决于你的设置。

如果使用suphp或类似的限制在Web服务器

如果你的PHP脚本是通过suphp或者类似的机制来运行的,而这个机制可以通过拥有这个脚本的用户(而不是Apache)的特权来运行脚本,那么你可以限制这个帐户在一段时间内发送的电子邮件的数量。 节stream可以用qpsmtpd完成; 很多年前,Perl在Perl中写了一个插件,它把账号名存储到MySQL中,然后检查出这个用户最近发送了多less邮件。 如果超过阈值,邮件会被存储到临时隔离区,引发警报,pipe理员可以检查发生了什么事情。

至less在理论上,Postfix-policyd可以完成同样的事情 – 如果PHP发送经过身份validation的邮件,这将非常容易,但由于通常不会这么做,因此创build限制规则时必须更具创造性。

如果使用mod_php,则限制在Web服务器上

如果PHP脚本使用普通的mod_php运行(因此每个脚本都以Apache用户身份运行),发现有罪脚本和限制邮件发送变得更加困难。 再次,这可以通过巧妙的使用qpsmtpd来完成。

最近的PHP版本包含了在每个电子邮件中包含X-PHP-Script标题的选项。 这个头文件作为名字提示,包含了PHP脚本的path。 您可以将这些path信息与qpsmtpd一起使用,并仅考虑URL的用户部分,并以这种方式进行限制。

如果你坚持一些古老的PHP版本,你仍然可以自己修补PHP邮件function。 我在2005年下面写了一个小补丁,最近没有用过,所以我不知道它是否仍然有效。 不过,这个想法应该是明确的:获取path名称,将其追加到每个邮件。

 --- ext/standard/mail.c 2004-01-09 03:35:58.000000000 +0200 +++ ext/standard/mail.c 2005-03-14 13:33:33.069826225 +0200 @@ -180,0 +181 @@ + char *runningscript = zend_get_executed_filename(TSRMLS_C); @@ -229,0 +231,6 @@ + if (runningscript != NULL) { + fprintf(sendmail, "X-PHP-Script-Path: %s\n", runningscript); + } + else { + fprintf(sendmail, "X-PHP-Script-Path: Unknown\n"); + } 

在SMTP服务器上查找问题

由于您使用的是Postfix,因此在检查邮件队列时, pfqueue是您的朋友。 如果您在邮件队列中看到很多类似的垃圾邮件,只需启动pfqueue并使用它检查单个邮件的标题。 大部分时间足以让你知道垃圾邮件发送者; 头可能包含域信息,X-PHP-script头或其他线索。

我认为最快的解决办法可能是运行: cd /root/of/www ; grep -R 'mail(' * cd /root/of/www ; grep -R 'mail(' *这应该显示所有的文件中包含string'mail('。mail()是PHP用来发送邮件的函数,所以你可以在一个文件中识别虚拟主机和脚本走。