免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4762 | 回复: 1

[原创]Postfix + Cyrus-SASL + Cyrus-IMAPD + PgSQL HOWTO [复制链接]

论坛徽章:
0
发表于 2003-08-24 18:43 |显示全部楼层
Postfix + Cyrus-SASL + Cyrus-IMAPD + PgSQL HOWTO
(Under FreeBSD,PowerPlane原创)
[附言]
作者:PowerPlane
该附言或许不成其为什么许可证,但还是希望您尊重作者的愿望。
如果您发现有什么错误,请及时通知我,我将尽快作出修改。如果您在网上转载,那将是免费,但希望您附上本附言,并且注明出处的链接。如果您要把它用印刷物形式出版,请通过www.cnfug.org跟本人接洽。
您在以本文作为根据配置电脑的时候,若出现任何故障,后果自负,与本作者无关。

目标:
-------------------------------------


本文的目的是在于说明如何在FreeBSD的环境下面搭建一个邮件系统。这个邮件系统支持虚拟用户,提供IMAP服务,可以成为构成WebMail系统的基础。
支持IMAP服务的Webmail有著名的IMP和SquirrelMail等等。
本文虽然是用PgSQL作为后台数据库,但是仍然对使用MySQL,LDAP数据库的作为后台的类似邮件系统有启发作用。如果仔细阅读本文,一定会有所收货的。使用其他后台数据库的话,要修改的地方有两处:pam服务和main.cf的virtual_mailbox_maps项。
本文所有的调试是在FreeBSD-4.8 release上通过的,也对FreeBSD-5作了额外的说明,主要的差异是集中在pam服务的配置不同而已,希望能有所帮助。
Linux的用户也能可以参考本文的配置,您只需要留意路径和pam服务的配置。pam服务配置跟FreeBSD-5类似。


零、阅读准备:
-------------------------------------

1)阅读本文需要一定基础,我假设你已经清楚以下的东西:
邮件系统的基本原理,邮件系统的相关协议的作用,例如smtp,pop3,imap。

2)什么是SASL:
SASL的英文全称是Simple Authentication and Security Layer,简单验证和安全层。
SMTP协议并没有提供用户验证功能,很容易匿名中转邮件。即使限制了可以转发的网段,也不安全。他的定义是: a method for adding authentication support to connection-based protocols,为基于连接的协议提供认证功能。

3)软件的角色:
Postfix:充当MTA,就是smtpd,作为邮件转发用。

Cyrus-SASL:分成两部分
        a)Cyrus项目的SASL lib,Postfix使用SASL需要用到的lib。
        b)Cyrus-saslauthd,一个SASL的验证后台程序。

Cyrus-IMAPD:
提供IMAP服务,提供邮件读取和管理邮箱的作用。

cyradm:
这个不是一个独立的软件,安装Cyrus-IMAP的时候会自动安装上去的。它的作用是创建和管理邮箱。

PgSQL:后台数据库,存放用户的密码等等。

总的来讲,Postfix充当转送邮件的服务;Cyrus-IMAP充当提供邮件读取、管理的服务;SASL使用验证服务。

4、Cyrus-SASL和Cyrus-IMAPD不是同一样东西
就跟Microsoft Visual C++和Microsoft Office不是同一个东西一样

一、本系统的工作原理和结构:
-------------------------------------

注意是本系统。实现一个邮件系统有很多种方式,即使你用的都是跟本系统完全一样的软件,也有不同的实现方式。
本系统的邮件主机是:
f4.room
f4是因为fbsd-4,域为room:是因为电脑放在房间里头。您要看不顺眼,就把本文的f4.room都换成example.com算了。

I、Postfix的担任的工作的部分:
1、这个是投递邮件的时候的用户验证的部分:

  1.   |------------------------|
  2.   |     Postfix            |
  3.   |                        |
  4.   | |-------------|        |
  5.   |-| Cy-SASL-lib |--------|
  6.     |             |   
  7.     |-------------|   
  8.          |            
  9.          |            
  10.     |--------------|   
  11.     | Cy-saslauthd |   
  12.     |--------------|   
  13.          |            
  14.          |            
  15.     |-------|         
  16.     |  PAM  |         
  17.     |-------|         
  18.          |            
  19.          |            
  20.   |-----------------------|
  21.   |    PostgreSQL         |
  22.   |-----------------------|
复制代码

