http://www.360doc.com/content/13/0221/09/11635640_266880763.shtml

http://bbs.chinaunix.net/thread-1915727-1-1.html
http://blog.csdn.net/frylion/article/details/8538571

因为要将各系统的用户目录统一到LDAP服务器上,正在做linux用户向LDAP的迁移,用户信息导出都没问题,但是用户的密码导出的是加密后的密文,有没有办法将linux的明文直接导入LDAP服务器呢?

问题的源头:

linux中导出的用户ldif文件中userpassword是密码密文,导入LDAP服务器的也因此是密文。但是LDAP用户从linux登录的时候,linux服务器传递给LDAP用以验证的是用户ID和密码明文,而ldap端存储的是密文,将密码密文与传送过来的密码明文比较,当然不一致,也因此无法登录。

再补充一下,上文说的密码明文指的是 密码原字符串,密文指的是经过加密处理的字符串。

我觉得历史上肯定有人遇到过这个应用场景吧,遇到迁移的事项,要把用户带密码迁移出来。这个问题也许也有其他解决方法,有人有什么想法么?

测试用例:
(1)创建linux上用户user1,密码111111
(2)用migrate_passwd.pl 工具得到user1的ldif文件
(3)在Tivoli Directory Server(IBM的LDAP服务器)里import ldif(设置TDS对所存储的密码不再次加密,即直接存储ldif文件里userpassord的字符串(经过linux加密处理的user1的密码))
(4)配置linux使用LDAP用户登录
(5)user1在linux端登录失败
(6)从TDS导出ldif文件,确认userpassword不是111111,而是加密后的字符串(见第三条括号内内容)
(7)手动在TDS端修改user1的userpassword值为111111,经导出ldif文件确认TDS存储的密码原文是111111
(8)user1从linux端可以用111111成功登录
(9)user1在linux端通过passwd命令修改密码为222222,logout,再login,无法成功登录

补充实验:
(1)直接在TDS端创建新用户user2 ,userpassword属性直接输入密码值,比如222222。linux端用该用户登录,可以成功登录

(2)在linux端,用passwd user2修改密码为333333,logout后,user2无法使用密码333333成功登录;从TDS端查看,发现TDS存储的是经linux对333333加密处理后的字符串

经过这些实验做出一楼的判断

LDAP存储密码是支持加密的,而且可以选择各种加密算法;但这是是对从ldif导出的userpassword值在存储到LDAP前进行再一次加密,和linux端就没有关系了。我采用明文存储密码只是测试时方便查看LDAP里存储的userpassword值到底是什么。

存储系统帐户初始结构的,这个也没有问题

问题是,从linux导出用户的ldif文件,如
dn: uid=user2,ou=GCL,ou=CSDL,o=XXX,c=cn
loginShell: /bin/bash
memberUid: 901
gidNumber: 801
objectclass: posixGroup
objectclass: top
objectclass: posixAccount
objectclass: shadowAccount
uid: user2
uidNumber: 901
cn: user2
description: One user of system
homeDirectory: /home/user2
userpassword: xxxxxxxxxxx
ownerpropagate: TRUE
entryowner: access-id:UID=user2,OU=GCL,OU=CSDL,O=XXX,C=CN

userpassword这里记录的是用户的密码密文。如果用户的password原文是111111,这里显示的可能就是ABCDE,而存在LDAP里的就是ABCDE(或者被LDAP再加密一道如EDCBA)。这样当user2作为LDAP用户在linux端登录时,linux会将111111传递给LDAP,而LDAP会拿111111与ABCDE进行匹配,匹配不一致,就通过不了验证。

如果只是迁移用户而不在乎其原始密码,或创建新用户就完全没有现在遇到的问题。

从您给的这两个提示来看,我前文对问题的描述可能不够清楚。现在的问题是,我要迁移用户的原有密码

===============

http://www.ibm.com/developerworks/cn/linux/l-openldap/#ibm-pcon

使用 OpenLDAP 集中管理用户帐号

简介

Linux 发行版中提供的 OpenLDAP 软件按照一个客户机/服务器模型实现了轻量级目录访问协议(LDAP)。LDAP 的设计目的是提供一种有效的方法来查找和管理信息。OpenLDAP 软件和包提供了创建目录信息树(一个主要进行读操作的数据库)的工具。本文向您展示如何存储用户的帐号信息,并修改身份验证服务来使用 LDAP 获取所需要的信息。内部细节并不重要,因为这些工具可以将数据库的内容以文本格式(LDAP 数据交换格式,LDIF)呈现在您的面前。

