电子邮件系统概述
邮件系统角色
在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.rpmmake 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 -vmake && 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 authmysqlrcvim 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 authdaemonrcvim 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.rpmyum 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_accessvim /etc/postfix/sender_access
添加以下内容:
hacker@linux.com REJECT
cracker@ REJECT
163.com REJECTportmap /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 nodepsThe 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