OpenLDAP 服务器

LDAP 的意思是轻量目录访问协议,它是 X500 协议的简化版本。本节中的目录设置将会被用于认证。然而,一个 LDAP 目录在各种应用中可以被以不同方式使用:认证、共享目录(用于邮件客户端)。LDAP 是一种被广泛使用的标准。

快速描述下 LDAP,所有的信息都被存储在一棵树中。您需要自己决定目录的树状结构(目录信息树:DIT)。我们将从一棵在根上有着两个节点的基本的树开始:

您需要首先决定您的 LDAP 的根是什么。默认情况下,您的树是由您的互联网域名决定的。如果您的域名是 example.com (我们将在上面的例子中使用这个域名),您的根就会是 dc=example,dc=com。

安装

首先,在服务器上安装 ldap 服务器守护程序 (slapd);安装下列软件包:slapdldap-utils

在被询问时输入您的域名和您想用于目录管理员的密码。

几乎不需对默认配置进行更改。首先通过编辑 /etc/ldap/slapd.conf 文件,在配置文件中(而不是在目录中)设置 root 密码。

然而不要使用明文密码。要生成一个加密过的密码,先使用 slappasswd 您的密码

$ slappasswd
New password:
Re-enter password:
{SSHA}d2BamRTgBuhC6SxC0vFGWol31ki8iq5m

本例显示了使用字符串"secret"作为密码的情况。(由于 SSHA 加密机制的本质,您的结果会有所不同。)

现在编辑 /etc/ldap/slapd.conf 文件并将生成的字符串复制粘贴进去。

# Make sure you edit or add these directives after the first 'database' directive.

suffix          "dc=example,dc=com"
directory       "/var/lib/ldap"
rootdn          "cn=admin,dc=example,dc=com"
rootpw          {SSHA}d2BamRTgBuhC6SxC0vFGWol31ki8iq5m

准备 LDAP

目录在安装时已被创建,现在是时候填入内容了。我们会向其中填入一个“经典”条目,其将能与目录(例如一个共享目录的)、经典账号(一个 web 应用程序的) 以及 Unix 账号 (posix) 兼容。

LDAP 目录能够使用一个 ldif 文件 (ldif 的意思是 ldap 目录交换格式)。请在您的系统的某处产生这个样例文本文件 init.ldif。

dn: dc=example,dc=com
objectClass: dcObject
objectClass: organizationalUnit
dc: example
ou: Example Dot Com

dn: ou=people,dc=example,dc=com
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=example,dc=com
objectClass: organizationalUnit
ou: groups

dn: uid=john,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: john
sn: Doe
givenName: John
cn: John Doe
displayName: John Doe
uidNumber: 1000
gidNumber: 10000
userPassword: password
gecos: John Doe
loginShell: /bin/bash
homeDirectory: /home/john
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 8
shadowMax: 999999
shadowLastChange: 10877
mail: john.doe@example.com
postalCode: 31000
l: Toulouse
o: Example
mobile: +33 (0)6 xx xx xx xx
homePhone: +33 (0)5 xx xx xx xx
title: System Administrator
postalAddress: 
initials: JD

dn: cn=example,ou=groups,dc=example,dc=com
objectClass: posixGroup
cn: example
gidNumber: 10000

在上面的例子中,设置了目录结构、一个用户和一个组。在其它的例子中您可能会看到 objectClass: top 被添加到每个条目中,但这是默认的行为,因此您不必显式添加它。

现在,将您的条目添加到 LDAP:

  • 停止 LDAP 守护程序: sudo /etc/init.d/slapd stop

  • 删除在安装时自动添加的内容: sudo rm -rf /var/lib/ldap/*

  • 添加我们的内容 sudo slapadd -l init.ldif

  • 启动 LDAP 守护程序: sudo /etc/init.d/slapd start

我们可以使用 ldap-utils 软件包中的工具来检查内容是否已被正确添加。要在 LDAP 目录中执行搜索:

ldapsearch -xLLL -b "dc=example,dc=com" uid=john sn givenName cn
dn: uid=john,ou=people,dc=example,dc=com
cn: John Doe
sn: Doe
givenName: John

简单的解释:

  • 使用 -x 是因为我们不使用 SASL 认证方法 (默认)

  • -LLL 关闭打印 LDIF 信息

设置 ACL

认证需要对密码域的访问,而密码域不该是默认可访问的。另一个问题是在改变密码时也需要能够使用 passwd shadowLastChange。下面的代码显示了一个允许访问 shadowLastChange 的 ACL 设置样例:

access to attr=shadowLastChange
        by dn="cn=manager,dc=example,dc=com" write
        by self write
        by * read

LDAP 副本

LDAP 服务经常会很快成为一个信息系统中极为关键的服务:所有东西都依赖于 LDAP:认证、授权、邮件系统等。这时设置一个冗余系统就是一个好主意。其很容易设置,这里是一个快速指南。

在这里副本会基于一个主从关系。在实现 LDAP 之前请先考虑以下步骤:

  1. 停止主服务器的 slapd 守护进程。

  2. 重新配置主服务器的 slapd.conf 文件来激活到新从服务器的副本。

  3. 导出主服务器的数据库。

  4. 配置副本服务器的 slapd.conf

  5. 将主服务器的数据库导入到从服务器。

  6. 重/启动副本服务器的 slapd 进程

  7. 重/启动主服务器的 slapd 进程。

您需要记住 总是 在主服务器上进行更改。如果您更改了从服务器,这些更改会被丢弃。

LDAP 主服务器

在主服务器上,您需要修改 /etc/ldap/slapd.conf 的数据库部分以便添加一个副本。以下的例子显示了一个在 ldap-2.example.com 中的副本,拥有 Manager 用户,并以 secret 作为密码。副本日志文件是用来存储在发送到 LDAP 从服务器之前的更改的。

replica uri=ldap://ldap-2.example.com:389 binddn="cn=Manager,dc=example,dc=com" bindmethod=simple credentials=secret

replogfile      /var/lib/ldap/replog

使用 slapcat 导出主服务器的数据库。然后使用 scp 或是其它工具将 master.ldif 复制到从服务器。

user@master:~$ sudo slapcat -l master.ldif

LDAP 从服务器

在从服务器上,您需要授权您的主服务器更新 LDAP 数据库。在您的 /etc/ldap/slapd.conf 文件的数据库部分添加如下的行:

updatedn        cn=Manager,dc=example,dc=com
updateref       ldap://ldap-1.example.com

使用 slapadd 导入 master.ldif

user@slave:~$ sudo slapadd -c -l master.ldif

重启主服务器。

user@master:~$ sudo /etc/init.d/slapd start

重启从服务器。

user@slave:~$ sudo /etc/init.d/slapd start