LDAP 信息被组织成属性和值的组合,称为 条目(entry)。条目可能会具有必须的属性或可选属性。一个条目的属性必须要遵循 /etc/openldap/schema/ 模式文件中定义的规则。规则包含在条目的 objectclass 属性中。看一下下面的关系,我们可以看出 posixAccount objectclass 中包含了密码文件条目的信息(posixAccount userPassword 是文件条目的 base64 编码)。

图 1. LDAP 目录条目和 Linux 密码文件之间的关系

文件 /etc/openldap/schema/nis.schema 为 posixAccount 对象类中的条目定义了所有的属性和 objectclass。例如,下面是对 uidNumber 属性的描述:

attributetype ( 1.3.6.1.1.1.1.0 NAME 'uidNumber'
DESC 'An integer uniquely identifying a user in an administrative domain'
EQUALITY integerMatch
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )

所有的属性类型都已经定义了,它们被收集到 posixAccount objectclass 中。例如:

objectclass ( 1.3.6.1.1.1.2.0 NAME 'posixAccount' SUP top AUXILIARY
DESC 'Abstraction of an account with POSIX attributes'
MUST ( cn $ uid $ uidNumber $ gidNumber $ homeDirectory )
MAY ( userPassword $ loginShell $ gecos $ description ) )

ldapuser 条目具有一个识别名属性 dn,它用作用户名,并与 userPassword 一起用来在 LDAP 目录中记录信息,或与 LDAP 目录绑定在一起使用。

LDAP 为作为容器使用的特殊条目提供了将这些条目组织成树结构的功能。在这个例子中,我们将使用一个容器 People 保存用户帐号信息,使用另外一个容器 Groups 保存组帐号信息。所生成的目录信息树如图 2 所示。

图 2. 用户帐号信息使用的目录信息树

让我们来看一下如何配置 OpenLDAP 服务器,如何将信息从系统文件迁移到 LDAP 目录中,如何配置 OpenLDAP 客户机通过 LDAP 对用户进行身份验证。在使用一个集中的身份验证数据库时,应该通过使用复制技术采用第二个 LDAP 服务器提供高可用性,这样在主服务器出现问题时,就可以使用第二个 LDAP 服务器响应客户机的请求。由于诸如密码之类的身份验证数据会通过网络进行传输,因此希望使用 TSL 协议建立加密通信连接。

我们的 OpenLDAP 服务器和客户机都是虚拟机,上面运行的是 Red Hat Enterprise Linux AS release 4(Nahant Update 1)。在我们的例子中使用了 表 1 所列出的系统。如果想模仿这些例子,请使用适合您自己的设置。

表 1. 系统网络信息

角色 主机名 IP 地址
OpenLDAP 主服务器 dhcp64-233.ibm.com 9.47.64.233
OpenLDAP 从服务器 dhcp64-253.ibm.com 9.47.64.253
OpenLDAP 客户机 dhcp64-251.ibm.com 9.47.64.251

回页首

配置 LDAP 服务器

我们使用 Red Hat Enterprise Linux release 4 Update 1 上的包来构建服务器:

  • openldap-2.2.13-2:包含 OpenLDAP 配置文件、库和文档
  • openldap-servers-2.2.13-2:包含 slapd 和 slurpd 服务器、迁移脚本和相关文件
  • openldap-clients-2.2.13-2:包含客户机程序,用来访问和修改 OpenLDAP 目录

OpenLDAP 包在服务器上安装了很多程序:

  • 守护进程:

    • slapd:主 LDAP 服务器
    • slurpd:负责与复制 LDAP 服务器保持同步的服务器
  • 对网络上的目录进行操作的客户机程序。下面这两个程序是一对儿:
    • ldapadd:打开一个到 LDAP 服务器的连接,绑定、修改或增加条目
    • ldapsearch:打开一个到 LDAP 服务器的连接,绑定并使用指定的参数进行搜索
  • 对本地系统上的数据库进行操作的几个程序:
    • slapadd:将以 LDAP 目录交换格式(LDIF)指定的条目添加到 LDAP 数据库中
    • slapcat:打开 LDAP 数据库,并将对应的条目输出为 LDIF 格式

OpenLDAP 的主要服务器配置文件是 /etc/openldap/slapd.conf。本例所使用的完整 slapd.conf 文件如 清单 18 所示。slapd.conf 文件中包括一系列全局配置选项,它们作为一个整体应用到 slapd 上面,后面是包含数据库特有信息的数据库后端定义。如果一行内容是以空格开始的,就认为它是上一行的延续。空行和以 “#” 字符开头的注释行都会被忽略。