图例说明:
当有程序访问smtp服务(TCP端口25)的时候,Postfix会给出220 ESMTP的回应,提示是要验证的smtp服务。密码和用户名提交给Postfix以后,Postfix会把密码和用户名通过调用Cy-SASL lib提交给一个后台验证程序:Cy-saslauthd。Cy-saslauthd会调用PAM模块进行验证。PAM模块会调用名为smtp的PAM服务名进行验证。在本系统中,PAM服务是调用pam_pgsql访问PostgreSQL进行验证的。然后结果再Return回去。

2、邮件转送:
分成三种情况:
1)如果邮件是给非本域用户的,例如是21cn.com的,马上就转发过去了。

2)如果邮件是给本域虚拟用户的,Postfix要访问PgSQL,来看看本域是否有这个虚拟用户。有就转发到他的虚拟邮箱,没有就把邮件defered掉。(什么是defered?待查,估计是砍掉的意思)
Postfix <-->; PostgreSQL

3)如果是本域的本地用户,就转发到本地用户的邮箱,就是/var/mail/username那里。
Postfix <-->; /etc/passwd

II、Cyrus-IMAP担任的工作部分
1、邮件的获取:
Cyrus-IMAPD有他自己的一套管理邮件的方法,不是用传统的unix邮箱方法(/var/mail/username),但是邮箱的读取十分高效。当Postfix获得目的地是本域的虚拟用户的时候,我们设置Postfix内置支持的一个功能:调用Cyrus-IMAP的一个程序,将邮件“拿”过来放到由Cyrus-IMAPD管理的邮箱里头。

2、用户的验证。
当用户要读取自己的邮件的时候,要通过IMAP服务。本系统配置了Cyrus-IMAP通过Cyrus-saslauthd进行验证。其原理大概同Postfix验证用户的原理一样。

  1.   |------------------------|
  2.   |     Cyrus-IMAPD        |
  3.   |                        |
  4.   | |-------------|        |
  5.   |-| Cy-SASL-lib |--------|
  6.     |             |   
  7.     |-------------|   
  8.          |            
  9.          |            
  10.     |--------------|   
  11.     | Cy-saslauthd |   
  12.     |--------------|   
  13.          |            
  14.          |            
  15.     |-------|         
  16.     |  PAM  |         
  17.     |-------|         
  18.          |            
  19.          |            
  20.   |-----------------------|
  21.   |    PostgreSQL         |
  22.   |-----------------------|
复制代码



III、PgSQL存储的数据
现在把PgSQL存储的数据再总结一下。
PgSQL主要存储两部分数据:
1)虚拟用户的用户名和密码。这部分是提供验证用,从saslauthd通过PAM服务访问。

  1. ID | usr   | pass  | expired | newtok
  2. ----+-------+-------+---------+--------
  3.   1 | test1 | pass1 | f       | f
  4.   2 | test2 | pass2 | f       | f
复制代码

2)用户的地址和对应的信箱。这部分是Postfix访问的,从中获得邮件地址和邮箱的映射关系,然后根据邮件地址转发到相应的邮箱。

  1. ID | addr           | box
  2. ----+----------------+------------
  3.   1 | test1@f4.room  | test1
  4.   2 | test2@f4.room  | test2
复制代码


在本系统中,实际上是两个表,为了方便大家看,就将他拆分成两个表。
其实使用两个表来存储这些数据的做法从安全角度是可取的。我们比如说我们分别建立两个数据库用户:postfix和saslauthd,他们只是对自己可以访问的表有读权限。另外我们再建立一个视图,把两个表关联起来,超级用户对这个视图有读取使用的权限,来进行管理。
本文为了方便调试,只是建立一个表。

二、安装软件
-------------------------------------

请务必使用port来安装,因为这不仅影响到你编译成功率,更影响到以后的配置。因为你直接下载源码包编译安装的路径可能不一样
0.PostgreSQL
路径/usr/ports/databases/postgresql7
make install
注意,这个路径下的是pgsql 7.3

1.Postfix:
路径 /usr/ports/mail/postfix
make install,然后会出现一个编译选项的菜单,选择Cyrus-SASL2和PgSQL的支持。PgSQL的支持可能有两种,一个是7.3,一个是7.2,请根据的PgSQL服务器选择。

2.Cyrus-SASL2:
由于上面安装Postfix的时候,选择了Cyrus-SASL2支持,编译Postfix的时候,会自动下载Cyrus-SASL2进行编译安装,所以Cyrus-SASL2不需要安装。

