一般大家现在使用的Unix/Linux下邮件服务器都是基于对系统用户的认证,这在一定程度上留下了许多安全隐患,如果账户没有设置好,会导致不可弥补的失误,此外SMTP服务器的外发功能也可以被居心不良者用作发送垃圾邮件的中转站,因此建立一套基于非系统用户认证加带SMTP认证的邮件服务器对要求高性能高安全的用户来说就显得尤为重要,本文将介绍使用Cyrus Imap和Postfix组合的邮件服务实现上述功能。
由于我们使用的是非系统用户的认证方式,因此需要一个程序进行非系统用户的认证,cyrus IMAP在开发中就包含了一种叫SASL(Simple Authentication and Security Layer)他是一种基于基本协议的认证接口,他可以被大部分的协议调用作为验证工具,由于SASL是Cyrus项目开发的产品,因此他对Cyrus的支持是最完美的;此外我们还需要一个第三方数据库对邮件用户的用户名密码等资料进行存储,这里我们选用Berkeley Database,Berkeley Database是一种内含数据库并支持各种c/s结构的软件,Berkeley Database支持各种接口包括C, C++, Java, 和 Perl APIs等,被广泛的使用在Unix/Linux 平台上。
首先我们安装Berkeley DB,Berkeley DB最新版本是3.2.9,可以到http://www.sleepycat.com/download.html下载最新的版本,下载后用
tar zxvf db-3.2.9.tar.gz
cd db-3.2.9
cd dist
./configure
make
make install
安装完毕后不需要启动任何进程就可以使用Berkeley DB。
注意:为了便于以后的安装,我们可以把/usr/local/BerkeleyDB.3.2/lib 和/usr/local/BerkeleyDB.3.2/include下的所有文件相应的拷贝到/usr/lib和/usr/include下,如果有相同文件名的就进行强制覆盖。
安装SASL:先到http://asg2.web.cmu.edu/cyrus/download下载最新的SASL,下载后解压安装:
tar zxvf cyrus-sasl-1.5.24.tar.gz
cd cyrus-sasl-1.5.24
./configure –enable-login
注意:在configure 时应该有一下内容,才代表Cyrus包含了对Berkeley DB的支持:
checking for db_create in -ldb... yes
checking DB library to use... berkeley
如果没有上述内容请检查是否把BerkeleyDB下的lib/和include/内容拷贝到/usr/lib和/usr/include下配置完后进行安装
make
make install
注意:我们还需要把/usr/local/lib/sasl/所有文件拷贝到/usr/lib并把/usr/local/include/sasl下的所有文件拷贝到/usr/include/
安装Cyrus Imap:在安装之前我们先简单的介绍一下Cyrus Imap:
什么是 IMAP 以及为什么要使用它? IMAP( 互联网邮件访问协议 ) 提供了一种访问远程服务器上的电子邮件或 BBS 邮件的方法. IMAP 普遍被认为是 POP ( 邮局协议 ) 邮件的替代者. IMAP 允许用户从不同的机子上访问他们的电子邮件而不用下载那些邮件. 这种邮件的访问方式更加有效, 而且对终端用户来说有更多的好处,而Cyrus Imap是众多Imap版本中的一种,现在流行的imap软件主要有
o University of Washington Imap 是Imap的元老也是使用最广泛的Imap软件
o Cyrus
o PMDF
o Courier-IMAP
我们这里介绍的Cyrus Imap 是由Bob Anderson (boba@iserv.net) 和 Jorge Paramo (jorge@iserv.net)共同开发的一个项目,Cyrus Imap被设计成在一台不允许一般用户登录的服务器上运行. Cyrus 也被认为是 Unix 上的两个最普遍的 IMAP 服务器之一. 另一个是华盛顿大学的 IMAP 服务器.
到http://asg2.web.cmu.edu/cyrus/download下载最新的Cyrus Imap,下载后解压安装
tar zxvf cyrus-imapd-2.0.15.tar.gz
cd cyrus-imapd-2.0.15
创建cyrus用户
adduser –g mail cyrus
passwd cyrus
由于cyrus imap是通过sasl进行用户验证的,而sasl是把用户信息写入到/etc/sasldb文件中,因此cyrus用户需要有对/etc/sasldb文件读写的权限
chown cyrus /etc/sasldb*
./configure
configure的详细使用可以参照configure –help命令,你可以加入对openssl等的支持
make depend
make all CFLAGS=-O
make install
cyrus imap采用的是4.3BSD 格式的syslog,
vi /etc/syslog 并加入下面两行
local6.debug /var/log/imapd.log
auth.debug /var/log/auth.log
生成两个空白的日志文件
touch /var/log/imapd.log /var/log/auth.log
新建imap的配置文件
vi /etc/imapd.conf并添加下面几行
configdirectory: /var/imap
partition-default: /var/spool/imap
admins: cyrus wing
sasl_pwcheck_method: sasldb
创建相应的配置目录根据我们前面的配置文件进行设置
cd /var
mkdir imap
chown cyrus imap
chgrp mail imap
chmod 750 imap
cd /var/spool
mkdir imap
chown cyrus imap
chgrp mail imap
chmod 750 imap
cd /usr
mkdir sieve
chown cyrus sieve
chgrp mail sieve
chmod 750 sieve
以上命令都是有root用户完成的现在切合成cyrus用户进行相应目录和文件的安装
su cyrus
tools/mkimap
exit
Cyrus Imap还提供了一个很强大的功能-对邮件用户的邮件容量进行设置!在安装过程中需要使用chattr命令改变一些文件的属性
cd /var/imap
chattr +S user quota user/* quota/*
chattr +S /var/spool/imap /var/spool/imap/*
如果你使用的是senmail作MTA则需要执行下面一句
chattr +S /var/spool/mqueue
编辑/etc/services文件,如果文件中没有一下内容,则加入下面的几行
pop3 110/tcp
imap 143/tcp
imsp 406/tcp
acap 674/tcp
imaps 993/tcp
pop3s 995/tcp
kpop 1109/tcp
sieve 2000/tcp
lmtp 2003/tcp
fud 4201/udp
查看/etc/inetd.conf文或/etc/xinetd.d目录下是否有关于imap, imaps, pop3, pop3s, kpop, lmtp 和 sieve的内容,如果有则删去相应的内容
重新启动inet或xinet进程
/etc/rc.d/init.d/inet resart
或
/etc/rc.d/init.d/xinet restart
配置主进程文件:在原代码文件下的master/config目录下有相应的参考配置文件,我们选择最基本的安装文件
cp master/conf/small.conf /etc/cyrus.conf
如果你的cyrus imap在编译过程中有加入对openssl等的支持,则可以使用normal.conf
cp master/conf/normal.conf /etc/cyrus.conf
编辑/etc/cyrus.conf
把
lmtpunix cmd='lmtpd' listen='/var/imap/socket/lmtp' prefork=0
替换成
lmtpunix cmd='lmtpd' listen='/var/imap/socket/lmtp' prefork=1
启动cyrus imap
/usr/cyrus/bin/master &
测试cyurs iamp
telnet 127.0.0.1 143
或telnet 127.0.0.1 110
如果出现以下文字则表明imap工作正常
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
OK wing.com Cyrus IMAP4 v2.0.15 server ready
管理cyrus用户:根据前面的配置我们先添加管理员账户
/usr/local/sbin/saslpasswd cyrus
输入两次相同的密码后就把cyrus这个用户添加到数据库中
运行cyrus管理程序
/usr/local/bin/cyradm –u cyrus localhost
系统会提示你输入你的密码,把我们刚才输入的密码敲入后进入管理提示界面
localhost.localdomain>help
使用help命令看命令帮助
authenticate, login, auth authenticate to server
chdir, cd change current directory
createmailbox, cm, create create mailbox
deleteaclmailbox, dam, deleteacl remove ACLs from mailbox
deletemailbox, delete, dm delete mailbox
disconnect, disc disconnect from current server
exit, quit exit cyradm
help, ? show commands
listacl, lam, listaclmailbox list ACLs on mailbox
listmailbox, lm list mailboxes
listquota, lq list quotas on specified root
listquotaroot, lqr, lqm show quota roots and quotas for mailbox
renamemailbox, rename, renm rename (and optionally relocate) mailbox
server, servername, connect show current server or connect to server
setaclmailbox, setacl, sam set ACLs on mailbox
setquota, sq set quota on mailbox or resource
version, ver, info display version info of current server
比如我们要创建一个用户wing,并限制他的邮箱容量为10M,可以用下面这个命令
createmailbox user.wing (注:前面的user.不能省略)
setquota user.wing 10000 (以KB为单位)
如果你还想为改用户创建下级子目录可以用
createmailbox user.wing.dir1
createmailbox user.wing.dir2
createmailbox user.wing.dir1.dira
删除用户
deletemailbox user.wing
删除文件夹
deletemailbox user.wing.dir1
退出管理界面
exit
每生成一个用户后,需要用
/usr/local/sbin/saslpasswd userid
来给用户添加密码
添加完密码后用户就正式生效了,下面我们对生成的用户进行测试
/usr/local/bin/imtest -m login -a wing localhost
系统会出现以下界面并提示你输入密码
C: C01 CAPABILITY
S: * OK wing.xmgis.com Cyrus IMAP4 v2.0.15 server ready
S: * CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ NAMESPACE UIDPLUS ID NO_ATOMI
C_RENAME UNSELECT MULTIAPPEND SORT THREAD=ORDEREDSUBJECT THREAD=REFERENCES IDLE
AUTH=DIGEST-MD5 AUTH=CRAM-MD5
S: C01 OK Completed
Password:
输入完用户wing的密码后如果系统出现以下信息则表示验证成功,否则需要检查密码是否正确以及系统是否正确安装;
C: L01 LOGIN wing {7}
+ go ahead
C: <omitted>
L01 OK User logged in
Authenticated.
Security strength factor: 0
用. Logout命令退出界面
. logout
* BYE LOGOUT received
. OK Completed
Connection closed.
如果一切都正常,表明Cyrus imap安装正常,你可以在客户端例如Microsoft的OE中进行设置,设置IMAP和POP3的方法和其它邮件的设置方法相同,我们就不详细介绍了。下面我们介绍Postfix的安装和配置。
在安装前,我们先介绍以下Postfix的一些基本情况:
postfix是一个由IBM资助下由Wietse Venema 负责开发的自由软件工程的一个产物,其目的是为用户提供除sendmail之外的邮件服务器选择。postfix力图做到快速、易于管理、提供尽可能的安全性,同时尽量做到和sendmail邮件服务器保持兼容性以满足用户的使用习惯。起初,postfix是以VMailer这个名字发布的,后来由于商标上的原因改名为postfix。postfix是在IBM的GPL协议之下开发的MTA(邮件传输代理)软件。“postfix是Wietse Venema想要为使用最广泛的sendmail提供替代品的一个尝试。在Internet世界中,大部分的电子邮件都是通过sendmail来投递的,大约有100万用户使用sendmail,每天投递上亿封邮件。这真实一个让人吃惊的数字。Postfix试图更快、更容易管理、更安全,同时还与 sendmail保持足够的兼容性。”
postfix的特点
快速:postfix在性能上大约比sendmail快三倍。一部运行postfix的台式PC每天可以收发上百万封邮件。
兼容性好:postfix是sendmail兼容的,从而使sendmail用户可以很方便地迁移到postfix。Postfix支持/var[/spool]/mail、/etc/aliases、 NIS、和 ~/.forward 文件。
更健壮:postfix被设计成在重负荷之下仍然可以正常工作。当系统运行超出了可用的内存或磁盘空间时,postfix会自动减少运行进程的数目。当处理的邮件数目增长时,postfix运行的进程不会跟着增加。
更灵活:postfix是由超过一打的小程序组成的,每个程序完成特定的功能。你可以
通过配置文件设置每个程序的运行参数。
安全性:postfix具有多层防御结构,可以有效地抵御恶意入侵者。如大多数的postfix程序可以运行在较低的权限之下,不可以通过网络访问安全性相关的本地投递程序等等。
到http://www.postfix.org/ftp-sites.html下载postfix最新的版本
下载后进行解压安装
tar zxvf postfix-20010228-pl03.tar.gz
cd postfix-20010228-pl03
创建postfix用户,出于安全性的考虑,postfix需要创建一个用户来执行postfix的后台程序;
adduser –g mail postfix
此外postfix用户还需要有读/etc/sasldb的权限,所以建议把/etc/sasldb的属主组改为mail,并赋予相应的读写权限
chgrp mail /etc/sasldb
chmod g+r,g+w /etc/sasldb
为了让postfix支持sasl的认证方式,在编译前需要对Makefile进行修改
如果你先前有编译过postfix则先用
make tidy
命令清楚已经编译的文件
使用
make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/include"
AUXLIBS="-L/usr/lib -lsasl"
加入对SASL的支持,注意:我们在前面的步骤中已经把/usr/local/include和/usr/local/lib中关于sasl的相关文件考到/usr/include和/usr/lib下,所以在运行上述命令前,一定要确认这些步骤是否完成,否则在以后的编译中会出错。
make
sh ./INSTALL.sh
出现以下对话框
install_root: [/]
tempdir: [/home/wing/postfix-20010228-pl03]
config_directory: [/etc/postfix]
daemon_directory: [/usr/lib/postfix]
command_directory: [/usr/sbin]
queue_directory: [/var/spool/postfix]
sendmail_path: [/usr/sbin/sendmail]
newaliases_path: [/usr/bin/newaliases]
mailq_path: [/usr/bin/mailq]
mail_owner: [postfix]
setgid: [mail]
manpages: [/usr/local/man]
全部使用系统默认的设置,按回车后系统会自动安装Postfix
修改postfix的cf文件使支持Cyrus:
postfix的所有配置文件都在/etc/postfix,其中main.cf和master.cf是最主要的两个配置文件
cd /etc/postfix
vi main.cf
将
# default_privs = nobody
前面的注释去掉
myhostname = yourhost.com
设为自己本机的名字,并去掉前面的注释
去掉# myorigin = $myhostname前面的注释
如果你需要对SMTP服务进行信任设置的话,在
TRUST AND RELAY CONTROL
里面进行设置,详细的设置说明main.cf里面有说明,我们就不作介绍,也不作改动
设置别名,一般来说如果你先前没有安装象sendmail等邮件代理的话,在/etc/下是不会有aliases和aliases.db文件的,而 postfix则是把aliases和aliases.db存放在/etc/postfix目录下,为了使用的习惯建议大家在/etc/作个符号连接
ln –s /etc/postfix/aliases /etc/aliases
并在main.cf内修改相应的内容
alias_maps = hash:/etc/aliases
设置mail_spool的目录
mail_spool_directory = /var/spool/mail
mailbox_command = /usr/bin/procmail -o -a $DOMAIN -d $LOGNAME
mailbox_transport参数是设置邮件在经过aliases和转发检查后使用的传输选项,这里我们把他指向cyrus的lmpt程序
LMTP指的是本地邮件传输协议(Local Mail Transfer Protocol)主要用来处理postfix接受到本地邮件用户后的传送。
在这里我们设为
mailbox_transport = lmtp:unix:/var/imap/socket/lmtp
以上这些都是postfix支持cyrus imap的设置,为了让postfix支持SMTP认证,我们还需要加入下面的一些参数
smtpd_sasl_auth_enable = yes
smtpd_delay_reject=yes
smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated ermit_auth_destination reject
smtpd_client_restrictions = permit_sasl_authenticated
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous
保存退出后启动postfix进程,使用命令
postfix start
postfix命令主要的参数有
postfix start 启动服务
postfix stop 停止服务
postfix reload 重新启动服务
启动服务后使用telnet localhost 25命令进行检查,命令执行后如果有以下提示信息则表明postfix 工作正常
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'.
220 wing. com ESMTP Postfix (Postfix-20010228-pl03)
再敲入ehlo 127.0.0.1检查smtp验证是否生效
250-wing.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5
250-AUTH=LOGIN PLAIN DIGEST-MD5 CRAM-MD5
250 8BITMIME
则说明SMTP的验证也是生效的
最后就是对Postfix和cyrus进行检查了,在确认DNS配置正确后,在客户端以Outlook Express 5为列在账户设置中的服务器标签中选中我“的服务器要求身份验证”点击设置按钮选“使用于接受邮件服务器相同的设置”,如果你的邮件接受服务器有SMTP服务器不是同一台主机,则选则“登陆方式”并输入相应的用户和密码。
最后使用发信给本地用户,发信给其它邮件地址的用户,从其它服务器发邮件,接受邮件等方法测试Postfix 和Cyrus是否正常工作。
由于是第一次安装Postfix和Cyrus难免有失误之处希望大家多多指正