如果您正把本文当作练习来做,那就可以按照下面指定的方式进行修改,从而启动 LDAP 服务器。一旦确认服务器正常工作之后,就可以添加复制功能,然后再添加安全性支持。首先是全局配置信息段的设置。其中每个选项的值都是我们想要的。

正如上面介绍的一样,信息被组织成属性和值的组合,称为条目。条目属性必须遵循的规则是使用 objectclass 专用属性进行组织的,这可以在 /etc/openldap/schema/ 模式文件中找到。对于身份验证来说,需要使用在 nis.schema 中定义的 posixAccountshadowAccount objectclasses:

include /etc/openldap/schema/nis.schema

loglevel 行设置的是日志选项。可以将其设置为这样的级别:调试语句和操作统计信息都会被记录到 /var/log/slapd.log 中。日志级别是累加的:296 = 256 日志连接/操作/结果 + 32 搜索过滤器处理 + 8 连接管理:

loglevel 296

日志信息会被记录到 syslogd LOG_LOCAL4 机制中。还需要将下面的内容添加到 /etc/syslog.conf 中,并让 syslogd 重新读取自己的配置文件:

local4.debug /var/log/slapd.log

access 行定义了谁可以访问目录中的内容。我们希望用户可以修改自己的密码,并更新自己的 shadow 信息来反映密码的变化。希望身份验证程序能够检索用户的密码。还希望用户能够读取所有其他条目。注意密码条目是不可读的,shadow 属性的惟一用处就是管理密码的过期问题。

access to attrs=shadowLastChange,userPassword
by self write
by * auth
access to *
by * read

接下来,在 database 部分,要定义下面的内容。

使用新的 bdb 后端数据库:

database bdb

指定后端数据库需要响应的查询的 DN 前缀。为了确保惟一性,根前缀应该从自己的网络域名构建出来。在本例的情况中,它是 .dc=svc,dc=beaverton,dc=ibm,dc=com.,但是在下面的例子中我们对其进行了简化:

suffix "dc=ibm,dc=com"

指定管理 DN,它不用于访问控制或限制数据库的操作。也不需要在目录中为这个 DN 指定一个条目。为具有 rootpw 密码的管理员使用 DN 可以跳过 ACL 规则中的所有访问控制:

rootdn "cn=Manager,dc=ibm,dc=com"
rootpw {MD5}ijFYNcSNctBYg

这就是我们现在想要设置的选项。稍后将返回 slapd.conf 文件来配置复制,然后在配置安全性。

现在,我们希望将数据添加到目录中,并确认可以访问这些信息。要实现这种功能,需要配置服务器来使用 ldap 客户机工具,例如 ldapadd 和 ldapsearch。ldap 客户机工具的配置文件是 /etc/openldap/ldap.conf。我们使用的这个文件的完整列表如本文末尾的 清单 19 所示。要在 ldap 服务器上运行这些工具,只需要将该行修改成下面的内容:

BASE dc=ibm,dc=com

设置启动脚本在级别 2、3 和 5 时启动 LDAP:

清单 1. 设置启动运行级别

# chkconfig --levels 235 ldap on

从命令行中启动服务:

清单 2. 启动服务

# service ldap start
Starting slapd:                               [  OK  ]

OpenLDAP 守护进程 slapd 应该已经运行了:

清单 3. 检查服务正在运行

# ps -ef | grep slap
ldap   13521  1  0 Oct24 ?     00:00:00 /usr/sbin/slapd -u ldap -h ldap:/// ldaps:///

ldapsearch -x 命令应该可以成功完成,但不会返回任何数据。


回页首

迁移密码和 shadow 信息

Red Hat 所提供的 openldap-servers 包包含 PADL Software Pty Ltd. 公司的 MigrationTools 工具。我们将使用这些工具将数据从 Linux 系统文件(例如 /etc/group 和 /etc/password)转换成 LDAP LDIF 格式,这是数据库信息的一种文本格式的表示。这种格式是行界定、冒号分隔的属性-值对。

有一组 Perl 脚本被安装到 /usr/share/openldap/migration/ 中执行迁移。这些 Perl 脚本的配置信息包含在 migrate_common.ph 文件的开头。对于我们的目的来说,只需要修改命名前缀的变量来使用条目的识别名就足够了,如下所示:

$DEFAULT_BASE = "dc=ibm,dc=com"

