Debian Jessie,Postfix + amavisd-new + spamassassin:不确定贝叶斯是否有效

Debian Jessie,Postfix + amavisd-new + spamassassin:不确定贝叶斯是否有效

尊敬的论坛各位礼貌人士,

我最近迁移到了一个新的邮件服务器。由于硬件“年龄差距”太大,很难同时从 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 开关运行时,sp​​rintf 中的依赖关系不安全。

那么 -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 解释器……

“我们来到这里真是太恐怖了,中士……”

(引用亨利·罗林斯在《迷失公路》中的话)

坦率

相关内容