3. Cyrus-sasl-saslauthd
路径:/usr/ports/security/cyrus-sasl2-saslauthd/
make install

4. Cyrus-imapd-2.1.14
路径:/usr/ports/mail/cyrus-imapd2/
make install


三、配置软件
-------------------------------------

零、配置PgSQL和pam服务
1、建立一个叫做mail的数据库。
2、建立一个叫做mailuser的表。
结构如下

  1. ID | usr   | pass  | expired | newtok | addr          | box   
  2. ----+-------+-------+---------+--------+---------------+--------
  3.   1 | test1 | pass1 | f       | f      | test1@f4.room | test1
  4.   2 | test2 | pass2 | f       | f      | test2@f4.room | test2
复制代码

3、在PgSQL里头建立一个数据库用户mail,密码mail
4、创建一个/etc/pam_pgsql.conf

  1. #host = 127.0.0.1  
  2. database = mail
  3. user = mail
  4. password = mail
  5. table = mailuser
  6. user_column = usr
  7. pwd_column = pass
  8. expired_column = expired
  9. newtok_column = newtok
复制代码


在/etc/pam.conf里头加上以下几行。

  1. smtp    auth            required        pam_pgsql.so    debug
  2. smtp    password        required        pam_pgsql.so    debug
  3. smtp    account         required        pam_pgsql.so    debug

  4. imap    auth    required        pam_pgsql.so    debug
  5. imap    password        required        pam_pgsql.so    debug
  6. imap    account         required        pam_pgsql.so    debug
复制代码


注意,如果的是Freebsd-5和linux,他们的配置有不同:
不用设置/etc/pam.conf,而是在/etc/pam.d/smtp和/etc/pam.d/imap里头加上

  1. auth            required        pam_pgsql.so    debug
  2. password        required        pam_pgsql.so    debug
  3. account         required        pam_pgsql.so    debug
复制代码


Part I、配置Postfix + SASL
[目标]
I、配置Postfix + SASL验证,并且组建一个虚拟用户的环境。
比如说:user@f4.room
user并不是FreeBSD上的本地用户,而是一个虚拟的用户。用户的认证信息是存储在数据库的。


零、域名的处理
相信很多朋友跟我一样,没有一个FQDN(Full Qualiefied Domain Name)。虽然没有域名,我们仍然可以玩Postfix。
先在/etc/hosts添加你的域名。我的域名设置为f4.room,而我的IP是192.168.1.10,所以我的文件是这样的:

  1. ::1                     localhost localhost.my.domain
  2. 127.0.0.1               localhost localhost.my.domain
  3. 192.168.1.10            f4        f4.room
复制代码

注意,这里的域名f4.room,是我以后在main.cf用到虚拟用户的域名,virtual_mailbox_domainsd的那项。

一、Postfix
要Postfix正常运行,必须先要把Sendmail禁用。
/etc/rc.conf里头加入一行
sendmail="NONE"
然后做一个连接

  1. cd /usr/local/etc/rc.d
  2. ln -s /usr/local/sbin/postfix postfix.sh
复制代码

看到freebsd的port的好处了吗?他可以让你保留原有的sendmail。
Postfix也有一个程序叫做sendmail。如果用源码安装,会把Postfix安装在/usr/sbin里头,那么就会把sendmail覆盖掉了。用Port来安装,它会遵守freebsd的hier(目录结构),将软件都装在/usr/local/下面的sbin/,bin/,lib/,libexe/目录里头,不会跟系统的冲突。
哪天您老人家不高兴,想玩玩sendmail,先pkg_delete了postfix,然后修改/etc/rc.conf,把sendmail="NONE"改成"YES",就可把sendmail请回来了。


Postfix的配置文件在/usr/local/etc/postfix/
1、master.cf
更改以下两项:
1)搜索smtp的一行,然后改为

  1. smtp      inet  n       -       n       -       -       smtpd   -v
复制代码


2)修改cyrus的安装路径
将argv=.....一项改为argv=/usr/local/cyrus/bin/deliver
结果如下:

  1. cyrus     unix  -       n       n       -       -       pipe
  2.   user=cyrus argv=/usr/local/cyrus/bin/deliver -e -r ${sender} -m ${extension} ${user}
复制代码



