Linux/GNU

开源邮件服务解决方案──iRedMail

2008-11-27 Toy Posted in Apps, ServerRSS

[作者/Zhang Huangbin]

iRedMail,中文名为”艾瑞得邮件”,由 rhms 项目更名而来。是针对 Red Hat(R) Enterprise Linux 和 CentOS 设计的邮件服务器解决方案,是在操作系统安装好后使用的一套 shell 脚本,用于快速部署一套功能完善的邮件服务器解决方案。

最新发布的 iRedMail 0.3.2-beta1 主要是基于 0.3.1 做了一些 bug 修正,完善已有组件的功能,并更新了少量软件包。

主要的改进有:

* Roundcube WebMail 现在已经搭配基于 LDAP 的方案,但用户自行修改密码和设置转发的功能暂时无法使用。设置假期自动回复的功能仍可正常使用。并且自动使用 OpenLDAP 做为全局地址簿。
* 从基于 LDAP 的方案中移除 postgrey,统一使用 Policyd v1 提供灰名单(greylist)服务。
注意:以上两个更改使得 MySQL 成为基于 LDAP 的方案中的一个必不可少的组件。
* 在 Horde WebMail 里,用户可以自定义邮件过滤规则,如果使用 OpenLDAP 存储邮件账号,则会默认使用 OpenLDAP 作为全局地址簿。
* 改进对已有 AMP (Apache, MySQL, PHP) 环境的支持。
* 默认为 MySQL 启用 SSL 支持。
* 默认使用 unix socket 方式连接 MySQL 数据库,性能更好一些。
* 首次引入 php-eaccelerator — PHP 加速器。
* 首次引入 Awstats-6.8 作为 web 和 mail 日志分析工具。
* 增加补丁用于修正 PostfixAdmin 登录页面的安全隐患。参考链接:https://sourceforge.net/mailarchive/forum.php?thread_name=49057E07.30…
* 在 logrotate 中默认使用 bzip2 对日志文件进行压缩,以得到更大的压缩比,为您节省一些磁盘空间。
* 修正 ExtMail 默认附件大小。感谢 tongds@gmail 的反馈。
* 在 Dovecot 中集成对磁盘容量告警、删除过期邮件的支持。但默认禁用。
注:用于邮箱容量告警的脚本需要自己编写,也可以从 iredmailsupport@ 邮件列表的文件下载区获得模板。
* 增强 mailgraph,现在可以正确统计 greylist 信息了。
* 软件包更新:
- ClamAV => 0.94.1。感谢 chenwei1973@gmail 的提醒。
- php-rrdtool, rrdtool => 1.2.28
- phpMyAdmin => 2.11.9.3
* 移除了几个工具脚本:
- tools/backup_mysql_db.sh:MySQL 数据库备份脚本
- tools/convert_winmail_mailbox.sh:迁移 WinMail 用户邮箱的脚本
- tools/create_mail_user_ldap.sh:批量创建 LDAP 用户的脚本
- tools/create_mail_user_mysql.sh:批量创建 MySQL 用户的脚本
- tools/get_helo_count.sh:统计 HELO 标识的脚本
- tools/migrate_extmail_mailbox.sh:迁移 ExtMail 用户的脚本
- tools/sysreport.sh:获取系统报告的脚本

项目主页:http://iredmail.googlecode.com
下载地址:http://code.google.com/p/iredmail/downloads/list

dspam 安装学习笔记

刚接触dspam一个多星期,把安装和学习的过程记录下来。不对的地方请多指教。

本文最初发表于 http://hi.baidu.com/delphiss/blog/item/24da4611395c33fac3ce79c3.html
转载请注明出处
作者:wdy

一、 安装

下载 dspam-3.8.0.tar.gz
#./configure \
--with-dspam-home=/var/dspam \
--with-dspam-home-owner=vmail \
--with-dspam-home-group=postdrop \
--with-dspam-mode=2510 \
--with-dspam-owner=vmail \
--with-dspam-group=postfix \
--with-delivery-agent=/usr/sbin/sendmail \
--with-storage-driver=mysql_drv \
--with-mysql-includes=/usr/include/mysql \
--with-mysql-libraries=/usr/lib/mysql \
--enable-preferences-extension \
--enable-virtual-users \
--enable-daemon \
--enable-debug \
--enable-syslog \
--enable-clamav \
--with-logdir=/var/log/dspam

#make
#make install
--with-storage-driver: 存储垃圾邮件识别数据用的存储器类型,这里用了mysql,其他类型请查询安装文档。
--with-dspam-home-owner 和 --with-dspam-owner 直接用了maildrop投递邮件的用户vmail,也可以单独建一个用户。
--enable-virtual-users 启用虚拟user,与unix系统用户分离。
--with-dspam-home:存储user和一些配置信息的路径。

创建mysql的库和表。

# cd src/tools.mysql_drv
# mysql -u root -p -e "create database dspam"
# mysql -u root -p -e "grant all on dspam.* to dspam@localhost identified by 'passwd123456'"

