尊敬的论坛各位礼貌人士,
我最近迁移到了一个新的邮件服务器。由于硬件“年龄差距”太大,很难同时从 Debian Squeeze 升级到 Jessie(而且可能也无法解决我的问题)。所以我只是安装了一个干净的 Jessie,并手动移动了用户帐户、旧电子邮件等。好吧,至少我对内部情况有了更多的了解。
我似乎正在努力解决的一个问题是 Spamassassin 运营的贝叶斯数据库 -被 amavisd-new 奴役。(嘿,当我想将垃圾邮件分数标头包含在每一个电子邮件消息:$sa_tag_level_deflt 位于阿马维斯配置文件。
我有
use_bayes 1
bayes_path /var/lib/spamassassin/.spamassassin/bayes
在 spamassassin/local.cf 中。我发现路径以“bayes”结尾有点奇怪,但最后一个字符串并不是一个实际的目录,它似乎只是 _toks 和 _seen 文件的前缀。
如果我尝试“spamassassin -D --lint 2>&1 | less”,我可以看到一些赞扬:
Jul 9 11:21:15.091 [5076] dbg: bayes: tie-ing to DB file R/O /var/lib/spamassassin/.spamassassin/bayes_toks
Jul 9 11:21:15.091 [5076] dbg: bayes: tie-ing to DB file R/O /var/lib/spamassassin/.spamassassin/bayes_seen
可能取决于我运行它的目录,我曾经在该列表中看到过 BAYES_20。
此外,sa-learn-cyrus 似乎正在顺利更新数据库,并且 sa-sync 也没有抱怨。
我实际上已经从旧服务器迁移了贝叶斯数据库文件,使用
sa-learn --backup
sa-learn --restore=...
并且我必须在之后调整一些权限...sa-learn-cyrus.conf 包含它应该在其下运行的用户和组,这应该与数据库的所有权相匹配。
现在来看看令人好奇的一点:
我看不到贝叶斯过滤器对通过的电子邮件进行任何实际工作的痕迹。Amavis 确实有效,我可以在 /var/log/amavis.log 中看到它的操作,有时它会根据其其他启发式规则。但我未能在收到的电子邮件(现在确实包含预期的 X-Spam-Status 标头)中捕获 BAYES 分数,也未能在 /var/virusmails 中隔离的高度积极内容中捕获 BAYES 分数。
换句话说,如果我在 /var/log/ 和 /var/virusmails/ 中运行“grep -ri bayes *”,我将什么也得不到 :-(
贝叶斯过滤器是否可能正在起作用而我只是不知道?
如果贝叶斯过滤器实际上不起作用(在 amavisd-new 下的 spamassassin 中),我还应该在哪些地方寻找相关配置?
如果它可以正常工作,有没有办法增加它的详细程度?让它的分数始终打印在某些日志中,或者最好包含在 X-Spam-Status 标头中?
另外,我有没有办法将贝叶斯分数映射到 Spamassassin 分数增量?我的意思是 - 查看并配置 Amavis 或 SA 如何添加贝叶斯贡献...
我还想知道系统中是否缺少了某些东西,例如未安装软件包。但是“aptitude search bayes”只返回“spambayes”,这是某个基于 python 的项目,与 spamassassin 的贝叶斯过滤器竞争……
欢迎任何想法:-)
坦率
答案1
我似乎找到了答案:在 /etc/spamassassin/local.cf 中,您需要:
use_bayes 1
bayes_auto_learn 1
use_bayes_rules 1
就我的情况来说,缺少的是第三行。
顺便说一句,在寻找问题时,我设法在 Spamassassin Perl 模块内部插入了一个“日志探测器”,它为我打印了一个 Perl 调用堆栈回溯:
在 /usr/share/perl5/Mail/SpamAssassin/BayesStore/DBM.pm 中:
sub tie_db_readonly {
...
my $iii = 1;
print dbg("Stack Trace:");
while ( (my @call_details = (caller($iii++))) ){
dbg( $call_details[1].":".$call_details[2]." in function" . \
$call_details[3] );
}
几乎逐字逐句摘自Thariama 的帖子在这里。
显然我需要一些调试切换来显示调试消息:
在 /etc/amavis/conf.d/50-user 中:
$DO_SYSLOG = 0;
$LOGFILE = "/var/log/amavis.log";
$sa_tag_level_deflt = -9999; # always add spam info headers
$log_level = 2;
$sa_debug = 1;
实际上,只有最后两行才是 Amavis 和 SpamAssassin 中调试的关键。上面的几行仅供参考。
==== 一小时后编辑:====
...但等一下,还有更多,似乎这还没有结束 :-)
就在我发送了之前那条乐观的消息后,我却得到了一记冷水澡:贝叶斯分数又不见了。所以我又回到了某个严肃的调试级别,尝试删除一些与我当时正在玩的自动过期相关的配置,但即使我将配置恢复到以前的工作状态,贝叶斯分数也消失了。同样的症状。
当我悲伤地翻看调试日志时,我注意到了另一个有希望的警告:
_WARN:插件:eval 失败:在 /usr/share/perl5/Mail/SpamAssassin/Logger.pm 第 241 行使用 -T 开关运行时,sprintf 中的依赖关系不安全。
那么 -T 开关到底是什么……
人 perl
无法在那里找到它(希望我知道正确的章节)。
spamassassin 源代码也帮不上什么忙。
但经过一番谷歌搜索,在我缩小了查询范围之后,我得到了这个:
http://search.cpan.org/~bdfoy/PerlPowerTools-1.012/bin/printf
还有其他一些指向
“运行 setuid 时 eval 中的依赖关系不安全”
一样吗?可能吧。-T 开关用于“污点模式”。
https://perldoc.perl.org/perlsec.html#Taint-mode
这是一种安全措施,这样您随意的“带有 printf 的 eval”就不会轻易被劫持进行“代码注入”。
那么 -T 开关到底在哪里发挥作用呢?
SpamAssassin 作为 Amavis 的一个模块运行。
我已经知道 Amavis 实际上是一个 Perl 脚本。
Perl 解释器可能使用 /usr/sbin/amavisd-new 第一行中的 #! shell 规范进行调用。
完全正确。
从那里开始,解决方法就很简单了。
但是...哎呀!我可能不应该告诉任何人:->
不过……我不明白为什么它突然工作了一段时间,然后突然不再工作了。隐藏状态在哪里?每次更改配置文件后我都会重新启动 Amavis,这意味着我每次都会重新启动 Perl 解释器……
“我们来到这里真是太恐怖了,中士……”
(引用亨利·罗林斯在《迷失公路》中的话)
坦率