2、main.cf

  1. #本地用户的设置
  2. mydomain = my.domain
  3. myhostname = localhost
  4. mydestination = $myhostname, localhost.$mydomain
  5. local_transport = local
  6. local_recipient_maps = unix:passwd.byname $alias_maps

  7. #虚拟用户方面的设置
  8. virtual_transport = virtual #这里先使用virtual穿送邮件,稍后设置好imap以后是使用cyrus来抓取虚拟用户的邮件
  9. virtual_mailbox_base = /var/mail/vhost #设立一个存放虚拟用户的路径,设置好imap,可以不需要
  10. virtual_mailbox_maps = pgsql:/usr/local/etc/postfix/pgsql-mailbox.cf #告诉postfix,邮箱要如何映射
  11. virtual_mailbox_domains = f4.room #虚拟邮箱的域
  12. virtual_minimum_uid = 100  #最小合法虚拟用户ID
  13. virtual_uid_maps = static:5000 #虚拟用户UID
  14. virtual_gid_maps = static:5000 #虚拟用户组GID

  15. #设置使用sasl验证
  16. smtpd_sasl_auth_enable = yes
  17. broken_sasl_auth_clients = yes
复制代码


3、创建一个pgsql-mailbox.cf

  1. hosts = localhost
  2. user = mail
  3. password = mail
  4. dbname = mail
  5. table = mailuser
  6. select_field = box
  7. where_field = addr
复制代码


4、建立相关的目录
确保你有root权限哦
mkdir /var/mail/vhost
cd /var/mail/vhost/
touch test1
touch test2
chowm 5000:5000 test1
chowm 5000:5000 test2

二、配置Cyrus-SASL
/usr/local/lib/sasl2/Sendmail.conf

  1. pwcheck_method: saslauthd
  2. mech_list: plain login
复制代码


然后做一个连接
ln -s Sendmail.conf smtpd.conf

好现在做一个测试:
先获取plain字符窜。为了获得plain字符串,必须要用base64编码。我安装了一个perl的mod来产生这个base64编码。

  1. perl -MMIME::Base64 -e 'print encode_base64("test1\0test1\0pass1");'
复制代码

结果:
dGVzdDEAdGVzdDEAcGFzczE=
一般的格式是:

  1. perl -MMIME::Base64 -e 'print encode_base64("user\0user\0passwd");'
复制代码


他的port在/usr/ports/converters/p5-MIME-Base64/

测试:
绿色的字体由你来输入。
>; telnet 192.168.1.10 25
Trying 192.168.1.10...
Connected to f4.
Escape character is '^]'.
220 localhost ESMTP Postfix
ehlo host
250-localhost
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-XVERP
250 8BITMIME
auth plain dGVzdDEAdGVzdDEAcGFzczE=
235 Authentication successful

出现235 Authentication successful,就表示你的机器成功使用postfix + sasl 认证了。
注意,一定要打ehlo hostname,否则就不会出下面的东西了。

三、调试发信给虚拟用户
>; mail test1@f4.room
Subject: a test
test
.
EOT
如果成功的话,/var/mail/vhost/test1大小为非0,而且你可用cat、less等工具把文件的内容读出来读出来。

四、一个小小的Bug
首先声明,这个Bug不是postfix的,应该是我的配置的。
不知道为什么,根据以上的设置,在本机上写信给本地用户,例如powerplane,地址必须是:
powerplane@localhost.my.domain。
其他地址,如:powerplane@localhost,他会当把powerplane@f4.room处理。
估计是main.cf和/etc/hosts上没有配置好。哪位高人,请指点一下?

Part II、配置Cyrus-IMAP
1、编辑/usr/local/etc/imapd.conf,这个是Cyrus-IMAP的配置文件
内容应该如下:

  1. configdirectory: /var/imap
  2. partition-default: /var/spool/imap
  3. sieveusehomedir: false
  4. sievedir: /var/imap/sieve
  5. sasl_pwcheck_method: saslauthd        #使用saslauthd来进行验证
  6. admins: cyrus                        #用cyrus用户来管理邮箱,注意,这个不是本地用户。而是Cyradm管理模块的管理员。该用户信息存放在/usr/local/etc/sasldb2里头
复制代码


2、运行/usr/local/cyrus/bin/mkimap。
他会自动读取/usr/local/etc/imapd.conf,自动创建/var/imap,/var/spool/imap等等所需要的目录的。

3、启动Cyrus-IMAPD。
使用Port来安装Cyrus-IMAP,它会在/usr/local/etc/rc.d创建一个启动脚本的,名字为:imapd.sh.sample。你要把它改名为imapd.sh,在启动系统时后他才会自动执行。如果它没有运行,你也可人工启动它:
/usr/local/etc/rc.d/imapd.sh start

