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

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

我的情况比较特殊。我有一个共享的 Debian Lenny 服务器,为不同的客户提供 100 多个虚拟主机。最近我注意到我的 Munin 图表中的 postfix 活动激增。服务器上的众多虚拟主机之一中似乎有一个 PHP 脚本用于发送电子邮件。首先,我知道 Postfix 没有捆绑任何设置来帮助限制外发电子邮件。我四处查看,发现 postfix-policyd 似乎是一个可行的解决方案。这就是我想要做的。

  1. 安装软件来帮助我识别哪个虚拟主机发送了最多的电子邮件
  2. 哪些 PHP 脚本被利用了

答案1

根据您的设置,您有几个选择。

如果使用 suphp 或类似程序,则在 Web 服务器上进行限制

如果您的 PHP 脚本通过类似机制运行suphp,该机制以拥有脚本的用户的权限运行脚本(而不是 Apache),则可以限制此单个帐户在某个时间间隔内可以发送的电子邮件数量。可以使用以下方法进行限制qpsmtpd;多年前用 Perl 编写了一个插件,将帐户名称存储到 MySQL,然后检查此用户最近发送了多少封邮件。如果超出阈值,邮件将被存储到临时隔离区,并发出警报,管理团队可以检查发生了什么。

至少在理论上,可以使用 Postfix-policyd 完成同样的事情 - 如果 PHP 可以发送经过身份验证的邮件,这将非常容易,但由于它通常不会这样做,因此您必须在创建限制规则时更具创造力。

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

如果 PHP 脚本以纯文本运行mod_php(因此每个脚本都以 Apache 用户身份运行),则发现有问题的脚本和限制邮件发送速率会变得更加困难。同样,这可以通过巧妙使用 来实现qpsmtpd

PHP 的最新版本包含一个选项,用于在每封电子邮件中包含X-PHP-Script标头。顾名思义,该标头包含 PHP 脚本的路径。您可以将该路径信息与一起使用qpsmtpd,并仅考虑 URL 的用户部分,然后以此方式进行限制。

如果您仍使用某个较旧的 PHP 版本,您仍然可以自行修补 PHP 邮件功能。我在 2005 年编写了一个小补丁,但最近没有使用它,所以我不知道它是否仍然有效。不过,这个想法应该很清楚:获取路径名,将其附加到每封邮件中。

--- 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 脚本标题或其他线索。

答案2

我认为最快的解决方案可能是运行:cd /root/of/www ; grep -R 'mail(' *这应该会向您显示所有包含字符串“mail(”的文件。mail()是 PHP 用于发送邮件的函数,因此您可能能够一次性识别 vhost 和脚本。

相关内容