OpenLDAP 和 Postfix 的整合应用

索引:

  1. 建立 LDAP 环境
  2. 建立 postfix 环境
  3. 设定 PAM
  4. 建立使用者的 mail 档案
  5. 测试 postfix
  6. 重点讨论
  7. 真正让 postfix 寻找 ldap 资料!


先前小弟在前三篇文章中提到一些 LDAP 的应用,经过了五、六个月之久,最近终於有机会来实作 Postfix 和 OpenLDAP 的整合,老实说在实作过程中遇到了不少困难,所幸 postfix.org 的丰富文件让我解开了不少棘手问题。

实作之前,我先说明一下测试环境:

两台主机分别为 vm-ldap 和 vm-mail,vm-ldap 上面只有跑 OpenLDAP;而 vm-mail 则是负责邮件服务,当然了,邮件系统是使用 postfix。 这次的实作过程,主要是测试如何让 postfix 去查询 OpenLDAP 的资料库资料,也会示范如何编写 ldap_table 让 postfix 去做查询的依据,以下所以的范例,都可以在文章的连结中找得到。

建立 LDAP 环境:

我们沿用先前的环境,先做出 LDAP 的设定档,再汇入到资料库中,中间的实作过程,可以参考 LDAP 入门 (New Window)一文,在这里我就不再赘述。

建立 postfix 环境:

在建立 postfix 环境之前,因为我们是要查询 LDAP 资料录,所以要先让 postfix 支援 LDAP 才行,在你的系统之中,以 Redhat 系为例的话,最少需要装有 openldap 套件才可以。

root # yum install openldap

安装完成之后,就可以开始编释 postfix 了。

root # cd /misc
root # wget ftp://postfix.cdpa.nsysu.edu.tw/Unix/Mail/Postfix/official/postfix-2.3.0.tar.gz
root # cd postfix-2.3.0
root # make tidy
root # make makefiles CCARGS="-I/usr/local/include -DHAS_LDAP" AUXLIBS="-L/usr/local/lib -R/usr/local/lib -lldap -L/usr/local/lib -R/usr/local/lib -llber"

上面的过程,会重新建立 makefile 档案,并且把 LDAP 的支援也加进去。设定好 Makefile 之后,接下来的安装设定,都跟一般过程一样,你可以参考 Mail Server - Postfix 安装 (New Window) 一文。

安装完成之后,请使用 postconf 工具看看你的 postfix 对 ldap 是否支援。

root # postconf -m
btree
cidr
environ
hash
ldap
nis
proxy
regexp
static
unix
root #

若有看到 ldap 就表示你的 postfix 支援 ldap 储存格式。

设定 PAM

Linux 有一项管理登入的机制称为 PAM,只要应用程式都支援 PAM 管理,那么对於帐号的操就可以得到统一的整合而不用再去设定应用程式。所以,在开始之前,我要使 Linux 支援 LDAP 登入的话,可以使用 pam_ldap 这个模组,这其中会有很多设定,当然也有很快速的方法,在此我介绍使用 authconfig 这个工具,就可以很轻易的设定好 ldap 的相关设定。

root # authconfig


root #

这个方法,我在 LDAP - 整合 Linux user login (New Window) 里面也有提过,我建议你再参考一次,因为有一些细节的地方,像是 group 如何对应到 LDAP,在该篇文写得很清楚。

测试系统是否经由 LDAP 认证

这个时候,你只要随便打个 id 就可以知道了。

root # id c293831287
uid=600(c293831287) gid=510(hr) groups=510(hr)
root #

建立使用者的 mail 档案

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

设定完 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
su: warning: cannot change directory to /home/f296974826: No such file or directory <- 不要理会这条讯息。
-bash-3.00$ mail
Mail version 8.1 6/6/93. Type ? for help.
"/var/spool/mail/f296974826": 2 messages 2 new
>N 1 root@vm-mail.l-pengu Sun Jul 23 20:02 15/520 "Welcome to vm-mail"
& 1
Message 1:
From root@vm-mail.l-penguin.idv.tw Sun Jul 23 20:19:26 2006
X-Original-To: f296974826
Delivered-To: f296974826@vm-mail.l-penguin.idv.tw
To: f296974826@vm-mail.l-penguin.idv.tw
Subject: Welcome to vm-mail
Date: Sun, 23 Jul 2006 20:19:26 +0800 (CST)
From: root@vm-mail.l-penguin.idv.tw (root)

Hi, f296974826:
Welcome to l-penguin.
Have a good day.

& q
/home/f296974826/mbox: No such file or directory
f296974826 $

其实只要看到有刚刚由 root 寄过来的欢迎信那就表示 OK 了。

重点讨论:

其实到现在 postfix 还是没有使用 LDAP ...

为什么要多出这个章节呢?很简单,可能有很多人认为到目前为止 postfix 是去询找 ldap 的资料,然后再送信的,其实这是不对的,我用下面简单的图来说明:

一般想法(错误):

postfix -- ldap -- user

实际流程:

postfix -- linux pam_ldap -- ldap -- user

由上面可以知道,其实正确流程是 postfix 使用 pam 系统去找 user 的资讯,而中间关於 ldap 的部份 postfix 根本就不管,而是由 pam_ldap 这个模组去做连结,再传回使用者资讯给 postfix。

手续这么多,我要怎么一次建立 user mail 档案?

其实建立 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

你也可以在此 下载

真正让 postfix 寻找 ldap 资料!

其实 ldap 能放的资讯很多,像是存放 user alias 资料、hostnames、body_checks 或 header_checks 等资讯都可以存放,这也就是说你连垃圾信的分析都可以放到里面,端看你怎么应用!

我在这里,示范如何使用 postmap 去查询 LDAP 资讯。我以 alias 来做说明。

编辑 /etc/postfix/main.cf

root # vi /etc/postfix/main.cf
----------------------------------------------------
#加入 alias
alias_maps = ldap:/misc/ldap/alias
----------------------------------------------------
root #

而 /misc/ldap/alias 的内容如下。

root # vi /misc/ldap/alias
----------------------------------------------------
# server 的位置
server_host = 192.168.1.61
#资料的查询位置
search_base = ou=user,ou=login,dc=l-penguin,dc=idv,dc=tw
#资料过滤条件
query_filter = (&(uid=%s))
#要回传的值
result_attribute = gecos
----------------------------------------------------
root #

在设定 server_host 时,请注意使用 IP 而不要使用 FQDN、Simple name,不知道什么原因,小弟只有在 IP 的表示下才正确连线,其它设定都会连到 localhost :(

使用 postmap 工具测试

设定好之后,请使用 postmap 来做测试,查询 d295380453 这个帐号的 gecos 值。

root # postmap -q 'd295380453' ldap:/misc/ldap/alias
Edward Mcelhaney
root #

对於 postfix 来说,有回传值表示有效的条件,若没有的话就代表无效,你可以使用 $? 参数来看。

root # postmap -q 'd295380453' ldap:/misc/ldap/alias; echo $?
Edward Mcelhaney
0
root #

回传一个 0 的有效值,postfix 如果遇到这种情况的话,因为是由 alias_maps 来使用 /misc/ldap/alias 这个档案的设定,所以当 postfix 得到 LDAP 的回应时,就会把这封送到 d295380453 的信件转送到 edward mcelhaney 这两个帐号。

现在我们再看另一个示范,是找出 c293831287。

root # postmap -q 'c293831287' ldap:/misc/ldap/alias; echo $?
1
root #

它回传一个 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


首页