在进行这些修改之后,请运行脚本 migrate_base.pl,它会创建根项,并为 Hosts、Networks、Group 和 People 等创建低一级的组织单元:

清单 4. 运行 migrate_base.pl

# migrate_base.pl > base.ldif

编辑 base.ldif,删除除下面之外的所有条目:

清单 5. base.ldif 条目

# cat base.ldif
dn: dc=ibm,dc=com
dc: ibm
objectClass: top
objectClass: domain
dn: ou=People,dc=ibm,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
dn: ou=Group,dc=ibm,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit

在 LDAP 服务器上,使用 OpenLDAP 客户机工具 ldapadd 将以下条目插入到数据库中。简单身份验证必须要使用 -x 选项指定。在 slapd.conf 中定义的 rootdn 身份验证识别名是 “cn=Manager,dc=ibm,dc=com”。对于简单身份验证来说,必须使用密码。选项 -W 强制提示输入密码。这个密码就是在 slapd.conf 文件中指定的 rootpw 参数的值。包含这些条目的 LDIF 文件是使用 -f 选项指定的:

清单 6. 使用 ldapadd 插入条目

# ldapadd -x -D "cn=Manager,dc=ibm,dc=com" -W -f base.ldif

接下来,从 /etc/group 中迁移 ldapuser 组:

清单 7. 迁移 ldapuser 组

# grep ldapuser /etc/group > group.in
# ./migrate_group.pl group.in > group.ldif
#  cat group.ldif
dn: cn=ldapuser,ou=Group,dc=ibm,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapuser
userPassword: {crypt}x
gidNumber: 500
# ldapadd -x -D "cn=Manager,dc=ibm,dc=com" -W -f group.ldif

最后,从 /etc/passwd 和 /etc/shadow 中迁移 ldapuser 的信息:

清单 8. 迁移 ldapuser 信息