给 mysql_objects-4.1.sql 和 virtual_users.sql 增加一行内容到最上面:
use dspam;

# mysql -u dspam -p < mysql_objects-4.1.sql
# mysql -u dspam -p < virtual_users.sql

二、配置

安装后dspam的配置文件为 /usr/local/etc/dspam.conf,修改之

TrustedDeliveryAgent    /usr/sbin/sendmail
Trust root
Trust vmail
Trust postfix

# spamAction 表示识别为垃圾邮件后的处理,quarantine:扔到隔离区,tag:给邮件Subject增加标记,deliver:直接投递
# quarantine 需要设置 QuarantineAgent
Preference "spamAction=tag"
# spamSubject tag操作的时候给邮件Subject前面增加的字符
Preference "spamSubject=SPAM"
#signatureLocation: dspam给每个识别后的邮件编个号码,将来可以用作重新训练
#'message': 把signature加在邮件正文后面,'headers':把signature加在邮件头里
Preference "signatureLocation=headers" # 'message' or 'headers'
Preference "showFactors=on"

# mysql的设置
MySQLServer             /var/lib/mysql/mysql.sock
MySQLUser               dspam
MySQLPass               passwd123456
MySQLDb                 dspam
MySQLCompress           true

启动 dspam 后台进程:
#/usr/local/bin/dspam --daemon &

三、原理

先说明一一下dspam的基本原理和一个非常重要的概念:user。

dspam刚安装完成的时候,还不能识别垃圾邮件,因为没训练它。对它的训练,就是喂给他一些邮件,并注明是垃圾邮件还是不是垃圾邮件。dspam把垃圾或非垃圾邮件的特征存储下来,以备后面识别使用。

当dspam开始上岗工作的时候,它从标准输入里读取邮件内容,根据之前识别的数据和一些算法来确定邮件是否是spam,然后根据配置文件进行下一步的操作(给邮件打标记或扔到隔离区等)。

现在问题来了,如果一个用户总是把某些邮件训练为垃圾邮件,而另外一些用户不认为是垃圾邮件,就会造成识别混乱。所以dspam在训练或识别的时 候,都需要加一个参数 user ,通过 不同的 user 参数,把不用的用户的特征数据分开。设置 --enable-virtual-users后, user 参数只是一个字符符号,可以任意来取,不和系统账号或邮件账号必然对应。

下面的问题:怎么设定user?

基本的就两种方式:
1. 每个邮箱账号对应一个训练和识别user,user的名字可以设置成邮箱账号(user@domain.com),每个用户自己训练dspam识别垃圾邮件。
2. 系统使用一个全局固定的user,由管理员来训练识别垃圾邮件,这个全局user来为所有的邮箱账号服务。

上面的方案各有利弊。
方案1优点是用户自己训练邮件,不会造成有异议识别,缺点就是每个用户得自己亲自来训练。如果用户账号数目很多,n多的user管理也是个麻烦事。
方案2的优点是用户不必自己训练了,由管理员代劳,但可能会造成误识别。比如管理员认为某邮件是垃圾邮件,而一些用户则认为不是。

如果确定使用方案1,可以加上参数 --enable-domain-scale,这样user的数据可以存储为 $HOME/data/domain.com/user,否则就是 $HOME/data/user。

本文后面用是方案2。

四、训练识别

比如我们手头有个垃圾邮件的样本: spam01.eml,可以这样训练它

cat spam01.eml | /usr/local/bin/dspam --mode=teft --source=corpus --class=spam --feature=noise --user mydspam

--class=spam 表示训练识别垃圾邮件,训练识别非垃圾邮件则用参数 --class=innocent
--source=corpus 与 --source=error 对应的设置
--user mydspam 训练的user,dspam会自动创建。

dspam提供了一个批量训练邮件的命令:

dspam_train [username] [spam_dir] [nonspam_dir]

username 是训练用的user,spam_dir 和 nonspam_dir 是垃圾邮件和非垃圾邮件存储的目录。目录下每个邮件一个文件。

五、postfix的配置

修改master.cf 加上:

dspam   unix    -       n       n       -       10      pipe
flags=Rhqu user=vmail argv=/usr/local/bin/dspam --deliver=innocent --user mydspam -i -f $sender -- $recipient

dspam就是用来识别处理垃圾邮件的transport,
--user mydspam 是识别邮件的user。如果采用方案1,那么有可能就是 --user $user 或 --user $recipient。
--deliver=innocent 表示对非垃圾邮件进行投递。
-f $sender -- $recipient 告诉dspam发信人和收信人地址。

交给dspam的邮件,dspam先根据 user 参数取出之前训练产生的特征数据进行识别,识别后会调用 /usr/sbin/sendmail 再送给postfix,postfix则会交给maildrop等mda将邮件投入邮箱。

main.cf 需要增加:
dspam_destination_recipient_limit = 1

下面一个问题:在哪个环节让postfix来识别处理垃圾邮件?

postfix灵活的结构可以设置在n个地方进行垃圾邮件的过滤,比如 给smtpd 增加参数:-o content_filter=dspam: 等等,这里用下面的一种方式。

