LDAP集成和迁移Word格式.docx
《LDAP集成和迁移Word格式.docx》由会员分享,可在线阅读,更多相关《LDAP集成和迁移Word格式.docx(43页珍藏版)》请在冰豆网上搜索。
ethers
把以太网地址映射到IP地址。
因为出现了AddressResolutionProtocol(ARP),最近很少使用它了。
group
包含一个组列表以及属于这些组的用户。
hosts
把IP地址映射到主机名。
netgroup
用来把服务器分组在一起。
常常用于NIS和NetworkFileSystem(NFS)安全性。
networks
把网络名映射到数字。
因为了解网络名没有太多的用处,所以不常使用。
passwd
存储用户帐户信息,比如名称、用户id、描述、主组、主目录,有时还包含密码。
protocols
把IP协议映射到它们的名称。
publickey
用来发布NFS和NIS+的密钥。
rpc
把RemoteProcedureCall(RPC)函数名映射到数字。
services
把TCP和UDP服务名映射到端口号。
shadow
受保护的加密的密码文件。
通常把/etc/passwd中的密码字段以加密形式存储在这个文件中。
NSS在/etc/nsswitchconf中进行配置,对于表3中的每个数据库包含一个配置行。
清单1给出一个nsswitch.conf示例。
清单1.nsswitch.conf示例
passwd:
filesnis
shadow:
group:
hosts:
filesnisdns
清单1配置四个映射:
passwd、shadow、group和hosts。
映射名称后面是一个冒号(:
),然后是访问数据的方式的有序列表。
清单1中的前三行是相同的:
它们首先在文件中检查所请求的信息,然后检查NIS(有时候称为黄页)。
只有在文件中没有找到信息时,才会检查NIS。
这个示例的最后一行对于任何主机请求依次检查文件(/etc/hosts)、NIS和DNS。
nsswitch.conf中可用的方法都在/lib中有一个对应的库,这些库以libnss_开头。
例如,适用于文件的功能放在/lib/libnss_files-2.5.so中(版本号并不重要,因为它由动态链接器ld-linux.so解析)。
在NSS中引入LDAP
在讨论了动态库和nsswitch.conf的格式之后,就应该通过共享库libnss_ldap处理LDAP与NSS的集成,并通过/etc/nsswitch.conf中的ldap关键字引用LDAP。
这个共享库从/etc/ldap.conf获得它自己的配置(不要把这个文件与命令行客户机所用的OpenLDAP配置文件/etc/openldap/ldap.conf相混淆)。
清单2给出一个ldap.conf示例。
清单2.一个配置libnss_ldap的ldap.conf示例
#ServerIPaddress(orspace-separatedaddresses)
host192.168.1.138
#Searchbase
basedc=ertw,dc=com
#optional:
bindcredentials
binddn:
cn=nssldap,dc=ertw,dc=com
bindpw:
letmein
#Ifrootismakingtherequest,usethisdninstead
#Thepasswordisstoredin/etc/ldap.secretandonlyreadablebyroot
rootbinddncn=root,dc=ertw,dc=com
#Pointthepasswd,shadow,andgroupdatabasesataDN
#the?
onedefinesthescope
nss_base_passwdou=People,dc=ertw,dc=com?
one
nss_base_shadowou=People,dc=ertw,dc=com?
nss_base_groupou=Group,dc=ertw,dc=com?
#Don'
tlookforsecondarygroupsforanyoftheseusers
nss_initgroups_ignoreusersroot,ldap,named,avahi,haldaemon,dbus,radvd,tomcat,radiusd
除了清单2所示的/etc/ldap.conf的内容之外,还需要在/etc/nsswitch.conf中的passwd、shadow和group行中添加关键字ldap。
一定要确保把files放在第一位;
否则,缓慢的服务器可能导致超时—甚至可能锁住系统(如果由于nsswitch.conf中的问题导致锁住系统,就需要以单用户模式引导,把nsswitch.conf重新设置为files,然后重新引导)。
可以对所有数据库使用LDAP,但是这里列出的三行是最有意义的。
其他映射很少修改,应该单独管理。
例外是hosts数据库,它可以使用LDAP,但是DNS是更好的选择。
测试
如果正确地配置了nsswitch.conf和ldap.conf,那么只要能够使用以下属性,就应该能够用LDAP用户登录:
∙uid:
登录名
∙uidNumber:
数字用户id
∙gidNumber:
主组的数字id
∙homeDirectory:
用户的主目录
∙userPassword:
用户的密码,由{crypt}例程加密(使用slappasswd生成这个加密密码)
通过posixAccount对象类添加这些属性和其他属性。
为了进行测试,以一名属于LDAP树但未保存在本地密码文件的用户身份尝试登录。
还可以使用getentpasswd命令查看NSS了解的所有用户条目。
如果getent是有效的,但是登录不成功,就说明userPassword属性可能不正确。
如果检查了客户机上的配置,NSS和LDAP仍然无法一起工作,就在OpenLDAP服务器上启用stats级日志记录,检查服务器是否看到了查询,以及是否允许这些查询。
回页首
配置PAM来使用LDAP
PAM与NSS的相似之处在于,它从实际实现中抽象出一组库调用。
但是,与NSS不同,PAM并不替换现有的UNIX调用;
而是提供一组新的调用供应用程序使用。
理解PAM
PAM被实现为一个由应用程序使用的库。
应用程序通过调用这个库使用PAM管理函数,比如身份验证、帐户管理、会话管理和密码管理。
检查身份验证是PAM的主要用途。
应用程序向PAM库询问用户是否通过了身份验证。
PAM库按照系统管理员设置的规则,提示用户输入密码或执行其他检查。
在用户提供有效的凭证之后,进行帐户管理,将检查是否允许登录。
在某些时间或者对于某些应用程序,可能会拒绝登录。
会话管理使应用程序在成功登录之后能够设置环境。
常常需要向登录到控制台的用户授予一些额外权限,比如使用本地CDROM或其他设备;
这种操作在会话管理的级别进行。
最后,密码管理提供一种灵活地修改密码的方法。
这个功能允许用户通过熟悉的passwd
(1)程序修改他们的LDAP密码。
PAM密码管理还允许指定独立于密码后端的密码强度策略。
要想为一个服务配置PAM,必须创建一个根据/etc/pam.d中的服务命名的文件,例如为sshd服务创建/etc/pam.d/sshd文件。
这不是一个硬性规则,因为应用程序会指定它自己的PAM服务名。
如果有疑问,可以使用二进制文件的名称,并检查错误日志。
/etc/pam.d中的每个配置文件指定每个PAM管理函数的有序指令列表。
文件中的每行采用“函数控制模块参数”形式。
“函数”是管理函数,使用关键字auth、account、session和password。
“控制”指定如何使用指令的返回值,它是以下关键字之一:
∙required——必须通过这个检查,函数才能成功执行。
如果这个检查失败,PAM就会继续检查给定函数的其他指令,但是结果是没有意义的。
∙requisite——必须通过这个检查,函数才能成功执行。
如果这个检查失败,PAM会停止检查其他指令并返回一个失败。
∙sufficient——如果检查成功,就停止处理,函数成功返回(如果前面“必要的”检查全部成功的话)。
如果检查失败,就忽略这个失败并继续处理。
∙optional——忽略检查的结果。
“模块”和“参数”实现检查本身。
相同的模块可以实现一个或多个函数,所以可能多次看到相同的模块。
常用的一种模块是pam_stack,它允许从其他文件调用指令集。
清单3给出一个使用pam_stack的PAM文件。
清单3.使用pam_stack调用其他指令集
authrequiredpam_nologin.so
authrequiredpam_stack.soservice=system-auth
accountrequiredpam_stack.soservice=system-auth
sessionrequiredpam_stack.soservice=system-auth
passwordrequiredpam_stack.soservice=system-auth
清单3显示了PAM文件的格式。
auth函数有两行,这两个检查都设置为required,因此它们必须都成功,身份验证才会成功。
第一个auth行调用pam_nologin,它的作用是当/etc/nologin文件存在时,如果非根用户试图登录,就会返回失败。
下一个auth行调用pam_stack模块并传递参数service=system-auth。
然后,pam_stack.so会读取/etc/pam.d/system-auth的内容并检查auth函数下的所有指令。
如果这返回成功,pam_stack就向清单3中的文件返回一个成功的结果。
另外三个函数(account、session和password)只引用pam_stack和system-auth服务。
如果system-auth中的对应函数成功地返回,就认为结果是成功的。
许多系统使用同一组身份验证例程,所以在大多数文件中都使用pam_stack,而system-auth(或等效的文件)包含所需的所有函数。
在本节的余下部分中,将使用system-auth文件在PAM过程中注入LDAP。
在PAM引入LDAP
NSS和PAM模块都使用/etc/ldap.conf进行配置,所以如果继续设置,就可以建立一个有效的PAM-LDAP系统。
可以同时使用NSS和PAM,这样就使支持PAM的应用程序和遗留应用程序都能够用LDAP进行身份验证。
PAM在NSS基础上提供了一些新特性,包括:
∙允许用户修改密码
∙对身份验证需求进行更细粒度的配置
∙支持更多的密码加密类型
∙集中地管理用户帐户
确保在/etc/ldap.conf中有pam_passwordmd5,并删除任何其他pam_password行(如果有的话)。
在修改密码时,这种配置让pam_ldap库先在本地用MessageDigest5(MD5)计算密码的散列值,然后把它发送给LDAP服务器。
编辑/etc/pam.d/system-auth(或等效的文件),在其中添加对pam_ldap的引用,见清单4。
这一行应该出现在对pam_unix的任何引用的后面(这使本地帐户优先于LDAP帐户),但是应该出现在对pam_allow和pam_deny的任何引用(它们提供默认允许或拒绝)的前面。
清单4.使用pam_ldap的system-auth
authsufficientpam_unix.sonulloktry_first_pass
authsufficientpam_ldap.souse_first_pass
authrequiredpam_deny.so
accountrequiredpam_unix.sobroken_shadow
accountsufficientpam_ldap.so
accountrequiredpam_permit.so
passwordrequisitepam_cracklib.sotry_first_passretry=3
passwordsufficientpam_unix.somd5shadownulloktry_first_passuse_authtok
passwordsufficientpam_ldap.souse_authtok
passwordrequiredpam_deny.so
sessionrequiredpam_limits.so
sessionrequiredpam_unix.so
sessionoptionalpam_ldap.so
粗体显示的行是PAM配置文件中增加的内容。
注意,在pam_unix的account函数中增加了broken_shadow。
这样的话,如果用户没有影子密码条目(因为用户帐户在LDAP中),pam_unix.so并不会返回失败。
pam_ldap的auth模块的use_first_pass选项要求pam_ldap.so使用从pam_unix.so获得的密码,而不是询问新的密码。
use_authtok对password函数起相似的作用。
对于授权,新的配置使UNIX密码和LDAP密码都足以用来登录:
也就是说,只要第一个密码检查成功,就允许用户登录。
如果这两个检查都返回失败(或“nosuchuser”),那么pam_deny就导致失败。
尝试通过passwd命令修改一个用户的密码,然后检查在LDAP目录中密码是否改变了。
最后,确认用户仍然可以登录。
如果能够使NSS正常工作,PAM也应该没问题。
发生错误最主要的原因是在PAM配置中有拼写错误,把条目放在了错误的文件中,或者把它们放在了文件中错误的位置。
NIS到LDAP的迁移
本节讨论SeniorLevelLinuxProfessional(LPIC-3)考试301的305.2主题的内容。
这个主题的权值为1。
∙在迁移到LDAP之前分析NIS结构
∙在与LDAP集成之前分析NIS结构
∙自动执行NIS到LDAP的迁移
∙创建NIS到LDAP的网关
NIS是对UNIX机器进行集中身份验证的传统方法。
NIS便于设置而且效果很好。
尽管LDAP身份验证要复杂一些,但是它与NIS相比有几方面的优势:
∙LDAP比NIS更安全,因为可以对通信流进行加密并锁住数据库。
∙LDAP可以存储身份验证之外的其他信息,而NIS在这方面功能有限。
∙LDAP比NIS支持更多的客户机访问。
可以用LDAP替代NIS,也可以同时使用它们。
在同时使用它们时,LDAP是标准数据源,而NIS服务器使用来自LDAP(而不是本地文件)的数据。
这种方式很适合比较长期的迁移过程,还适合支持那些无法使用LDAP的遗留操作系统。
方式1:
迁移到LDAP
从NIS迁移到LDAP的一般过程如下:
1.判断需要替换哪些NIS数据库。
2.把NIS数据装载到LDAP中。
3.重新配置客户机,让它们使用LDAP而不是NIS。
从步骤2开头到步骤3结束之间,有两个活动的数据库,但是它们之间没有连接。
任何修改(比如添加用户名或修改用户的密码)必须在两个数据库中进行;
否则,数据就会不一致。
可以选择冻结所有修改,也可以使用下一节所讨论的集成策略。
分析现有的NIS结构
在执行任何迁移之前,必须判断NIS托管哪些数据库。
登录到NIS主服务器,查看数据库目录。
在大多数系统上,这些文件存储在/var/yp/中与域名相同的目录中。
清单5显示典型的NIS服务器数据库目录中的文件。
清单5.判断NIS使用哪些数据库
#ls/var/yp/`domainname`
group.bygid
group.byname
hosts.byaddr
hosts.byname
mail.aliases
netid.byname
passwd.byname
passwdbyuid
protocols.byname
protocols.bynumber
rpc.byname
rpc.bynumber
services.byname
services.byservicename
ypservers
清单5使用domainname命令显示域名。
如果放在反撇号(`)中,这个命令的结果就被插入命令行中。
除了ypservers文件之外,这个目录中的其他所有文件都代表一个NIS数据库。
通过收集惟一数据库名的列表,就可以判断出需要把哪些数据库迁移到LDAP。
NIS用不同的搜索键存储相同的数据,比如密码文件有按名称和UID两种搜索方式;
在这种情况下,它们都代表密码数据库。
有些文件与数据库的对应关系并不明显:
例如,mail.aliases是别名表。
如果有疑问,可以查看/var/yp/Makefile。
查看服务器之后,可能希望查看一些NIS客户机,了解它们使用哪些映射。
为此,应该在/etc/nsswitch.conf中查找nis关键字。
您可能会发现,服务器存储的映射比使用的映射多。
使用迁移工具
对于把NIS数据迁移到LDAP,最流行的工具是由PADLsoftware提供的,这家公司是pam_ldap、nss_ldap和NIS-LDAP网关的开发商。
您的发行版很可能包含这些工具;
如果没有,可以在参考资料一节中找到这些工具的链接。
PADL迁移工具可以从本地文件、NIS或NIS+获取数据,然后把数据转储到LDAP服务器上。
在使用PADL工具之前,必须启动LDAP服务器并在无数据的情况下运行。
工具会生成所需的所有条目;
为了避免出现重复的条目,LDAP服务器中不应该有数据。
迁移工具由一组shell和perl脚本组成。
在RedHat系统上,这些脚本在openldap-servers包中,可以在/usr/share/openldap/migration目录中找到。
Debian用户需要migrationtools包。
请查找migrate_base.pl文件,或者从PADL下载最新版本。
这些脚本从各种数据源获得数据,把数据转换为LDIF,然后把数据添加到服务器中。
可以用ldapadd命令以在线模式添加数据,也可以通过slapadd以离线模式添加数据,前者需要管理员凭证,后者需要停止LDAP进程。
在开始之前,有必要设置一些环境变量,从而设置树的基域名(DN)和根DN。
清单6给出准备迁移到域所用的bash命令。
清单6.设置环境变量,准备LDAP迁移
exportLDAP_BASEDN="
dc=ertw,dc=com"
exportLDAP_BINDDN="
cn=root,dc=ertw,dc=com"
exportLDAP_DEFAULT_MAIL_DOMAIN=
清单6的第一行是LDAP树的基DN,使用这个DN生成后面的所有DN。
第二行是根DN。
只有在使用在线模式时,才需要密码。
清单6的最后一行设置电子邮件地址的默认域名。
一些工具不提示输入这一信息,所以现在设置它以避免麻烦。
工具分为两类。
第一类中的文件的名称以migrate_all_开头。
其他文件属于第二类,它们的名称以migrate_开头,后面是文件名或数据库名。
第一类中的脚本用来收集数据;
第二类中的脚本用来把原来的格式转换为LDIF。
现在可以采用两种方式。
可以使用migrate_all_脚本之一,它