6. 内容过滤
我们已经有了一个全功能邮件服务器了, 它可以发送和接收 email 以及提供远程访问用户邮箱的功能。不过, 如果你不想让服务器成为免疫的病毒搬运工、或者淹死在垃圾信息的海洋里(leo:这个比喻很好,可惜我翻译的不够俏皮), 我们需要安装所有的内容过滤工具。
尽管 Postfix 本身支持多种
内容检查机制, 但是它自己的
文档 也鼓励使用外部的过滤器以及标准的协议,因为这允许你根据自身目的选择最好的MTA和内容检查软件。 因此, 因为我们将依靠第三方软件来进行内容过滤; 特别是我们使用
SpamAssassin 过滤垃圾信息(spam),
ClamAV 检查 emails 病毒以及两者兼顾的
Amavisd-new 。 下面是整个构架的大致视图:
6.1 SpamAssassin
SpamAssassin 是一个成熟的、广为开发的开源项目,它可以为邮件服务器提供spam过滤。SpamAssassin使用包括header和内容分析、贝叶斯过滤、DNS黑名单以及协作过滤数据库等各种机制。
有不少要安装的:
- p5-Socket6-x.x.tgz
- p5-IO-INET6-x.x.tgz
- p5-HTML-Tagset-x.x.tgz
- p5-HTML-Parser-x.x.tgz
- p5-Net-IP-x.x.tgz
- p5-Digest-SHA1-x.x.tgz
- p5-Digest-HMAC-x.x.tgz
- p5-Net-DNS-x.x.tgz
- p5-URI-x.x.tgz
- p5-Net-SSLeay-x.x.tgz
- p5-IO-Socket-SSL-x.x.tgz
- libghttp-x.x.x.tgz
- p5-HTTP-GHTTP-x.x.tgz
- p5-libwww-x.x.tgz
- curl-x.x.x.tgz
- gnupg-x.x.x.tgz
- re2c-x.x.x.tgz
- p5-Crypt-OpenSSL-Random-x.x.tgz
- p5-Crypt-OpenSSL-Bignum-x.x.tgz
- p5-Crypt-OpenSSL-RSA-x.x.tgz
- p5-Time-TimeDate-x.x.tgz
- p5-Mail-Tools-x.x.tgz
- p5-Mail-DKIM-x.x.tgz
- p5-NetAddr-IP-x.x.tgz
- p5-Mail-SpamAssassin-x.x.x.tgz
完成安装后, 你会发现SpamAssassin的主配置文件 (local.cf) 在一个全新的 /etc/mail/spamassassin 目录里。配置段落的内容很复杂也不在本文的讨论氛围内; 不过, 你可以在它的用户手册上了解所有细节 (
Mail::SpamAssassin::Conf).
与Postfix类似, 尽管SpamAssassin有很多的配置参数, 不过, 多数情况下, 可以使用默认值,只需修改极少一部分参数:
文件 /etc/mail/spamassassin/local.cf
代码: 全选
rewrite_header Subject ***** SPAM *****
report_safe 1
lock_method flock
required_score 8.0
6.2 ClamAV
ClamAV 是一个基于Unix的开源 (GPL) 的反病毒工具包; 我们主要是为了把它整合进邮件服务器 (也就是附件扫描). 所有处理病毒的任务由下列三个进程来完成:
freshclam
[INDENT]它可以自动连接到ClamAV的
镜像站点 更新病毒定义; 它的配置文件是 /etc/freshclam.conf;
[/INDENT]clamd
[INDENT]一个灵活的、可伸缩的多线程病毒处理进程; 它的配置文件是 /etc/clamd.conf;
[/INDENT]clamscan
[INDENT]一个命令行的病毒扫描程序。
[/INDENT]
所需的packages为:
- arc-x.x.tgz
- lha-x.x.x.tgz
- unzip-x.x.tgz
- zoo-x.x.x.tgz
- unarj-x.x (from the ports)
- unrar-x.x (from the ports)
- clamav-x.x.tgz
配置文件 freshclam.conf 仅需设置少量的参数:
文件 /etc/freshclam.conf
代码: 全选
DatabaseDirectory /var/db/clamav
DatabaseOwner _clamav
DNSDatabaseInfo current.cvd.clamav.net
DatabaseMirror db.it.clamav.net
DatabaseMirror database.clamav.net
MaxAttempts 3
checks 24
现在你可以通过运行 freshclam 命令来更新病毒定义数据库。请确认你已经安装了最新版本的ClamAV, 否则你可能会看到如下所示的低级别functionality level的警告信息:
代码: 全选
# freshclam
ClamAV update process started at Tue Dec 18 00:35:25 2007
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Local version: 0.90.3 Recommended version: 0.92
DON'T PANIC! Read http://www.clamav.net/support/faq
Downloading main.cvd [100%]
main.cvd updated (version: 45, sigs: 169676, f-level: 21, builder: sven)
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Current functionality level = 16, recommended = 21
DON'T PANIC! Read http://www.clamav.net/support/faq
Downloading daily.cvd [100%]
daily.cvd updated (version: 5160, sigs: 8698, f-level: 21, builder: sven)
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Current functionality level = 16, recommended = 21
DON'T PANIC! Read http://www.clamav.net/support/faq
Database updated (178374 signatures) from db.it.clamav.net (IP: 193.206.139.37)
#
这里的低级别的 "functionality level" 意味着你可能不能使用全部的病毒定义,因此可能无法检测出最新的病毒。为了自动更新数据库, 我们只需在crontab进行设置,让freshclam每小时运行一次 (可能无需这样频繁, 这样做的目的是可以避开网络网络峰值导致的更新失败):
代码: 全选
16 * * * * /usr/local/bin/freshclam >/dev/null 2>&1
Also the /etc/clamd.conf configuration file needs editing only very few parameters:
文件 /etc/clamd.conf
代码: 全选
DatabaseDirectory /var/db/clamav
LocalSocket /var/clamav/clamd.sock
User _clamav
[...]
现在我们可以运行 clamd:
代码: 全选
# touch /var/log/clamd.log
# chown _clamav /var/log/clamd.log
# clamd
然后将下面的内容加入
/etc/rc.local(8) 使其随系统启动:
文件/etc/rc.local
代码: 全选
if [ -x /usr/local/sbin/clamd ]; then
echo -n ' clamd'
[ -S /var/clamav/clamd.sock ] && rm -f /var/clamav/clamd.sock
/usr/local/sbin/clamd >/dev/null 2>&1
fi
6.3 Amavisd-new
Amavisd-new 是一个mailer (MTA)和内容检查程序之间的高性能接口。我们将其绑定到loopback网络接口的10024端口, Postfix将用这个loopback网络接口转发所有的进站 e-mails。如果邮件成功地通过了各项检查, 它将被转发回Postfix, 监听端口是本地的10025; 否则, 邮件可能被删除或者隔离,然后管理员以及接收人可以注意到。
下面是所需的packages:
- cabextract-x.x.tgz
- freeze-x.x (from the ports)
- lzop-x.x.tgz
- lzo-x.x.tgz
- p5-Archive-Zip-x.x.tgz
- ripole-x.x.x.tgz
- p5-Convert-BinHex-x.x.tgz
- p5-IO-stringy-x.x.tgz
- p5-Mail-Tools-x.x.tgz
- p5-Time-TimeDate-x.x.tgz
- p5-MIME-tools-x.x.tgz
- p5-Convert-TNEF-x.x.tgz
- p5-Convert-UUlib-x.x.tgz
- rpm2cpio-x.x.tgz
- p5-Net-Server-x.x.tgz
- p5-Unix-Syslog-x.x.tgz
- amavisd-new-x.x.x.tgz
安装过程会创建一个 called _vscan 用户及组; 不过, 让Amavisd-new 与
ClamAV 配合的最简单的方式是以同一个用户(_clamav)的身份来一起运行这两个程序。配置文件是 /etc/amavisd.conf, 它实际上是一个perl脚本 (所以请注意每行结尾处的分号!); 下面是你可能想调整的选项:
文件 /etc/amavisd.conf
代码: 全选
# COMMONLY ADJUSTED SETTINGS:
$max_servers = 2;
$daemon_user = '_clamav'; # Run under the same user as ClamAV
$daemon_group = '_clamav'; # Run under the same group as ClamAV
$mydomain = 'kernel-panic.it';
$MYHOME = '/var/amavisd';
$TEMPBASE = "$MYHOME/tmp"; # Working directory, needs to be created manually
$ENV{TMPDIR} = $TEMPBASE;
$QUARANTINEDIR = '/var/clamav/quarantine';
[...]
# Leave only ClamAV uncommented
@av_scanners = (
['ClamAV-clamd',
\&ask_daemon, ["CONTSCAN {}\n", "/var/clamav/clamd.sock"],
qr/\bOK$/, qr/\bFOUND$/,
qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
);
[...]
# Leave only ClamAV uncommented
@av_scanners_backup = (
['ClamAV-clamscan', 'clamscan',
"--stdout --disable-summary -r --tempdir=$TEMPBASE {}", [0], [1],
qr/^.*?: (?!Infected Archive)(.*) FOUND$/ ],
);
1;
手动创建 Amavisd-new的工作目录 (/var/amavisd/tmp)后, 我们可以用debug模式(也就是in foreground)启动进程, 检查一下有无错误:
代码: 全选
# mkdir /var/amavisd/tmp
# chown -R _clamav:_clamav /var/amavisd/
# /usr/local/sbin/amavisd debug
Dec 18 22:07:11 mail.kernel-panic.it /usr/local/sbin/amavisd[24429]: starting.
/usr/local/sbin/amavisd at mail.kernel-panic.it amavisd-new-2.3.2 (20050629), Unicode aware
Dec 18 22:07:11 mail.kernel-panic.it /usr/local/sbin/amavisd[24429]: user=,
EUID: 0 (0); group=, EGID: 0 31 20 5 4 3 2 0 (0 31 20 5 4 3 2 0)
Dec 18 22:07:11 mail.kernel-panic.it /usr/local/sbin/amavisd[24429]: Perl version 5.008008
[...]
现在将 Amavisd-new 配置为随系统启动:
文件 /etc/rc.local
代码: 全选
if [ -x /usr/local/sbin/amavisd ]; then
echo -n ' amavisd'
/usr/local/sbin/amavisd >/dev/null 2>&1
fi
最后的步骤是更新 Postfix
配置 以确保Postfix和Amavisd-new的衔接完好。要完成这个任务, 我们必须在
/etc/postfix/master.cf(5) 配置文件里添加两个服务: 一个是将所有的进站 emails 转发给 Amavid-new, 而另一个是将 emails 再次发回:
文件 /etc/postfix/master.cf
代码: 全选
smtp-amavis unix - - - - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
-o max_use=20
127.0.0.1:10025 inet n - - - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_delay_reject=no
-o smtpd_client_restrictions=permit_mynetworks,reject
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks_style=host
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000
-o smtpd_client_connection_count_limit=0
-o smtpd_client_connection_rate_limit=0
-o receive_override_options=no_header_body_checks,no_unknown_recipient_checks
最后我们要告诉Postfix开始转发所有的它从amavisd-new接收的emails,这些邮件均经过了内容检查,还要通知Postfix重新载入配置文件。
代码: 全选
# postconf -e 'content_filter=smtp-amavis:[127.0.0.1]:10024'
# postfix reload
postfix/postfix-script: refreshing the Postfix mail system