修改 main.cf:
smtpd_client_restrictions =
permit_sasl_authenticated,
permit_mynetworks,
check_client_access pcre:/etc/postfix/dspam_filter_access

check_client_access 将根据smtp客户端host和ip进行过滤判别。
permit_sasl_authenticated permit_mynetworks 避免了对SMPT用户认证通过的和mynetworks的客户端的垃圾邮件识别。

# vi /etc/postfix/dspam_filter_access
/./     FILTER dspam:dspam

/./ 是个正则表达式,表示匹配所有主机和ip。

通过maillog可以看到dspam的工作情况。
dspam会给经手的邮件头部加上自己的信息。
X-DSPAM-Result: Spam 表示此封邮件为 spam
X-DSPAM-Result: Innocent 表示此封邮件为 nonspam

六、配置DSPAM Web Control

DSPAM Web Control 的功能是让dspam的user设置个人参数,查看识别邮件记录,还可以重新训练识别错误的邮件。
Web Control的用户通过Apache的HTTP Auth来登录,所以要把dspam user加到AuthUserFile里。
(前面提到的方案1在这里会有很大的问题)

#mkdir /var/www/cgi-bin/dspam
#cp -R webui/cgi-bin/* /var/www/cgi-bin/dspam/
#cp webui/htdocs/base.css /var/www/htdocs/
#cp webui/htdocs/dspam-logo-small.gif /var/www/htdocs/
#chown -R vmail.vmail /var/www/cgi-bin/dspam/

base.css 和 dspam-logo-small.gif 拷贝到apache的 DocumentRoot

创建apache http auth 用户
#/usr/local/apache2/bin/htpasswd -c /usr/local/apache2/dspam.pass mydspam

设置管理员用户名:
echo “mydspam” > /var/www/cgi-bin/dspam/admins
修改 Apache httpd.conf
<Directory "/var/www/cgi-bin/dspam">
Options ExecCGI
Options -Indexes
DirectoryIndex dspam.cgi
AllowOverride All
Order deny,allow
Deny from all
AuthType Basic
AuthName "DSPAM Control Center"
AuthUserFile /usr/local/apache2/dspam.pass
Require valid-user
Satisfy Any
</Directory>

ScriptAlias /dspam /var/www/cgi-bin/dspam

Web Control 生成图形需要用到Perl的几个图形模块: GD::Graph::bars, GD, GD::Graph, GD::Text::Align,请安装。

修改 /var/www/cgi-bin/dspam/configure.pl

$CONFIG{'DSPAM_HOME'}   = "/var/dspam";
$CONFIG{'DSPAM_BIN'}    = "/usr/local/bin";
$CONFIG{'LOCAL_DOMAIN'} = "yourdomain.com";

#下面两个根据编译参数修改
#$CONFIG{'LARGE_SCALE'} = 0;
#$CONFIG{'DOMAIN_SCALE'} = 0;
打开网页 http://host/dspam/dspam.cgi , 输入用户名口令登录。

Linux 查看内核,CPU,内存信息命令

查看系统内核版本命令:

[root@SYS3 ~]# uname -a
Linux SYS3 2.6.18-53.el5 #1 SMP Wed Oct 10 16:34:19 EDT 2007 x86_64 x86_64 x86_64 GNU/Linux

查看系统版本

[root@SYS3 ~]# more /etc/redhat-release
Red Hat Enterprise Linux Server release 5.1 (Tikanga)

查看内核版本gcc版本

[root@SYS3 /]# more /proc/version
Linux version 2.6.18-53.el5 (brewbuilder@hs20-bc1-7.build.redhat.com) (gcc version 4.1.2 20070626 (Red Hat 4.1.2-14)) #1 SMP
Wed Oct 10 16:34:19 EDT 2007

查看cpu 信息

[root@SYS3 /]# grep "model name" /proc/cpuinfo
model name : Intel(R) Core(TM)2 CPU 6320 @ 1.86GHz

[root@SYS3 /]# more /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 CPU 6320 @ 1.86GHz
stepping : 8
cpu MHz : 1866.663
cache size : 4096 KB
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2
ss syscall nx lm constant_tsc up pni ds_cpl cx16 lahf_lm
bogomips : 3741.81
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual
power management:

查看cpu 的位数

[root@SYS3 /]# getconf LONG_BIT
64

查看内存信息

[root@SYS3 /]# more /proc/meminfo
MemTotal: 1027180 kB
MemFree: 79432 kB
Buffers: 191460 kB
Cached: 570760 kB
SwapCached: 0 kB
Active: 402036 kB
Inactive: 440556 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 1027180 kB
LowFree: 79432 kB
SwapTotal: 2031608 kB
SwapFree: 2031608 kB
Dirty: 4 kB
Writeback: 0 kB
AnonPages: 80348 kB
Mapped: 21416 kB
Slab: 83604 kB
PageTables: 7528 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 2545196 kB
Committed_AS: 172384 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 1936 kB
VmallocChunk: 34359736391 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
Hugepagesize: 2048 kB