# grep ldapuser /etc/passwd > passwd.in
# ./migrate_passwd.pl passwd.in > passwd.ldif
# cat passwd.ldif
dn: uid=ldapuser,ou=People,dc=ibm,dc=com
uid: ldapuser
cn: ldapuser
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
userPassword: {crypt$1$TeOlOcMc$cpQaa0WpLSFRC1HIHW5bt1
shadowLastChange: 13048
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 500
homeDirectory: /home/ldapuser
gecos: ldapuser
# ldapadd -x -D "cn=Manager,dc=ibm,dc=com" -W -f passwd.ldif

现在检查已经添加到数据库中的信息。清单 9 给出了全部输出结果:

清单 9. 以 LDIF 格式填充的 OpenLDAP 数据库

# ldapsearch -x
# extended LDIF
#
# LDAPv3
# base <> with scope sub
# filter: (objectclass=*)
# requesting: ALL
#
# ibm.com
dn: dc=ibm,dc=com
dc: ibm
objectClass: top
objectClass: domain
# People, ibm.com
dn: ou=People,dc=ibm,dc=com
ou: People
objectClass: top
objectClass: organizationalUnit
# Group, ibm.com
dn: ou=Group,dc=ibm,dc=com
ou: Group
objectClass: top
objectClass: organizationalUnit
# ldapuser, Group, ibm.com
dn: cn=ldapuser,ou=Group,dc=ibm,dc=com
objectClass: posixGroup
objectClass: top
cn: ldapuser
gidNumber: 500
# ldapuser, People, ibm.com
dn: uid=ldapuser,ou=People,dc=ibm,dc=com
uid: ldapuser
cn: ldapuser
objectClass: account
objectClass: posixAccount
objectClass: top
objectClass: shadowAccount
shadowMax: 99999
shadowWarning: 7
loginShell: /bin/bash
uidNumber: 500
gidNumber: 500
homeDirectory: /home/ldapuser
gecos: test2
# search result
search: 2
result: 0 Success
# numResponses: 6
# numEntries: 5

回页首

配置 LDAP 客户机

用来设置客户机的 Red Hat Enterprise Linux release 4 Update 1 包包括:

  • nss_ldap-226-6:包括两个 LDAP 访问客户机:nss_ldap 和 pam_ldap

    • nss_ldap 是一组 C 库扩展,它允许 LDAP 目录服务器用作一个用户和组信息的主源
    • pam_ldap 是一个 Linux-PAM 模块,它支持身份验证功能

LDAP 身份验证要想正确地工作,需要配置两个服务:系统命名服务和身份验证服务。

系统命名服务(NSS)需要配置为使用 LDAP 来解析诸如用户和组帐号之类的资源。例如,在运行命令 ls -l 时,如果某个文件 inode 给出文件的所有者是 “user 501”,那么命名服务就需要将 “uid 501” 解析成用户名,并在 ls 命令输出结果中输出。通常来说,这是通过查找 /etc/passwd 文件中的所有用户帐号实现的。由于用户现在都存储在 LDAP 目录中,因此系统需要配置成同时对 passwd 文件和 LDAP 目录中的帐号进行解析。这种功能是通过 /usr/lib/libnss_ldap.so 库提供的。

身份验证服务是实际向 LDAP 验证用户身份的服务。可插入身份验证模块(PAM)提供了本地 Linux 身份验证服务。下面我们将配置 PAM 先对本地的 /etc/passwd 文件检查用户帐号,然后再对 LDAP 服务器进行检查。PAM LDAP 模块可以用来将身份验证重定向到 LDAP 目录上。/lib/security/pam_ldap.so PAM 模块提供了 LDAP 身份验证功能。

身份验证本身是由 PAM 程序执行的,它从身份验证候选机制中获取用户名,将其绑定到 OpenLDAP 服务器上,检索与这个 uid 条目(用户名条目)相关的 DN;从身份验证候选机制中获取密码,然后使用这个 DN 和密码试图将其绑定到 OpenLDAP 服务器上。如果绑定成功,PAM 会报告说这个用户已经成功通过了 pam_ldap.so 提供的身份验证测试。根据 PAM 的配置不同,在用户看到命令行提示符之前可能会执行其他测试。

我们可以采用两种方法来配置 LDAP 客户机。一种快速而简单的方法是运行 /usr/sbin/authconfig,并在两个屏幕中输入信息。另外一种方法是通过编辑客户机 LDAP 配置文件 /etc/ldap.conf,然后修改 /etc/nsswitch.conf、/etc/sysconfig/authconfig 和 /etc/pam.d/system-auth。首先让我们来看一下如何运行 authconfig。

如图 3 所示进行选择,然后点击 Next

图 3. 执行 authconfig 命令的第一个页面

在如图 4 所示的第二个屏幕中输入对应的信息,然后点击 OK

图 4. 执行 authconfig 命令的第二个页面

要手工配置 OpenLDAP 客户机,请遵循下面的步骤。

用来跟踪特定身份验证机制是否已经启用的文件是 /etc/sysconfig/。我们可以希望以下条目的值都是 “yes”:

USELDAP=yes
USELDAPAUTH=yes
USEMD5=yes
USESHADOW=yes
USELOCAUTHORIZE=yes

PAM 和 NSS 模块使用的基本配置文件是 /etc/ldap.conf。host 选项指定 LDAP 服务器,base 选项指定这个目录使用的 DN,最初我们希望关闭加密功能:

host dhcp64-233.ibm.com
base dc=ibm,dc=com
ssl off

要让 NSS 服务使用 OpenLDAP 服务器,需要将 “ldap” 添加到 /etc/nsswitch.conf 文件的 passwd、shadow 和 group 行中,如下所示:

passwd: files ldap
shadow: files ldap
group: files ldap

要让 PAM 身份验证服务使用 OpenLDAP 服务器,请将 pam_ldap 行加入到 /etc/pam.d/system-auth 中,位置在对应的标准 pam_unix.so 条目之后。尽管其他设置也可以实现相同的结果,但是我使用下面的文件设置:

auth required /lib/security/$ISA/pam_env.so
auth sufficient /lib/security/$ISA/pam_unix.so likeauth nullok
auth sufficient /lib/security/$ISA/pam_ldap.so use_first_pass
auth required /lib/security/$ISA/pam_deny.so

account required /lib/security/$ISA/pam_unix.so broken_shadow
account sufficient /lib/security/$ISA/pam_localuser.so
account sufficient /lib/security/$ISA/pam_succeed_if.so uid %lt; 100 quiet
account [default=bad success=ok user_unknown=ignore] /lib/security/$ISA/pam_ldap.so
account required /lib/security/$ISA/pam_permit.so

password requisite /lib/security/$ISA/pam_cracklib.so retry=3
password sufficient /lib/security/$ISA/pam_unix.so nullok use_authtok md5 shadow
password sufficient /lib/security/$ISA/pam_ldap.so use_authtok
password required /lib/security/$ISA/pam_deny.so

session required /lib/security/$ISA/pam_limits.so
session required /lib/security/$ISA/pam_unix.so
session optional /lib/security/$ISA/pam_ldap.so

现在,用户帐号信息可以从客户机系统中删除并从 LDAP 目录中进行获取了。当用户试图登录客户机系统时,PAM 身份验证服务就会从用户那里获取用户名,在我们的例子中是 ldapuser。PAM 会从 LDAP 服务器中检索识别名(DN)条目 .dn: uid=ldapuser, ou=People, dc=ibm, dc=com.。PAM 然后会从用户那里获取密码。然后 PAM 试图使用这个 DN 和密码与 LDAP 服务器进行绑定。DN 和密码都以正文文本的格式发送给 LDAP 服务器。在对密码进行散列操作之后,如果服务器可以让用户登录,就会向 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="cn=Manager,dc=ibm,dc=com"
credentials=secret
bindmethod=simple

在运行从 OpenLDAP 服务器的系统上,请遵循 配置 LDAP 服务器 一节给出的步骤。然后通过将信息导出到一个 ldif 文件中并将其添加到从服务器数据库上,从而将数据库从主服务器拷贝到复制服务器上。

在主服务器上:

清单 11. 将数据导出到 LDIF 文件中

# ldapsearch -x > database.ldif

在复制服务器上:

清单 12. 将数据添加到从服务器数据库中

# ldapadd -x -D "cn=Manager,dc=ibm,dc=com" -W -f database.ldif

将以下内容添加到复制服务器的 /etc/openldap/slapd.conf 文件中。updatedn 指定了在更新从目录时主 slurpd 守护进程使用的 DN。updateref 指定的是主目录服务器。当一个 LDAP 客户机请求从服务器进行更新时,从服务器就将客户机重定向到这个主服务器上。

updatedn "cn=Manager,dc=ibm,dc=com"
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 "uid=ldapuser,ou=People,dc=ibm,dc=com"
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
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
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
# cp -p slapd-cert.pem /etc/openldap/slapdcert.pem
# chown ldap:ldap /etc/openldap/slapdcert.pem
# chmod 644 /etc/openldap/slapdcert.pem
# chown ldap:ldap /etc/openldap/slapdkey.pem
# chmod 400 /etc/openldap/slapdkey.pem
# mkdir /etc/openldap/cacerts/
# cp /usr/share/ssl/misc/demoCA/cacert.pem /etc/openldap/cacerts/cacert.pem
# chown ldap:ldap /etc/openldap/cacerts cacert.pem
# chmod 644 /etc/openldap/cacerts cacert.pem

在 OpenLDAP 服务器上,将以下内容添加到 /etc/openldap/slapd.conf 文件的 global 段下面。TLSCertificateFileTLSCertificateKeyFile 指定了证书文件和私钥文件的路径。TLSCipherSuite 指定了一个 OpenSSL 密码的列表,slapd 在与 TLS 协商建立连接时可以从中按照降序顺序依次选择。HIGH 的意思是 “所有密钥的长度都大于 128 位”;MEDIUM 表示 “所有密钥的长度都等于 128 位”;+SSLv2 表示 “不管密钥强度如何,所有密码都是以 SSL 协议版本 2 的形式指定的”。

TLSCipherSuite HIGH:MEDIUM:+SSLv2
TLSCACertificateFile /etc/openldap/cacerts/cacert.pem
TLSCertificateFile /etc/openldap/slapdcert.pem
TLSCertificateKeyFile /etc/openldap/slapdkey.pem

将以下内容添加到 LDAP 服务器的第二个配置文件 /etc/openldap/ldap.conf 中:

TLS_CACERTDIR /etc/openldap/cacerts
TLS_REQCERT allow

为了允许从 OpenLDAP 客户机上使用安全连接,需要将以下内容添加到 /etc/openldap/ldap.conf 文件中:

ssl start_tls
tls_checkpeer yes
tls_cacertfile /etc/openldap/cacerts/cacert.pem


回页首

结束语

按照本文给出的提示,我们现在已经使用轻量级目录访问协议(LDAP)构建了一个集中的身份验证系统。我们最初是通过配置 LDAP 服务器来响应对 “dc=ibm,dc=com” 的基本请求开始入手的。我们使用了一组 Perl 脚本来将用户帐号信息迁移到 LDAP 目录中。我们对 Linux 用户帐号服务、PAM 和 NSS 服务进行了修改,从而可以从 LDAP 服务器中检索用户信息。还设置了一个 LDAP 服务器副本作为备用服务器来响应客户机的请求。然后,使用 TLS 协议在 LDAP 客户机和服务器之间对通信进行安全加密。恭喜!

为了参考方便,下面给出了本文中使用的配置文件的完整清单。

清单 18. 本文例子中使用的服务器 /etc/openldap/slapd.conf 文件

#
# See slapd.conf (5) for details on configuration options.
#
include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
include         /etc/openldap/schema/inetorgperson.schema
include         /etc/openldap/schema/nis.schema
loglevel        256
pidfile         /var/run/slapd.pid
argsfile        /var/run/slapd.args
# The next three lines allow use of TLS for encrypting connections.
TLSCipherSuite  HIGH:MEDIUM:+SSLv2
TLSCACertificateFile    /etc/openldap/cacerts/cacert.pem
TLSCertificateFile      /etc/openldap/slapdcert.pem
TLSCertificateKeyFile   /etc/openldap/slapdkey.pem
# access control policy:
# Restrict password access to change by owner and authentication.
# Allow read access by everyone to all other attributes.
access to attrs=shadowLastChange,userPassword
by self write
by * auth
access to *
by * read
#######################################################################
# database definition
#######################################################################
database        bdb
suffix          "dc=ibm,dc=com"
rootdn          "cn=Manager,dc=ibm,dc=com"
rootpw          {MD5}ijFYNcSNctBYg
directory       /var/lib/ldap
# Indices to maintain for this database
index objectClass                       eq,pres
index ou,cn,mail,surname,givenname      eq,pres,sub
index uidNumber,gidNumber,loginShell    eq,pres
index uid,memberUid                     eq,pres,sub
index nisMapName,nisMapEntry            eq,pres,sub
#Replicas of this database
replica host=dhcp64-253.ibm.com:389
binddn="cn=Manager,dc=ibm,dc=com"
credentials=secret
bindmethod=simple
replogfile /var/lib/ldap/replog

清单 19. 本文例子中使用的服务器 /etc/openldap/ldap.conf 文件

#
# LDAP Defaults
#
# See ldap.conf(5) for details
HOST 127.0.0.1
BASE dc=ibm,dc=com
TLS_CACERTDIR /etc/openldap/cacerts
TLS_REQCERT allow

清单 20. 本文例子中使用的客户机 /etc/ldap.conf 文件

a
# @(#)$Id: ldap.conf,v 1.34 2004/09/16 23:32:02 lukeh Exp $
#
# This is the configuration file for the LDAP nameservice
# switch library and the LDAP PAM module.
#
# PADL Software
# http://www.padl.com
#
# Your LDAP server.
# Multiple hosts may be specified, each separated by a
# space.
host dhcp64-233.ibm.com dhcp64-233.ibm.com
# The distinguished name of the search base.
base dc=ibm,dc=com
# OpenLDAP SSL mechanism, start_tls mechanism uses the normal LDAP port 389
ssl start_tls
#Require and verify server certificate
tls_checkpeer yes
# CA certificates for server certificate verification
tls_cacertfile /etc/openldap/cacerts/cacert.pem
pam_password md5

参考资料

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
  • OpenLDAP 主页 是 OpenLDAP 项目的主页。其中包含了有关如何配置 OpenLDAP 的丰富信息,以及将来的路线图和版本信息。请确保阅读 OpenLDAP Software 2.3 Administrator's Guide。
  • 在 OpenSSL Project 中,可以找到有关 SSL 和 TLS 的信息。
  • 在 LDAP Linux HOWTO 中,我们可以找到有关在 Linux 机器上安装、配置、运行和维护 LDAP(Lightweight Directory Access Protocol)服务器的详细信息。请在 LDAP Implementation HOWTO 中阅读使用 pam_ldap 和 nss_ldap 进行 LDAP 身份验证的讨论。
  • PADL 主页 提供了 Perl 迁移脚本 nss_ldap 和 pam_ldap 以及很多其他有用的 LDAP 工具。
  • 在 developerWorks Linux 专区 中可以找到为 Linux 开发人员准备的更多资源。
  • 随时关注 developerWorks 技术活动和网络广播。

获得产品和技术

  • 在您的下一个开发项目中采用 IBM 试用版软件,这可以从 developerWorks 上直接下载。

讨论

  • OpenLDAP 邮件列表 是讨论 OpenLDAP 的主要论坛。
  • 通过参与 developerWorks blogs 加入 developerWorks 社区。

关于作者

Mike O'Reilly 是 IBM Linux 和 VMware ESX 产品支持小组的一员,他为 Linux 产品提供支持已经有 5 年的时间了。另外,他支持 VMware 超过两年的时间,支持 UNIX 超过 10 年的时间。

linux用户带密码迁移 LDAP相关推荐

  1. linux下带密码的scp,linux下带密码的scp

    from linux下带密码的scp (2014-03-10 12:35:46) 背景: 需要将一台机器的数据传输到另外一台机器上,两台机器没有信任关系,没有数据源一方没有ftp或者http,无法进行 ...

  2. linux用户登录报密码不对,Linux用户登录密码的生成

    一.从自动化需求说起 如何生成一个Linux用户登录密码?可能有人会说用passwd生成.的确,passwd命令能够帮助我们重置用户登录密码,但是这并没有解答如何生成一个Linux用户登录密码的疑问. ...

  3. linux 用户及密码

    linux 用户及密码 涉及文件,及各个文件内容详解 涉及文件: /etc/passwd./etc/shadow./etc/group./etc/gshadow /etc/passwd: 属性: -r ...

  4. Linux用户配置密码,linux用户配置文件passwd和密码配置文件shadow,用户管理,组管理...

    一.linux和windows互传文件 1.安装支持包:lrzszyum -y install   lrzszputty工具 不支持lrzsz 2.rz windows文件fail2ban-0.8.1 ...

  5. VMware虚拟机忘记Linux用户登陆密码,重置密码解决办法

    VMware虚拟机安装Linux系统,忘记用户登陆密码怎么解决,可以通过重启VMware虚拟机进入系统操作界面去重置密码,重新修改密码. 下面是详细的操作步骤: 1.点击栏目上的倒三角形,选择重新启动 ...

  6. linux用户密码文件为,Linux用户和密码文件格式详解

    一. /etc/passwd 文件的格式,使用冒号分隔的7段用户账户信息 account:password:UID:GID:GECOS:directory:shell (帐号:密码:用户ID:组ID: ...

  7. linux 用户设密码,linux 上添加用户,设置密码

    linux 下添加用户,设置密码 添加用户: useradd -m $username 修改密码: passwd $username 详细说明: useradd 命令 名 称 useradd - 帐 ...

  8. linux rsync 带密码,Linux配置ssh无密码验证,rsync

    1.我先声明主机 pangzhiminglinux     192.168.200.129 CentOS2           192.168.200.130 方法大概是这样:如果想从pangzhim ...

  9. linux用户取消密码,[Linux]linux下取消用户名和密码直接登录

    假定目前只有root用户,则有如下两种方式可直接登录系统: 方式一: 1. passwd -d root, 但ssh必须要有用户名和密码,所以可以passwd root, 然后输入密码 2. 修改/l ...

最新文章

  1. nginx.conf配置详解
  2. 基于Matlab----MSK调制与解调
  3. HCIE-Security Day12:补充包过滤和安全策略的概念
  4. 局域网共享工具_win10一键共享工具免费版(快速解决局域网文件共享问题)官方版...
  5. Bartender 连接MySql数据库并对模板赋值打印标签二维码
  6. Matlab分析dac模拟信号,[滤波器在音频DAC测试中的应用] 音频滤波器
  7. Redis数据结构之list对象
  8. error: system libzip must be upgraded to version #62= 0.11【问题解决】php7编译zip报错
  9. 区块链软件搭建,区块链平台搭建
  10. 计算机 医学 sci期刊,1分左右医学sci期刊
  11. 优雅的使用windows
  12. 単語ーー下げる(さげる)
  13. C++(标准库):26---STL迭代器之(迭代器的5大种类(输出迭代器、输入迭代器、向前迭代器、双向迭代器、随机访问迭代器))
  14. 虚拟换衣 VITON 论文笔记
  15. 千锋教育+计算机四级网络-计算机网络学习-02
  16. 阿里云扩容云盘(CentOS 7系统)
  17. 程序员都秃顶?Python 创始人笑了,养生还得学这门语言
  18. 软件方向应届生求职面试指导
  19. Aspect @Pointcut切入点解释
  20. 使用idea手搓java计算器

热门文章

  1. 2013\Province_Java_B\1.世纪末的星期
  2. 【Tools】Modbus Poll 9安装详解
  3. 【Qt】数据库实战(三)
  4. [Qt教程] 第22篇 数据库(二)编译MySQL数据库驱动
  5. DocKer linux Centos 安装DocKer 只需要十步
  6. 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题
  7. linux c配置文件书写格式,读取配置文件源代码[linux c]
  8. 高并发C/S的TCP版本golang实现
  9. 四针手表指的是什么_1000~1500元的男士手表推荐
  10. MFC主线程使用WaitForSingleObject阻塞的问题