电子邮件系统概述
邮件系统角色
在Internet中,电子邮件系统并不是一个孤立的体系,除了需要DNS服务提供邮件域名的解析
可以使用Web服务提供用户界面以外,邮件系统的内部也是由不同的软件程序组成的
MTA 邮件传输代理
负责接受客户端邮件,并将其传输给其他的MTA
MTA是电子邮件系统的核心部分。例如Sendmail,Postfix和Exchange。
MDA 邮件分发代理
负责在服务器中将邮件分发到用户邮箱。有些MTA集成MDA功能。例如Exchange。
MUA 邮件用户代理
负责提供邮件阅读,撰写,发送,接收等管理界面。例如Mutt,Pine等。
邮件系统协议
RFC822
电子邮件报文格式,规定了电子邮件由邮件头和邮件内容两个部分组成。
SMTP
发送和传输电子邮件。MUA使用SMTP协议将邮件发送给MTA
MTA使用SMTP协议将邮件传输给其他的MTA。SMTP协议使用端口TCP 25,发信认证部分被称为ESMTP
POP3
从邮件服务器获取邮件,然后在离线处理邮件。POP3协议使用端口TCP 110。
IMAP4
以联机的方式处理邮件,可以选择性下载邮件。IMAP4协议使用端口TCP 143。
MIME
现代邮件传输格式,让电子邮件具备传输二进制文件的能力。
邮件服务器软件
Exchange
微软的企业电子邮件方案,多用于企业环境。
Notes/Domino
由Lotus公司开发的电子邮件产品,后被IBM收购,多用于政府机构,银行等大型机构。
Sendmail
最早的Unix/Linux电子邮件系统。配置相对复杂,安全性欠佳。
Qmail
易于二次开发的Unix/Linux电子邮件系统。企业按照自己的需求,修改Qmail的源代码实现特定的功能。
Postfix
Sendmail的替代品。
Postfix基础
Postfix 采用模块化设计,由不同的程序实现不同的功能
Postfix的主进程名为 master ,由主进程根据需求启动其他程序协同处理邮件。
Postfix可以直接使用本地系统用户作为邮件用户,也可以使用虚拟用户
虚拟用户帐号信息通常存储在MySQL数据库中。
wget http://www.postfix.cn/source/official/postfix-2.7.3.tar.gz
wget http://vda.sourceforge.net/VDA/postfix-vda-2.7.2.patch
编译安装Postfix
预处理
service sendmail stop
rpm -qa | grep sendmail | xargs rpm -e --nodeps
创建服务用户和组
groupadd -g 1200 postdrop
groupadd -g 1000 postfix
useradd -M -u 1000 -g postfix -G postdrop -s /sbin/nologin postfix
解压源码包
tar zxvf postfix-2.7.3.tar.gz
cd postfix-2.7.3
patch -Np1 < ../postfix-vda-2.7.2.patch
配置源码包
yum install db4-devel
yum install cyrus-sasl-devel
或
rpm -ivh /media/cdrom/Server/db4-devel-4.3.29-9.fc6.i386.rpm
rpm -ivh /media/cdrom/Server/cyrus-sasl-devel-2.1.22-4.i386.rpm
make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include/ -DUSE_CYRUS_SASL -DUSE_SASL_AUTH -I/usr/include/sasl' 'AUXLIBS=-L/usr/local/mysql/lib/ -lmysqlclient -lm -lz -L/usr/lib/sasl2 -lsasl2'
编译并安装
vim /etc/ld.so.conf
/usr/local/mysql/lib/
ldconfig -v
make && make install
Postfix目录
/etc/postfix/
主配置目录,包含主配置文件,各类脚本,查询表等。
/etc/postfix/main.cf
主配置文件
/etc/postfix/master.cf
master程序配置文件
/usr/libexec/postfix/
服务器程序目录
/var/spool/postfix/
邮件队列相关目录
/var/spool/postfix/incoming/
传入队列
/var/spool/postfix/active/
活动队列
/var/spool/postfix/deferred/
推迟队列
/var/spool/postfix/hold/
约束队列
/var/spool/postfix/corrupt/
错误队列
/usr/sbin/
服务管理程序目录
/usr/sbin/postalais
用于构造,修改和查询别名表
/usr/sbin/postconf
用于显示和编辑主配置文件
/usr/sbin/postfix
用于启动和停止postfix服务
/usr/sbin/postmap
用于构造,修改或查询查询表
/usr/sbin/postqueue
用于一般用户管理邮件队列
/usr/sbin/postsuper
用于超级用户管理邮件对列
Postfix配置文件
Postfix系统最主要的配置文件包括: /etc/postfix/main.cf
和 /etc/postfix/master.cf
。
/etc/postfix/main.cf
是Postfix服务的主配置文件。 /etc/postfix/main.cf
是master程序配置文件。
/etc/postfix/main.cf
配置项有300多个,大部分配置都设置了默认值
大多数时候只需要配置少数几个参数,就可以满足一般邮件服务器的要求。
Postfix系统提供了 postconf 工具用来辅助配置
不带任何选项的postconf命令将显示当前Postfix服务所使用的配置参数, -n 选项则显示不同于默认配置的参数。
postconf
postconf -n
邮件管理员经常使用postconf命令简化 /etc/postfix/main.cf
文件
只保留与默认配置不同的参数,提高主配置文件的易读性。
cd /etc/postfix/
postconf -n > new.cf
cp main.cf main.cf.bak
mv new.cf main.cf
cat main.cf
Postfix日志文件
Postfix系统的日志文件位于 /var/log/maillog
文件中,该文件记录了Postfix服务器运行状态信息
在安装调试Postfix邮件系统及日常维护过程中,经常会使用 tail 命令带 -f 选项实时观察日志内容变化。
tail -f /var/log/maillog
如果日志内容较多,还可以使用 egrep 命令进行过滤
只关注包含 reject warning error fatalpanic 等比较重要的事件记录。
egrep '(reject|warning|error|fatal|panic):' /var/log/maillog
Postfix启动控制
Postfix服务的启动控制主要通过 /usr/sbin/postfix
命令来完成。
postfix (start|stop|check|reload)
postfix start
netstat -antpl | grep :25
基于Postfix构建简单电子邮件系统
构建基本发信,收信服务器的配置和测试。
IP地址
192.168.1.n
邮件域
benet99.com
主机名
mail.benet99.com
邮件账号
test
POP3/IMAP4服务
dovecot
LAMP平台
/usr/local/apache2/
/usr/local/mysql/
/usr/local/php5
域名服务器
192.168.1.100
配置并测试Postfix服务器
Postfix主要提供基于SMTP协议的发信服务,其最基本的功能就是存储和发送邮件。
修改主配置文件
Postfix主配置文件内不能使用 单引号 或 双引号 。vim /etc/postfix/main.cf
内容为:
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
home_mailbox = Maildir/ //指定邮件存储目录
html_directory = no
mail_owner = postfix
mailq_path = /usr/bin/mailq
manpage_directory = /usr/local/man
mydestination = $mydomain, $myhostname //指定接收邮件域名
mydomain = benet.com //指定邮件域名
myhostname = mail.benet.com //指定邮件主机名
myorigin = $mydomain //指定发送邮件域名
newaliases_path = /usr/bin/newaliases
queue_directory = /var/spool/postfix
readme_directory = no
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
setgid_group = postdrop
unknown_local_recipient_reject_code = 550
用户的邮箱空间用于保存各自的电子邮件内容。在Postfix服务器中,支持两种邮箱存储方式。
postfix reload
netstat -antpl | grep :25
Mailbox
所有邮件存储在同一个文件内,默认是
/var/spool/mail/username
,每个邮件之间以特定的标记分割。Maildir/
使用目录结构来存储,每一封邮件保存成一个文件,每个文件名称一般有一定的规律
例如会包含时间戳、pid及inode节点号等每一封邮件作为一个独立的文件保存。
添加邮件用户账号
使用Linux系统账号发送邮件。
发送邮件测试
telnet localhost 25
helo localhost
mail from: hacker@linux.com
rcpt to: leiyue@benet.com
data
subject: Test Mail
from: hacker@linux.com
to: leiyue@benet.com
hello!
this is a test mail!
.
quit
构建Dovecot服务器
Dovecot是一个安全性较好的POP3/IMAP服务器软件,响应速度快且扩展性好
Dovecot默认使用Linux系统用户,通过PAM方式进行身份验证。
下载软件
wget http://www.dovecot.org/releases/2.0/dovecot-2.0.11.tar.gz
预处理
useradd -M -s /sbin/nologin dovecot
useradd -M -s /sbin/nologin dovenull
解压源码包
tar zxvf dovecot-2.0.11.tar.gz
cd dovecot-2.0.11
安装PAM开发包
yum install pam-devel
或
rpm -ivh /media/cdrom/Server/pam-devel-0.99.6.2-3.27.el5.i386.rpm
配置编译安装
./configure --sysconfdir=/etc --with-mysql --with-pam
make && make install
修改配置文件
vim /etc/dovecot/dovecot.conf
内容为:
ssl = no
protocols = pop3 imap
disable_plaintext_auth = no
mail_location = maildir:~/Maildir
passdb {
driver = pam
}
userdb {
driver = passwd
}
检查配置文件
doveconf -n
编辑PAM文件
cp ~/dovecot.pam /etc/pam.d/dovecot
或
vim /etc/pam.d/dovecot
内容为:
#%PAM-1.0
auth include system-auth
account include system-auth
password include system-auth
session include system-auth
添加为系统服务
cp ~/dovecot.server /etc/init.d/dovecot
chmod a+x /etc/init.d/dovecot
chkconfig --add dovecot
chkconfig dovecot on
启动服务
service dovecot start
netstat -antpl | grep dovecot
POP3接收邮件测试
telnet localhost 110
user leiyue
pass pwd@123
list
retr 1
quit
使用Outlook Express邮件客户端
此处省略xxxx字。
扩展Postfix邮件系统的功能
WEBMAIL邮件界面
Webmail是指提供给邮件用户发信收信的Web界面。通过访问邮件系统提供的Web界面,可以和邮件客户端软件实现相同的邮件管理功能。使用Webmail简单,便捷,在Internet邮件服务中得到了广泛的应用。
Postfix邮件系统支持多种Webmail,例如:OpenWebmail,Extmail,SquirreMail等。
下载软件包
wget http://downloads.sourceforge.net/project/squirrelmail/stable/1.4.21/squirrelmail-1.4.21.tar.bz2
wget http://downloads.sourceforge.net/project/squirrelmail/locales/1.4.18-20090526/zh_CN-1.4.18-20090526.tar.gz
解压软件包
tar jxvf squirrelmail-1.4.21.tar.bz2 -C /usr/local/apache2/htdocs/
mv /usr/local/apache2/htdocs/squirrelmail-1.4.21 /usr/local/apache2/htdocs/webmail
cd /usr/local/apache2/htdocs/webmail
tar zxvf ~/zh_CN-1.4.18-20090526.tar.gz
调整权限设置
mkdir -p attach data
chown -R daemon:daemon attach/ data/
chmod 730 attach/
修改配置文件
cp config/config_default.php config/config.php
vim config/config.php
修改以下内容:
$domain = 'benet.com';
$smtpServerAddress = 'localhost';
$smtpPort = 25;
……
$imapServerAddress = 'localhost';
$imapPort = 143;
$imap_server_type = 'dovecot';
……
$data_dir = '/usr/local/apache2/htdocs/webmail/data/';
$attachment_dir = '/usr/local/apache2/htdocs/webmail/attach/';
……
$squirrelmail_default_language = 'zh_CN';
$default_charset = 'zh_CN.UTF-8';
启动Web服务访问Webmail
访问 http://www.benet.com/webmail/ 。
设置SMTP的用户认证
SMTP发信认证是避免被人当作垃圾发送邮件服务器的必要措施。当用户通过SMTP协议向外部邮件域发送邮件时
服务器要求用户提供用户名和密码进行身份烟长。只有通过身份验证的用户才被允许发送外部邮件,否则将拒绝发信。
在Postfix邮件系统中,可以使用Cyrus SASL软件来实现基本的SMTP认证机制。
rpm -qa | grep cyrus
cyrus-sasl-2.1.22-4
cyrus-sasl-lib-2.1.22-4
cyrus-sasl-devel-2.1.22-4
cyrus-sasl-plain-2.1.22-4
设置Cyrus SASL函数库
vim /usr/lib/sasl2/smtpd.conf
内容为:
pwcheck_method:saslauthd
启动saslauthd服务
service saslauthd start
chkconfig saslauthd on
修改主配置文件
vim /etc/postfix/main.cf
内容为:
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
home_mailbox = Maildir/
html_directory = no
mail_owner = postfix
mailq_path = /usr/bin/mailq
manpage_directory = /usr/local/man
mydestination = $mydomain, $myhostname
mydomain = benet.com
myhostname = mail.benet.com
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases
queue_directory = /var/spool/postfix
readme_directory = no
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
setgid_group = postdrop
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination //指定smtpd允许和拒绝条件
smtpd_sasl_auth_enable = yes //指定smtpd认证方式
smtpd_sasl_security_options = noanonymous //拒绝匿名用户访问
unknown_local_recipient_reject_code = 550
测试SMTP发信认证
添加了SMTP发信认证就不能作为发信服务器发送邮件。使用密文测试SMTP发信认证
telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.benet.com ESMTP Postfix
helo localhost
250 mail.benet.com
mail from: leiyue@benet.com
250 2.1.0 Ok
rcpt to: d0nny@163.com
554 5.7.1 <d0nny@163.com>: Relay access denied
quit
221 2.0.0 Bye
Connection closed by foreign host.
telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.benet.com ESMTP Postfix
helo localhost
250 mail.benet.com
auth login
334 VXNlcm5hbWU6
bGVpeXVl
334 UGFzc3dvcmQ6
cHdkQDEyMw==
235 2.7.0 Authentication successful
mail from: leiyue@benet.com
250 2.1.0 Ok
rcpt to: d0nny@163.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject: test mail
from: leiyue@benet.com
to: d0nny@163.com
this is a test mail for d0nny@163.com
.
250 2.0.0 Ok: queued as 869682F408
quit
221 2.0.0 Bye
Connection closed by foreign host.
获得用户名和密码的加密密文
printf "leiyue" | openssl base64
命令结果为:
bGVpeXVl
printf "pwd@123" | openssl base64
命令结果为:
cHdkQDEyMw==
设置用户别名与邮件群组
邮件别名是邮件系统的重要功能,主要来实现邮件的群发。邮件别名依赖于 aliases 机制,需要用到查询表。
Postfix查询表
Postfix服务器在处理邮件的过程中经常需要做各种转换和查询,需要使用查询表/etc/aliases
来完成。postconf | grep aliases
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases, nis:mail.aliases
设置邮件别名实现群发
修改别名表。vim /etc/aliases
添加以下内容:
root: leiyue
hr: leiyue
使用 newaliases 命令生成
/etc/aliases.db
数据库文件。Postfix系统将识别并使用/etc/aliases.db
文件中的设置。newaliases
设置邮件大小,邮箱空间限制
限制用户发送邮件大小
Postfix系统默认支持10MB大小的邮件,需要注意的是这里的大小是经过Base64函数编码后的邮件大小。postconf | grep message_size_limit
message_size_limit = 10240000
修改发送邮件的默认大小为20MB。
vim /etc/postfix/main.cf
添加以下内容:
message_size_limit = 20480000
postfix reload
限制用户邮箱空间大小
在Postfix邮件系统中,根据邮件用户的类型,邮件存储的方式不同可采取不同的方法来限制用户邮箱空间大小使用 quota 磁盘配额
针对使用系统用户的情况,可直接使用Linux的磁盘配额功能对用Mailbox和Maildir存储方式的用户都生效。使用 virtualmailboxlimit 配置项
主要针对使用虚拟用户的情况,默认限制50MB安装VDA补丁后,该参数对使用Mailbox或Maildir存储方式的用户都生效。
postconf | grep virtual_mailbox_limit
virtual_mailbox_limit = 51200000
virtual_mailbox_limit_inbox = no
virtual_mailbox_limit_maps =
virtual_mailbox_limit_override = no
使用 mailboxsizelimit 配置项
主要针对使用系统用户的情况,默认限制是50MB。该参数对使用Mailbox邮件存储方式的用户生效。postconf | grep mailbox_size_limit
mailbox_size_limit = 51200000
构建Postfix邮件服务器(二)
配置Postfix支持虚拟用户
当邮件用户达到一定数量时,邮件系统将在用户安全,系统管理以及数据维护等方面遇到巨大的挑战
为了提供更好的性能,效率和安全性,使用虚拟邮件用户将是一个更好的选择。
建立虚拟用户数据库
ExtMail是由国内开源组织使用Perl语言开发的一套功能强大的中文Webmail平台
主要包括ExtMail和Extman两个部分的程序套件。
ExtMail
提供给邮件用户使用邮件系统的Web界面
Extman
提供给邮件系统管理员管理邮件系统的Web界面
访问站点 http://www.extmail.org/cgi-bin/download.cgi 下载软件包ExtMail和Extman最新版。
用 Extman 虚拟邮件管理系统在MySQL数据库中建立初始化数据库和表,用于保存虚拟邮件域,虚拟邮件用户相关信息
service mysqld restart
tar zxvf extman-1.1.tar.gz
cd extman-1.1/docs
mysql -u root -p < extmail.sql
由于数据库版本不同,导入 extmail.sql 数据库时报错:
ERROR 1064 (42000) at line 50: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=MyISAM COMMENT='Ext/Webman - Admin Accounts'' at line 15
用文本编辑器打开extmail.sql,将数据库文件内的所有 TYPE=MyISAM 替换为 ENGINE=MyISAM ,保存退出。
丢弃导入到一半出错的数据库 extmail 。
mysql -u root -p
mysql> drop database extmail;
重新导入数据库。
mysql -u root -p < extmail.sql
mysql -u root -p < init.sql
脚本 extmail.sql 完成的主要数据库操作:
创建名为
extmail
的数据库,初始化一些表。创建数据库用户
extmail@localhost
,密码为extmail
,对数据库extmail的表有select,update权限。创建数据库用户
webman@localhost
,密码为extman
,对数据库extmail表有select,insert,delete,update权限。
脚本 init.sql 完成的主要数据库操作:
初始化数据库
extmail
建立名为
extmail.org
的虚拟邮件域建立数据库用户
root@extmail.org
,密码为extman*123*
,作为邮件域的管理账号。建立数据库用户
postmaster@extmail.org
,密码为extmail
,作为基本邮件用户。
修改Postfix配置
使用虚拟邮件域时,其中邮件域名,邮件用户名,密码及邮件别名等信息都存储在MySQL数据库中。当Postfix接收到一封新邮件时,首先检查是不是发往本地域的邮件,如果不是则转向数据库查询是不是发往虚拟域的邮件,确认收件人是否存在、用户邮箱路径等信息。
了解当前的Postfix系统是否支持MySQL数据库。
postconf -m | grep mysql
修改Postfix的主配置文件,添加虚拟邮件用户配置项。
vim /etc/postfix/main.cf
修改以下内容:
……
# mydestination = $mydomain, $myhostname
……
virtual_mailbox_base = /var/mailbox
virtual_alias_maps = mysql:/etc/postfix/mysql_virtual_alias_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql_virtual_mailbox_maps.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql_virtual_domains_maps.cf
virtual_uid_maps = static:1000
virtual_gid_maps = static:1000
各配置项具体作用如下:
virtual_mailbox_base
指定虚拟邮箱存储目录
virtual_alias_maps
指定虚拟邮件用户对应别名
virtual_mailbox_maps
指定记录虚拟邮箱和存储位置的对应关系
virtual_mailbox_domains
设置Postfix服务器可以接收的虚拟邮件域域名
virtual_uid_maps
设置所有虚拟邮件用户映射用户的UID号
virtual_gid_maps
设置所有虚拟邮件用户映射组的GID号
将extman提供的虚拟用户映射表文件复制到Postfix的配置目录中。
cp *.cf /etc/postfix/
为虚拟用户设置SMTP发信认证
由于虚拟邮件用户的账号信息保存在MySQL数据库中,仅仅使用Cyrus SASL已经无法完成SMTP发信认证
这时需要结合Courier-authlib的 authdaemond 服务才能提供基于MySQL数据库虚拟用户的SMTP发信认证
下载源码包
wget http://downloads.sourceforge.net/project/courier/authlib/0.63.0/courier-authlib-0.63.0.tar.bz2
解压源码包
tar jxvf courier-authlib-0.63.0.tar.bz2
cd courier-authlib-0.63.0
安装expat软件包
yum install expect
或
rpm -ivh /media/cdrom/Server/expat-1.95.8-8.2.1.i386.rpm
卸载MySQL的rpm包
rpm -e mysql
配置软件包
./configure --prefix=/usr/local/courier-authlib --sysconfdir=/etc --without-stdheaderdir --with-authmysql --with-redhat --with-mysql-libs=/usr/local/mysql/lib --with-mysql-includes=/usr/local/mysql/include
编译安装
make && make install
生成配置文件
make install-configure
修改SMTP发信认证配置
修改SMTP发信认证配置
vim /usr/lib/sasl2/smtpd.conf
内容为:
pwcheck_method:authdaemond
authdaemond_path:/usr/local/courier-authlib/var/spool/authdaemon/socket
启动authdaemond服务
service authdaemond start
chkconfig --add authdaemond
chkconfig authdaemond on
添加authdaemond为系统服务
cp ~/courier-authlib-0.63.0/courier-authlib.sysvinit /etc/init.d/authdaemond
chmod a+x /etc/init.d/authdaemond
设置authdaemond数据库配置
cp authmysqlrc authmysqlrc.bak
grep -v "^#" authmysqlrc | grep -v "^$" > newauthmysqlrc
mv newauthmysqlrc authmysqlrc
vim authmysqlrc
内容为:
MYSQL_SERVER localhost
MYSQL_USERNAME extmail
MYSQL_PASSWORD extmail
MYSQL_SOCKET /tmp/mysql.sock
MYSQL_PORT 0
MYSQL_OPT 0
MYSQL_DATABASE extmail
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
MYSQL_UID_FIELD uidnumber
MYSQL_GID_FIELD gidnumber
MYSQL_LOGIN_FIELD username
MYSQL_HOME_FIELD concat('/var/mailbox/', homedir)
MYSQL_NAME_FIELD name
MYSQL_MAILDIR_FIELD concat('/var/mailbox/', maildir)
设置authdaemon服务目录权限
chmod 755 /usr/local/courier-authlib/var/spool/authdaemon
修改authdaemond主配置文件
cd /etc/authlib/
cp authdaemonrc authdaemonrc.bak
grep -v "^#" authdaemonrc | grep -v "^$" > newauthdaemonrc
mv newauthdaemonrc authdaemonrc
vim authdaemonrc
内容为:
authmodulelist="authmysql"
authmodulelistorig="authmysql"
daemons=5
authdaemonvar=/usr/local/courier-authlib/var/spool/authdaemon
DEBUG_LOGIN=0
DEFAULTOPTIONS=""
LOGGEROPTS=""
验证库文件路径
ldconfig -v | grep -A 9 courier-authlib
命令结果为:
/usr/local/courier-authlib/lib/courier-authlib:
libcourierauthsasl.so -> libcourierauthsasl.so.0
libauthuserdb.so -> libauthuserdb.so.0
libcourierauth.so -> libcourierauth.so.0
libauthcustom.so -> libauthcustom.so.0
libauthmysql.so -> libauthmysql.so.0
libauthpipe.so -> libauthpipe.so.0
libcourierauthcommon.so -> libcourierauthcommon.so.0
libauthpam.so -> libauthpam.so.0
libcourierauthsaslclient.so -> libcourierauthsaslclient.so.0
添加库文件路径
echo "/usr/local/courier-authlib/lib/courier-authlib" >> /etc/ld.so.conf
修改Dovecot的配置
启用Dovecot的数据库认证
vim /etc/dovecot/dovecot.conf
内容为:
ssl = no
protocols = pop3 imap
disable_plaintext_auth = no
mail_location = maildir:~/Maildir
passdb {
args = /etc/dovecot/dovecot-mysql.conf.ext
driver = sql
}
userdb {
args = /etc/dovecot/dovecot-mysql.conf.ext
driver = sql
}
建立数据库查询配置文件
vim /etc/dovecot/dovecot-mysql.conf.ext
内容为:
driver = mysql
connect = host=localhost dbname=extmail user=extmail password=extmail
default_pass_scheme = CPYPT
password_query = select username as user, password from mailbox where username = '%u'
user_query = select maildir, uidnumber as uid, gidnumber as gid from mailbox where username = '%u'
调整默认邮件存储目录权限
mkdir -p /var/mailbox/extmail.org/postmaster/Maildir/
chown -R postfix:postfix /var/mailbox
测试虚拟用户
测试authdaemond服务
/usr/local/courier-authlib/sbin/authtest -s login postmaster@extmail.org extmail
命令结果为:
Authentication succeeded.
Authenticated: postmaster@extmail.org (uid 1000, gid 1000)
Home Directory: /var/mailbox/extmail.org/postmaster
Maildir: /var/mailbox/extmail.org/postmaster/Maildir/
Quota: (none)
Encrypted Password: $1$phz1mRrj$3ok6BjeaoJYWDBsEPZb5C0
Cleartext Password: extmail
Options: (none)
测试虚拟用户的发信认证
printf "postmaster@extmail.org" | openssl base64
命令结果为:
cG9zdG1hc3RlckBleHRtYWlsLm9yZw==
printf "extmail" | openssl base64
命令结果为:
ZXh0bWFpbA==
telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.benet.com ESMTP Postfix
auth login
334 VXNlcm5hbWU6
cG9zdG1hc3RlckBleHRtYWlsLm9yZw==
334 UGFzc3dvcmQ6
ZXh0bWFpbA==
235 2.7.0 Authentication successful
ExMail邮件使用及管理平台
部署ExtMail邮件使用界面
安装Perl支持包
cpan
cpan> install Unix::Syslog
cpan> install DBI
cpan> install DBD::mysql
安装并配置ExtMail套件
登录并使用ExtMail邮件系统
访问 http://mail.benet.com 。重启httpd服务
/usr/local/apache2/bin/apachectl restart
编译安装httpd服务的
mod_suexec
模块
cd /usr/src/httpd-2.2.17/
./configure --enable-suexec -with-suexec-caller=daemon
make suexec
make install-suexec
cd modules/generators/
/usr/local/apache2/bin/apxs -c mod_suexec.c
/usr/local/apache2/bin/apxs -i -a -n suexec ./.libs/mod_suexec.so
调整httpd服务配置
vim /usr/local/apache2/conf/httpd.conf
修改以下内容:
……
LoadModule suexec_module modules/mod_suexec.so
NameVirtualHost 192.168.1.103
<VirtualHost 192.168.1.103>
ServerName mail.benet.com
DocumentRoot /usr/local/apache2/htdocs/extmail/html
ScriptAlias /extmail/cgi /usr/local/apache2/htdocs/extmail/cgi
Alias /extmail /usr/local/apache2/htdocs/extmail/html
SuexecUserGroup postfix postfix
</VirtualHost>
建立ExtMail配置文件
cp webmail.cf.default webmail.cf
vim /usr/local/apache2/htdocs/extmail/webmail.cf
修改以下内容:
SYS_CONFIG = /usr/local/apache2/htdocs/extmail/
SYS_LANGDIR = /usr/local/apache2/htdocs/extmail/lang
SYS_TEMPLDIR = /usr/local/apache2/htdocs/extmail/html
……
SYS_MAILDIR_BASE = /var/mailbox
SYS_AUTH_SCHEMA = virtual
SYS_CRYPT_TYPE = md5crypt
SYS_MYSQL_USER = extmail
SYS_MYSQL_PASS = extmail
SYS_MYSQL_DB = extmail
SYS_MYSQL_HOST = localhost
SYS_MYSQL_SOCKET = /tmp/mysql.sock
……
SYS_AUTHLIB_SOCKET = /usr/local/courier-authlib/var/spool/authdaemon/socket
……
调整cgi目录权限
chown -R postfix:postfix cgi
解压源码包
tar zxvf extmail-1.2.tar.gz -C /usr/local/apache2/htdocs/
mv /usr/local/apache2/htdocs/extmail-1.2 /usr/local/apache2/htdocs/extmail
cd /usr/local/apache2/htdocs/extmail
部署ExtMail Web管理界面
部署好ExtMail程序套件后,电子邮件用户可以通过Web界面登录和使用邮件服务
但邮件域名为extmail.org,还需要安装Extman程序套件,通过Web界面对ExtMail邮件系统进行管理
安装gd-devel软件包
使用YUM安装gd-devel软件包
yum install gd-devel -y
配置YUM支持DVD源
cp ~/cdrom.repo /etc/yum.repos.d/
yum update
安装Perl支持包
如果不安装 gd-devel 软件包,安装Perl支持包的过程中会出现找不到 gdlib-config 命令的错误。cpan
cpan> install GD
cpan> install File::Tail
cpan> exit
安装rrdtool绘图引擎
wget ftp://ftp.pbone.net/mirror/ftp.pramberger.at/systems/linux/contrib/rhel5/i386/rrdtool-1.4.5-1.el5.pp.i386.rpm
wget ftp://ftp.pbone.net/mirror/ftp.pramberger.at/systems/linux/contrib/rhel5/i386/perl-rrdtool-1.4.5-1.el5.pp.i386.rpm
yum install libdbi
rpm -ivh rrdtool-1.4.5-1.el5.pp.i386.rpm
rpm -ivh perl-rrdtool-1.4.5-1.el5.pp.i386.rpm
安装并配置Extman套件
调整临时会话目录的权限
chown -R postfix:postfix /tmp/extman
创建临时会话目录
mkdir /tmp/extman
修改配置文件
cp webman.cf.default webman.cf
vim webman.cf
修改以下内容:
SYS_CONFIG = /usr/local/apache2/htdocs/extman/
SYS_LANGDIR = /usr/local/apache2/htdocs/extman/lang
SYS_TEMPLDIR = /usr/local/apache2/htdocs/extman/html
SYS_MAILDIR_BASE = /var/mailbox
……
SYS_SESS_DIR = /tmp/extman/
……
SYS_BACKEND_TYPE = mysql
SYS_CRYPT_TYPE = md5crypt
SYS_MYSQL_USER = webman
SYS_MYSQL_PASS = webman
SYS_MYSQL_DB = extmail
SYS_MYSQL_HOST = localhost
SYS_MYSQL_SOCKET = /tmp/mysql.sock
……
调整cgi目录权限
chown -R postfix:postfix cgi
解压源码包
tar zxvf extman-1.1.tar.gz -C /usr/local/apache2/htdocs/
mv /usr/local/apache2/htdocs/extman-1.1 /usr/local/apache2/htdocs/extman
cd /usr/local/apache2/htdocs/extman
调整httpd服务配置
vim /usr/local/apache2/conf/httpd.conf
修改以下内容:
……
LoadModule suexec_module modules/mod_suexec.so
NameVirtualHost 192.168.1.103
<VirtualHost 192.168.1.103>
ServerName mail.benet.com
DocumentRoot /usr/local/apache2/htdocs/extmail/html
ScriptAlias /extmail/cgi /usr/local/apache2/htdocs/extmail/cgi
Alias /extmail /usr/local/apache2/htdocs/extmail/html
ScriptAlias /extman/cgi /usr/local/apache2/htdocs/extman/cgi
Alias /extman /usr/local/apache2/htdocs/extman/html
SuexecUserGroup postfix postfix
</VirtualHost>
重启httpd服务
/usr/local/apache2/bin/apachectl restart
或
service httpd restart
登录并管理ExtMail邮件系统
访问 http://mail.benet.com/extman/
设置邮件别名或群组
添加邮件域的管理用户
添加虚拟邮件用户,设置用户密码,可使用的邮件服务等
添加虚拟邮件域,设置虚拟域用户容量,邮箱大小等
查看邮件系统的图形化信息
cp -r /usr/local/apache2/htdocs/extman/addon/mailgraph_ext /usr/local/
cd /usr/local/mailgraph_ext/
./mailgraph-init start
echo "/usr/local/mailgraph_ext/mailgraph-init start" >> /etc/rc.d/rc.local
邮件邮件过滤和防病毒
对于运行在Internet环境中的企业电子邮件系统来说,如何有效的防范垃圾邮件和病毒邮件是一个必须解决的问题。
基于邮件地址的过滤
在SMTP会话过程中,客户端程序在每个阶段分别向服务器提供不同的地址信息
Postfix系统可以针对这些信息进行检查,并通过主配置文件的配置项决定如何处理邮件。
检查配置参数和检查对象如下:
smtpd_client_restrictions
检查客户端的主机名/地址
smtpd_helo_restrictions
检查客户端HELO信息中的主机名
smtpd_sender_restrictions
检查发件人地址
smtpd_recipient_restrictions
检查收件人地址
根据客户端主机名/地址过滤
通过设置限制条件check_client_access
检查邮件客户端是否满足访问策略要求。vim /etc/postfix/main.cf
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
建立
/etc/postfix/access
文本文件,根据需要设置访问策略客户端地址可以使用ip地址,网络地址,主机名或域名等形式。常见的过滤工作有:
vim /etc/postfix/access
添加以下内容:
127.0.0.1 OK
192.168.1 OK
192.168.1.100 REJECT
设置完毕后,使用 postmap 命令将
/etc/postfix/access
文件转换为hash数据库/etc/postfix/access.db
。postmap /etc/postfix/access
REJECT
拒绝
OK
允许
DISCARD
丢弃
根据客户端HELO主机名过滤
vim /etc/postfix/main.cf
添加以下内容:
smtpd_helo_required = yes
smtpd_helo_restrictions = reject_invalid_hostname
根据发件人地址过滤
vim /etc/postfix/main.cf
添加以下内容:
smtpd_sender_login_maps = mysql:/etc/postfix/mysql_virtual_sender_maps.cf, mysql:/etc/postfix/mysql_virtual_alias_maps.cf
smtpd_sender_restrictions = reject_sender_login_mismatch, reject_non_fqdn_sender, reject_unknown_sender_domain, check_sender_access hash:/etc/postfix/sender_access
vim /etc/postfix/sender_access
添加以下内容:
hacker@linux.com REJECT
cracker@ REJECT
163.com REJECT
portmap /etc/postfix/sender_accessF
根据收件人地址过滤
vim /etc/postfix/main.cf
添加以下内容:
smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination, reject_non_fqdn_recipient, reject_unknown_recipient_domain
基于邮件内容的过滤
在Postfix邮件系统中,针对邮件内容的过滤及反病毒邮件功能
可以由 MailScanner 调度SpamAssassin 和 F-Prot 软件来实现
MailScanner
协调调度邮件过滤软件俺
SpamAssassin
根据邮件内容过滤垃圾邮件
F-Prot
提供病毒邮件查杀功能
其主要工作流程:
由Postfix将接收的邮件全部放到 hold 队列中
MailScanner对 hold 队列的邮件进行处理
调用SpamAssassin对邮件内容进行检查
调用F-Prot对邮件内容进行扫描
检查完毕的邮件转入 incoming 队列中交给Postfix投递
安装并配置MailScanner
启动MailScanner服务
service MailScanner start
chkconfig MailScanner on
调整邮件过滤队列的目录的属主,属组
chown -R postfix:postfix /var/spool/MailScanner/incoming
chown -R postfix:postfix /var/spool/MailScanner/quarantine
配置Postfix支持Mailscanner
vim /etc/postfix/main.cf
添加以下内容:
header_checks = regexp:/etc/postfix/header_checks
vim /etc/postfix/header_checks
添加以下内容:
/^Received:/ HOLD
配置软件包
vim /etc/MailScanner/MailScanner.conf
修改以下内容:
……
Run As User = postfix
Run As Group = postfix
Queue Scan Interval = 6
Incoming Queue Dir = /var/spool/postfix/hold
Outgoing Queue Dir = /var/spool/postfix/incoming
Incoming Work Dir = /var/spool/MailScanner/incoming
Quarantine Dir = /var/spool/MailScanner/quarantine
PID file = /var/run/MailScanner.pid
Restart Every = 7200
MTA = postfix
Sendmail = /usr/sbin/sendmail
Sendmail2 = /usr/sbin/sendmail
……
Use SpamAssassin = yes
Max SpamAssassin Size = 200k
Required SpamAssassin Score = 6
High SpamAssassin Score = 10
SpamAssassin Auto Whitelist = yes
SpamAssassin Timeout = 75
Max SpamAssassin Timeouts = 10
SpamAssassin Timeouts History = 30
Check SpamAssassin If On Spam List = yes
Include Binary Attachments In SpamAssassin = no
Spam Score = yes
Cache SpamAssassin Results = yes
SpamAssassin Cache Database File = /var/spool/MailScanner/incoming/SpamAssassin.cache.db
Rebuild Bayes Every = 0
Wait During Bayes Rebuild = no
Use Custom Spam Scanner = no
Max Custom Spam Scanner Size = 20k
Custom Spam Scanner Timeout = 20
Max Custom Spam Scanner Timeouts = 10
Custom Spam Scanner Timeout History = 20
Spam Actions = deliver header "X-Spam-Status: Yes"
High Scoring Spam Actions = delete forward spam@benet.com
Non Spam Actions = deliver header "X-Spam-Status: No"
……
Debug = no
Debug SpamAssassin = no
……
include /etc/MailScanner/conf.d/*
安装软件包
tar zxvf MailScanner-4.83.4-1.rpm.tar.gz
cd MailScanner-4.83.4-1
yum install rpm-build
./install.sh nodeps
The important ones are HTML-Parser and MIME-tools.
下载软件包
wget http://www.mailscanner.info/files/4/rpm/MailScanner-4.83.4-1.rpm.tar.gz
安装并配置SpamAssassin
yum install spamassassin
service spamassassin start
chkconfig spamassassin on
安装并配置F-Prot
wget http://files.f-prot.com/files/unix-trial/fp-Linux-i686-ws.tar.gz
tar zxvf fp-Linux-i686-ws.tar.gz -C /opt/
cd /opt/f-prot/
./install-f-prot.pl
/opt/f-prot/fpupdate
crontab -e
添加以下内容:
38 * * * * root /opt/f-prot/fpupdate > /dev/null
crontab -l
service crond start
chkconfig crond on
邮件内容过滤与防病毒测试
测试邮件内容过滤
发送测试邮件的文本内容如下:XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X
tail /var/log/maillog
测试反病毒邮件
发送测试邮件的文本内容如下:X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*
tail /var/log/maillog