4、建立Cyradm模块的需要的用户数据库:sasldb2。
1)创建sasldb2数据库,并且创建管理员cyrus。

  1. cd /usr/local/etc
  2. saslpasswd2 -c cyrus
  3. Password:cyrus
  4. Again(for verification):cyrus

  5. chown cyrus:mail sasldb2
复制代码

2)创建用户邮箱:
Cyrus-IMAP是自己管理邮箱,创建邮箱必须通过cyradm来创建。
下面通过cyradm工具来创建邮箱。
cyradm --user cyrus localhost 是用cyrus用户,登陆到主机localhost。
cm是创建邮箱
lm是列出邮箱
>; cyradm --user cyrus localhost
Password:
localhost>; cm user.test1
localhost>; cm user.test2
localhost>; lm
user.test1 (\HasNoChildren)        user.test2 (\HasNoChildren)
localhost>; quit


使用imtest来测试
>; imtest -m login -a test1 localhost
S: * OK F4 Cyrus IMAP4 v2.1.15 server ready
C: C01 CAPABILITY
S: * CAPABILITY IMAP4 IMAP4rev1 ACL QUOTA LITERAL+ MAILBOX-REFERRALS NAMESPACE UIDPLUS ID NO_ATOMIC_RENAME UNSELECT CHILDREN MULTIAPPEND SORT THREAD=ORDEREDSUBJECT THREAD=REFERENCES IDLE AUTH=NTLM AUTH=OTP AUTH=DIGEST-MD5 AUTH=CRAM-MD5
S: C01 OK Completed
Please enter your password:
C: L01 LOGIN test1 {4}
S: + go ahead
C: <omitted>;
S: L01 OK User logged in
Authenticated.

Security strength factor: 0
. logout
* BYE LOGOUT received
. OK Completed
Connection closed.

出现上面红色字表示登陆成功,打. logout退出。

Part III、整合Postfix和Cyrus-IMAP
你前面的设置和调试都顺利通过了吗?好到这一步了,只需要改一个文件。
/usr/local/etc/postfix/main.cf

  1. virtual_transport = cyrus #这里的cyrus是对应回master.cf里头传送邮箱项。
复制代码

别忘记重新启动你的postfix
/usr/local/etc/rc.d/postfix.sh reload

好赶快测试一下吧
>; mail test1@f4.room
Subject: final test
haha
.
EOT

咱们用一个支持IMAP的客户端收信吧,试试能不能成功?用户名用test1,密码是pass1。

总结:
-------------------------------------


如果使用port的时候,有什么不明白,不懂的时候,可以参考具体软件的port目录里头的pkg-message,里头有关于该软件的一些简单说明和配置。当然不是每个port都有的。
我的建议是:不要期待一篇HOW-TO就让你明白所有东西,你还是要作作功课的。
下面提供一些文档作为参考,有些文档是在你安装port以后,在本机上的,当然在源码包肯定也有。


Postfix的virtual domains入门:
http://www.freebsddiary.org/postfix.php

Postfix的虚拟用户设置:
/usr/local/share/doc/postfix/VIRTUAL_README

Postfix的一些官方文档,教你如何跟Cyrus-SASL2和Cyrus-IMAP2整合:
http://www.postfix.org/docs.html

FreeBSD上面的PAM配置:
http://www.freebsd.org/doc/en_US.ISO8859-1/articles/pam/index.html

下面的是Linux为目标系统的,我也参考过。如果您仔细阅读过他们和本文,就明白FreeBSD的hier和Port系统的好处。
Postfix-Cyrus-Web-cyradm-HOWTO:
http://www.delouw.ch/linux/Postfix-Cyrus-Web-cyradm-HOWTO/html/index.html

Postfix + Cyrus-IMAP + Cyrus-SASL + MySQL + IMP的中文HOWTO
http://www.cngnu.org/technology/Postfix_I.html

论坛徽章:
0
发表于 2003-08-24 18:44 |显示全部楼层

[原创]Postfix + Cyrus-SASL + Cyrus-IMAPD + PgSQL HOWTO

本论坛的bbcode解释结果跟cnfug不一样,为了获得更好的显示效果,看下面的论坛的帖子。而且本章随时可能更新,以下面的帖子为主。
http://forum.cnfug.org/index.php?act=ST&f=10&t=469&st=0#entry3265
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP