对密码进行散列操作之后,如果服务器可以让用户登录,就会向 PAM 报告说已经成功进行了绑定。成功绑定可以完全满足 PAM 对 pam_ldap 模块汇报成功的标准,如果所有其他 PAM 标准都已经满足了,那么就允许用户登录到系统中。
当 LDAP 服务器对身份验证进行处理时,需要解决另外两个问题才能满足提供可靠安全的身份验证的目标。现在,任何客户机系统不能成功地与 LDAP 服务器进行通信都会阻止用户登录客户机系统。在下一节中我们将看到如何消除这种单点故障,这将显示客户机如何从备份服务器上访问 LDAP 目录。由于用户密码是在网络上以正文文本格式传输的,因此这并不能满足安全身份验证的需求。配置 TLS 安全性 将解决这个问题。
配置复制
为了防止出现客户机由于 LDAP 服务器的问题而不能登录的情况,我们需要采用复制技术来实现可靠性目标。复制是通过 OpenLDAP 复制进程 slurpd 提供的,它会周期性地唤醒,并检查主服务器上的日志文件,从而确定是否有任何更新。这些更新然后会传播到从服务器上。读请求可以由任何一个服务器进行解析,而更新请求则只能由主服务器进行解析。客户机需要负责在推荐地址上重试更新操作。
要配置复制,需要停止 OpenLDAP 服务器的 slapd 守护进程:
清单 10. 停止服务 # service ldap stop
将以下内容添加到服务器的 /etc/openldap/slapd.conf 文件中,从而启用对新从服务器的复制。replogfile 行的内容指定类 LDIF 变化应该写入的文件。replica 原语定义了变化应该传播到的主机:
#Replicas of this database replogfile /var/lib/ldap/replog
replica host=dhcp64-253.ibm.com:389
binddn=\ credentials=secret
bindmethod=simple
在运行从 OpenLDAP 服务器的系统上,请遵循 配置 LDAP 服务器 一节给出的步骤。然后通过将信息导出到一个 ldif 文件中并将其添加到从服务器数据库上,从而将数据库从主服务器拷贝到复制服务器上。 在主服务器上:
清单 11. 将数据导出到 LDIF 文件中 # ldapsearch -x > database.ldif
在复制服务器上:
清单 12. 将数据添加到从服务器数据库中 # ldapadd -x -D \
将以下内容添加到复制服务器的 /etc/openldap/slapd.conf 文件中。updatedn 指定了在更新从目录时主 slurpd 守护进程使用的 DN。updateref 指定的是主目录服务器。当一个 LDAP 客户机请求从服务器进行更新时,从服务器就将客户机重定向到这个主服务器上。
updatedn %updateref ldap://dhcp64-233.ibm.com:389/
启动复制 OpenLDAP 服务器,当它运行之后,再启动主 OpenLDAP 服务器。在主服务器上,slapd 和 slurpd 都会启动。
现在,可以让 OpenLDAP 客户机除了主服务器之外还可以使用复制服务器,这可以通过运行 authconfig 并将复制主机名添加到第二个屏幕中的 Server 行中实现,也可以通过在 /etc/ldap.conf 中修改 host 实现:
host dhcp64-253.ibm.com dhcp64-233.ibm.com
为了确认复制可以正常工作,需要研究一下在更新 gecos 属性时到底发生了什么。复制日志使用了与 LDIF 类似的格式。在读取 replogfile 之后,slurpd 会将这个条目拷贝到自己的重做日志中。实际的变化都以 LDIF 格式保存在主 LDAP 服务器上 /var/lib/ldap/replica/ 中的 slurpd.replog 文件中。
使用文件 user_mod 中的变化,客户机程序 ldapmodify 应用这些变化:
清单 13. 应用 user_mod 的变化
# cat user_mod
dn: uid=ldapuser,ou=People,dc=ibm,dc=com changetype: modify replace: gecos gecos: test2
# tail -f /var/lib/ldap/replog &
# ldapmodify -x -r -f /home/ldapuser/user_mod -D'cn=Manager,dc=ibm,dc=com' -W Enter LDAP Password:
modifying entry \
replica: dhcp64-253.ibm.com:389
time: 1130111686
dn: uid=ldapuser,ou=People,dc=ibm,dc=com changetype: modify replace: gecos gecos: test2 -
replace: entryCSN
entryCSN: 20051023235446Z#000001#00#000000 - replace: modifiersName modifiersName: cn=Manager,dc=ibm,dc=com - replace: modifyTimestamp modifyTimestamp: 20051023235446Z -
配置 TLS 安全性
LDAP 是以明文的格式通过网络来发送所有信息的,包括密码。我们将采用 TLS 所提供的加密机制(SSL 的后继者)来解决这个问题。在传输层,数据使用 TLS 协议进行加密和封装,然后通过网络进行传输。用来配置加密的工具都是由 OpenSSL 包提供的。
虽然加密是一个复杂的主题,但是要使用 OpenSSL 包,我们依然需要简要介绍一下 TLS 是如何工作的。数据块使用一个对称密钥算法进行加密,它使用一个密钥来实现对数据的加密和解密。我们还有一个问题:如何防止出现以正文文本格式将密钥从 LDAP 服务器发送到 LDAP 客户机上的情况。我们使用公钥算法来解决这个问题,其中客户机可以使用一个自由获取的公钥对自己的密钥进行加密,而只有服务器才可以对这个密钥进行解密。
公钥是作为证书的一部分来创建和分发的,其中包含了一些支持信息,例如 ID、过期日期、提供这个证书的 LDAP 服务器的完整域名(FQDN)。在 LDAP 客户机使用证书进行加密之前,它会验证自己正在与之进行交谈的服务器拥有这个证书,这是通过加密一个挑战并验证服务器可以对其进行解密实现的。
要验证发行这个证书的服务器是一个已经批准过的 LDAP 服务器,客户机被配置为只接受本地证书机构(CA)所签署的证书。它使用 CA 所生成的证书中的公钥,这个公钥保存到客户机中以验证这个 LDAP 所产生的证书是有效的。
在这个例子中,我们将自己的 LDAP 服务器设置为证书机构,并创建一个自签署的证书供 LDAP 客户机和服务器在加密信息中使用。
用来构建 TLS 服务器的 Red Hat Enterprise Linux release 4 Update 1 包是:
openssl-0.9.7a-43.1:包括一个证书管理工具和提供各种加密算法和协议的共享库
要构建证书机构的工作环境并生成自己的自签署证书,需要运行 /usr/share/ssl/misc/CA shell 脚本,这是一个对 openssl 命令的封装程序。私密性增强邮件(PEM)是一种用来对数据进行加密和编码的格式:
?
清单 14. 运行 CA shell 脚本 # cd /usr/share/ssl/misc # ./CA -newca CA certificate filename (or enter to create) Making CA certificate ... Generating a 1024 bit RSA private key .........++++++
......++++++
writing new private key to './demoCA/private/./cakey.pem' Enter PEM pass phrase:
Verifying - Enter PEM pass phrase: Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. -----
Country Name (2 letter code) [GB]:US
State or Province Name (full name) [Berkshire]:Oregon Locality Name (eg, city) [Newbury]:Beaverton
Organization Name (eg, company) [My Company Ltd]:IBM Organizational Unit Name (eg, section) []:its
Common Name (eg, your name or your server's hostname) []:dhcp64-233.ibm.com Email Address []:root@dhcp64-233.ibm.com
接下来,要生成由证书机构进行签署的服务器证书。其余的步骤只会对主 LDAP 服务器执行一次,此时指定的是 CN=dhcp64-233.ibm.com;然后对从服务器执行一次,此时指定的是 CN=dhcp64-253.ibm.com。还要使用 nodes 选项,这样就不用在每次启动 OpenLDAP 服务器守护进程 slapd 时都需要输入密码了。签署后的公钥被嵌入到证书请求 slapd-req.pem 中,与之匹配的私钥嵌入在 slapd-key.pem 中:
清单 15. 生成服务器证书 # openssl req -new -nodes -subj '/CN=dhcp64-233.ibm.com/O=IBM/C=US/ST=Oregon/L=Beaverton' -keyout slapd-key.pem -out slapd-req.pem -days 365 Generating a 1024 bit RSA private key ...............++++++ .....................................++++++ writing new private key to 'slapd-key.pem' -----
使用在第一个步骤中创建的 CA 证书对这个证书进行签署:
清单 16. 对证书进行签署
# openssl ca -out slapd-cert.pem -infiles slapd-req.pem Using configuration from /usr/share/ssl/openssl.cnf Enter pass phrase for ./demoCA/private/cakey.pem: Check that the request matches the signature Signature ok Certificate Details:
Serial Number: 1 (0x1) Validity
Not Before: Oct 25 02:50:05 2005 GMT Not After : Oct 25 02:50:05 2006 GMT Subject:
countryName = US stateOrProvinceName = Oregon
organizationName = IBM
commonName = dhcp64-233.ibm.com X509v3 extensions:
X509v3 Basic Constraints: CA:FALSE Netscape Comment:
OpenSSL Generated Certificate
DirName:/C=US/ST=Oregon/L=Beaverton/O=IBM/OU=its/CN=dhcp64-233.ibm.com /emailAddress=root@dhcp64-233.ibm.com serial:00
Certificate is to be certified until Oct 25 02:50:05 2006 GMT (365 days) Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y Write out database with 1 new entries Data Base Updated
下一个步骤将所有需要的证书拷贝到 slapd 可以找到的地方。另外,还要对每个文件强制采用正确的权限:
清单 17. 拷贝证书并强制设置权限 # cp -p slapd-key.pem /etc/openldap/slapdkey.pem X509v3 Subject Key Identifier:
11:A2:FB:59:42:A4:B3:26:73:1D:6D:F5:4D:2F:80:F0:FA:10:38:F5 X509v3 Authority Key Identifier:
keyid:F7:6A:25:F5:76:BE:20:E7:8D:0F:51:EF:D8:86:7B:AF:2C:74:2F:80