OpenLDAP 和 Postfix 的整合应用
索引:
先前小弟在前三篇文章中提到一些 LDAP 的应用,经过了五、六个月之久,最近终於有机会来实作 Postfix 和 OpenLDAP 的整合,老实说在实作过程中遇到了不少困难,所幸 postfix.org 的丰富文件让我解开了不少棘手问题。
实作之前,我先说明一下测试环境:
两台主机分别为 vm-ldap 和 vm-mail,vm-ldap 上面只有跑 OpenLDAP;而 vm-mail 则是负责邮件服务,当然了,邮件系统是使用 postfix。 这次的实作过程,主要是测试如何让 postfix 去查询 OpenLDAP 的资料库资料,也会示范如何编写 ldap_table 让 postfix 去做查询的依据,以下所以的范例,都可以在文章的连结中找得到。
我们沿用先前的环境,先做出 LDAP 的设定档,再汇入到资料库中,中间的实作过程,可以参考 LDAP 入门 (New Window)一文,在这里我就不再赘述。
在建立 postfix 环境之前,因为我们是要查询 LDAP 资料录,所以要先让 postfix 支援 LDAP 才行,在你的系统之中,以 Redhat 系为例的话,最少需要装有 openldap 套件才可以。
root # yum install openldap |
安装完成之后,就可以开始编释 postfix 了。
root # cd /misc |
上面的过程,会重新建立 makefile 档案,并且把 LDAP 的支援也加进去。设定好 Makefile 之后,接下来的安装设定,都跟一般过程一样,你可以参考 Mail Server - Postfix 安装 (New Window) 一文。
安装完成之后,请使用 postconf 工具看看你的 postfix 对 ldap 是否支援。
root # postconf -m |
若有看到 ldap 就表示你的 postfix 支援 ldap 储存格式。
Linux 有一项管理登入的机制称为 PAM,只要应用程式都支援 PAM 管理,那么对於帐号的操就可以得到统一的整合而不用再去设定应用程式。所以,在开始之前,我要使 Linux 支援 LDAP 登入的话,可以使用 pam_ldap 这个模组,这其中会有很多设定,当然也有很快速的方法,在此我介绍使用 authconfig 这个工具,就可以很轻易的设定好 ldap 的相关设定。
root # authconfig |
这个方法,我在 LDAP - 整合 Linux user login (New Window) 里面也有提过,我建议你再参考一次,因为有一些细节的地方,像是 group 如何对应到 LDAP,在该篇文写得很清楚。
这个时候,你只要随便打个 id 就可以知道了。
root # id c293831287 uid=600(c293831287) gid=510(hr) groups=510(hr) root # |
postfix 会把使用者的 mail 放到 /var/spool/mail/{USER} 的档案里,若是使用 LDAP 建立帐号的话,就必需再建立 user 的 mail 档案才可以收到信,比方说,现在要寄一封信给 f296974826 这个帐号的使用者,但是因为 postfix 在 /var/spool/mail 找不到 f296974826 这个档案,所以我们必需手动建立 /var/spool/mail/f296974826 这个档案,并设定权限。
root # cd /var/spool/mail root # touch f296974826 root # chown f296974826.mail f296974826 root # chmod 660 f296974826 |
经过以上设定,就算设定好了,下一节再来看看如何测试 postfix。
设定完 postfix 和 user 邮件档案之后,现在来看看是否可以寄信。
root # mail f296974826 Subject: Welcome to vm-mail Hi, f296974826: Welcome to l-penguin. Have a good day. . Cc: root # |
再来,登入为 f296974826 的帐号,看看是否有收到信件。
root # su - f296974826 Hi, f296974826: & q |
其实只要看到有刚刚由 root 寄过来的欢迎信那就表示 OK 了。
为什么要多出这个章节呢?很简单,可能有很多人认为到目前为止 postfix 是去询找 ldap 的资料,然后再送信的,其实这是不对的,我用下面简单的图来说明:
一般想法(错误):
postfix -- ldap -- user
实际流程:
postfix -- linux pam_ldap -- ldap -- user
由上面可以知道,其实正确流程是 postfix 使用 pam 系统去找 user 的资讯,而中间关於 ldap 的部份 postfix 根本就不管,而是由 pam_ldap 这个模组去做连结,再传回使用者资讯给 postfix。
其实建立 user mail 档案可以使用 shell script 来做,这样就可以很快速的达到想要的设定。下面是我写的一个 shell 程式。
#!/bin/bash user="" cd /var/spool/mail for user in `ldapsearch -x -b "ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw" | egrep 'uid\:' | awk '{print $2}'` do if !([ -f ${user} ]); then touch ${user} chown ${user}.mail ${user} chmod 660 ${user} fi done |
你也可以在此 下载。
其实 ldap 能放的资讯很多,像是存放 user alias 资料、hostnames、body_checks 或 header_checks 等资讯都可以存放,这也就是说你连垃圾信的分析都可以放到里面,端看你怎么应用!
我在这里,示范如何使用 postmap 去查询 LDAP 资讯。我以 alias 来做说明。
root # vi /etc/postfix/main.cf |
而 /misc/ldap/alias 的内容如下。
root # vi /misc/ldap/alias |
在设定 server_host 时,请注意使用 IP 而不要使用 FQDN、Simple name,不知道什么原因,小弟只有在 IP 的表示下才正确连线,其它设定都会连到 localhost :(
设定好之后,请使用 postmap 来做测试,查询 d295380453 这个帐号的 gecos 值。
root # postmap -q 'd295380453' ldap:/misc/ldap/alias |
对於 postfix 来说,有回传值表示有效的条件,若没有的话就代表无效,你可以使用 $? 参数来看。
root # postmap -q 'd295380453' ldap:/misc/ldap/alias; echo
$? |
回传一个 0 的有效值,postfix 如果遇到这种情况的话,因为是由 alias_maps 来使用 /misc/ldap/alias 这个档案的设定,所以当 postfix 得到 LDAP 的回应时,就会把这封送到 d295380453 的信件转送到 edward mcelhaney 这两个帐号。
现在我们再看另一个示范,是找出 c293831287。
root # postmap -q 'c293831287' ldap:/misc/ldap/alias; echo
$? |
它回传一个 1 值,对於 postfix 来说,这个表示 c293831287 这个帐号没有别名因为将会直接寄到 c293831287 这个帐号的信箱(如果真有其帐号的话)。
以一个程式设计师来说,return 0 表示正常的或成功的离开,而回传一个非 0 的值表示有其它的错误或不正常的结束。
postfix 2.0.x (含 2.0.x) 以前版本的使用者请注意
上述使用 ldap:/path/to/file 的方式只适合用在 postfix 2.1.x 或以后版本上,对於 2.0.x 或以前的版本并不适用,你可以在 Postfix manual - ldap_table(5) 找到相关说明。
附注:
小弟在写这一篇文件时参考了一些大大小小的文件,postfix 和 LDAP 整合涉及到了 PAM 的设定、LDAP 模组安装和 postfix 本身对 LDAP 的编释,我尽量去除理论部份并加强注明在实作时的细节,若有问题的话请不吝指教。
若要深入了解有关 postfix 和 LDAP 的理论,请参考其官方网站,有更多的资讯可查。
参考资讯:
07/24/2006