版权所有IBM公司2008商标LPI301考试准备,主题305:集成和迁移第1页,共35LPI301考试准备,主题305:集成和迁移资深Linux专业人员(LPIC-3)SeanWalberg网络工程师自由职业2008年5月12日在本教程中,SeanWalberg帮助您准备LinuxProfessionalInstituteSeniorLevelLinuxProfessional(LPIC-3)考试.
这个系列共有六篇教程,本教程是第五篇,Sean介绍LDAP与系统的登录和应用程序的集成.
还详细描述了服务器与外部MicrosoftActiveDirectory的集成过程.
查看本系列更多内容开始之前了解这些教程所讨论的内容,并从这些教程中获得最大收益.
关于本系列LinuxProfessionalInstitute(LPI)对Linux系统管理员的认证分为三级:初级(也称为"认证级别1")、中级(也称为"认证级别2")和高级(也称为"认证级别3").
要获得认证级别1,您必须通过101和102考试;要获得认证级别2,您必须通过201和202考试.
要获得认证级别3,您必须已经获得中级认证,并通过301考试("core").
在高级认证中,可能还要通过其他专业考试.
developerWorks提供教程来帮助您准备初级、中级和高级认证的5门考试.
每门考试包含几个主题,每个主题在developerWorks上都有一个对应的自学教程.
表1列出LPI301考试的6个主题和对应的developerWorks教程.
表1.
LPI301考试:教程和主题LPI301考试主题developerWorks教程教程摘要主题301LPI301考试准备:概念、体系结构和设计学习LDAP的概念和体系结构,了解如何设计和实现LDAP目录,以及模式.
主题302LPI301考试准备:安装和开发学习如何安装、配置和使用OpenLDAP软件.
主题303LPI301考试准备:配置学习如何配置OpenLDAP软件.
developerWorksibm.
com/developerWorks/cn/LPI301考试准备,主题305:集成和迁移第2页,共35主题304LPI301考试准备:使用学习如何搜索目录和使用OpenLDAP工具.
主题305LPI301考试准备:集成和迁移(本教程)了解如何使用LDAP作为系统和应用程序的数据源.
参见下面详细的目标.
主题306LPI301考试准备:容量计划即将推出.
要想通过考试301(并获得认证级别3),您应该:应该具有在许多计算机上针对各种用途安装和维护Linux的多年经验.
应该具有不同技术和操作系统的集成经验.
具备企业级Linux专业人员的经验(或者受过相关培训),包括作为其他角色从事企业级Linux管理的经验.
应该掌握高级和企业级的Linux管理,包括安装、管理、安全性、故障诊断和维护.
应能够使用开源工具评估容量计划和解决资源问题.
应该具有使用LDAP集成UNIX服务和MicrosoftWindows服务的专业经验,包括Samba、PluggableAuthenticationModules(PAM)、电子邮件和MicrosoftActiveDirectory目录服务.
应该能够使用Samba和LDAP计划、设计、构建和实现一个完整的环境,还可以评估服务的容量计划和安全性.
应该能够用Bash或Perl创建脚本,或至少了解一种系统编程语言(比如C语言).
要想继续准备认证级别3,请阅读针对LPI301考试的系列developerWorks教程,以及所有的developerWorksLPI教程.
LinuxProfessionalInstitute不为任何第三方考试准备资料或技术做担保.
关于本教程欢迎阅读"集成和迁移",这是针对LPI301考试而设计的6篇教程中的第5篇.
在本教程中,学习LDAP与身份验证和其他UNIX服务的集成.
本教程是按照这个主题的LPI目标组织的.
一般来讲,权值越高的学习目标,考试中涉及到的内容就越多.
如表2所示.
目标表2给出本教程的详细目标.
表2.
集成和迁移:本教程中涉及的考试目标LPI考试目标目标权值目标摘要305.
1LDAP与PAM和NSS的集成2集成核心系统身份验证和LDAP.
305.
2NIS到LDAP的迁移1计划和实现NIS迁移策略,包括把NIS部署到LDAP网关上.
305.
3LDAP与UNIX服务的集成1使用LDAP服务器作为SSH、FTP、HTTP和其他服务的数据源.
ibm.
com/developerWorks/cn/developerWorksLPI301考试准备,主题305:集成和迁移第3页,共35305.
4LDAP与Samba的集成1使用LDAP服务器作为Samba的数据源.
305.
5LDAP与ActiveDirectory的集成2结合使用LDAP服务器和ActiveDirectory服务.
305.
6LDAP与电子邮件服务的集成1集成电子邮件服务与LDAP目录.
先决条件要从本教程获得最大收益,应具有Linux的高级知识和一个能正常运行的Linux系统,在此系统上练习本文所涉及的命令.
如果您对基本Linux技能比较生疏,可以先复习LPIC-1和LPIC-2考试教程.
不同版本的程序可能产生不同格式的输出,因此您的结果可能看起来与本教程中的清单和插图不太一样.
系统要求要执行本教程中的示例,您需要一个带有OpenLDAP包并支持PAM的Linux工作站.
大多数现代发行版都能满足这些要求.
LDAP与PAM和NSS的集成本节讨论SeniorLevelLinuxProfessional(LPIC-3)考试301的305.
1主题的内容.
这个主题的权值为2.
在本节中,学习:配置NSS以从LDAP获取信息配置PAM使用LDAP进行身份验证在各种UNIX环境中配置PAM模块按照传统的UNIX方式,PAM和NameServiceSwitch(NSS)工具对各种身份验证组件进行抽象并对它们的实现进行查找,这使管理员能够改变后端数据存储,而不必重新编译应用程序.
例如,可以透明地把传统的基于/etc/passwd的身份验证改为NetworkInformationService(NIS),因为NSS被实现为C库的一部分.
应用程序使用标准的库调用(比如getpwent(3))查找用户,但是通过一些配置,可以把数据重定向给NIS等其他数据存储.
PAM有点儿特殊,在编写应用程序时必须考虑到PAM.
管理员可以使用许多库定制支持PAM的应用程序行为,例如要求特定的组成员关系和登录时间,这样才能成功通过身份验证.
可以结合使用PAM和NSS执行用户身份验证.
支持PAM的应用程序指示PAM检查用户的凭证.
管理员可以把PAM配置为通过NSS工具检查密码,还可以设置任何其他限制.
PAM只用于密码和影子数据库,不能用于组和主机等其他内容.
LDAP对PAM和NSS的支持由PADL软件的一个开放源码包提供.
developerWorksibm.
com/developerWorks/cn/LPI301考试准备,主题305:集成和迁移第4页,共35配置NSS以使用LDAPNSS工具在C库中实现,它作为用来获取信息的传统库调用的钩子.
这个C库提供getpwent(用来获取用户信息)和gethostbyname(3)(用来获取主机信息),它们通常分别搜索/etc/passwd和/etc/hosts.
通过配置NSS,管理员可以要求主机名搜索也使用DomainNameService(DNS),而应用程序并不知道这一变化.
理解NSS表3描述NSS处理的数据库.
大多数数据库在/etc中有一个对应的文件,这是存储数据的传统位置.
表3.
NSS数据库数据库名描述aliasessendmail的邮件别名,用来把(别名)一个本地地址转发给另一个地址.
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:filesnisshadow:filesnisgroup:filesnishosts:filesnisdns清单1配置四个映射:passwd、shadow、group和hosts.
映射名称后面是一个冒号(:),然后是访问数据的方式的有序列表.
清单1中的前三行是相同的:它们首先在文件中检查所请求的信息,然后检查NIS(有时候称为黄页).
只有在文件中没有找到信息时,才会检查NIS.
这个示例的最后一行对于任何主机请求依次检查文件(/etc/hosts)、NIS和DNS.
ibm.
com/developerWorks/cn/developerWorksLPI301考试准备,主题305:集成和迁移第5页,共35nsswitch.
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#Searchbasebasedc=ertw,dc=com#optional:bindcredentialsbinddn:cn=nssldap,dc=ertw,dc=combindpw:letmein#Ifrootismakingtherequest,usethisdninstead#Thepasswordisstoredin/etc/ldap.
secretandonlyreadablebyrootrootbinddncn=root,dc=ertw,dc=com#Pointthepasswd,shadow,andgroupdatabasesataDN#theonedefinesthescopenss_base_passwdou=People,dc=ertw,dc=comonenss_base_shadowou=People,dc=ertw,dc=comonenss_base_groupou=Group,dc=ertw,dc=comone#Don'tlookforsecondarygroupsforanyoftheseusersnss_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:数字用户idgidNumber:主组的数字idhomeDirectory:用户的主目录userPassword:用户的密码,由{crypt}例程加密(使用slappasswd生成这个加密密码)通过posixAccount对象类添加这些属性和其他属性.
为了进行测试,以一名属于LDAP树但未保存在本地密码文件的用户身份尝试登录.
还可以使用getentpasswd命令查看NSS了解的所有用户条目.
如果getent是有效的,但是登录不成功,就说明userPassword属性可能不正确.
developerWorksibm.
com/developerWorks/cn/LPI301考试准备,主题305:集成和迁移第6页,共35如果检查了客户机上的配置,NSS和LDAP仍然无法一起工作,就在OpenLDAP服务器上启用stats级日志记录,检查服务器是否看到了查询,以及是否允许这些查询.
配置PAM来使用LDAPPAM与NSS的相似之处在于,它从实际实现中抽象出一组库调用.
但是,与NSS不同,PAM并不替换现有的UNIX调用;而是提供一组新的调用供应用程序使用.
理解PAMPAM被实现为一个由应用程序使用的库.
应用程序通过调用这个库使用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文件.
ibm.
com/developerWorks/cn/developerWorksLPI301考试准备,主题305:集成和迁移第7页,共35清单3.
使用pam_stack调用其他指令集authrequiredpam_nologin.
soauthrequiredpam_stack.
soservice=system-authaccountrequiredpam_stack.
soservice=system-authsessionrequiredpam_stack.
soservice=system-authpasswordrequiredpam_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引入LDAPNSS和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的任何引用(它们提供默认允许或拒绝)的前面.
developerWorksibm.
com/developerWorks/cn/LPI301考试准备,主题305:集成和迁移第8页,共35清单4.
使用pam_ldap的system-authauthsufficientpam_unix.
sonulloktry_first_passauthsufficientpam_ldap.
souse_first_passauthrequiredpam_deny.
soaccountrequiredpam_unix.
sobroken_shadowaccountsufficientpam_ldap.
soaccountrequiredpam_permit.
sopasswordrequisitepam_cracklib.
sotry_first_passretry=3passwordsufficientpam_unix.
somd5shadownulloktry_first_passuse_authtokpasswordsufficientpam_ldap.
souse_authtokpasswordrequiredpam_deny.
sosessionrequiredpam_limits.
sosessionrequiredpam_unix.
sosessionoptionalpam_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相比有几方面的优势:ibm.
com/developerWorks/cn/developerWorksLPI301考试准备,主题305:集成和迁移第9页,共35LDAP比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.
bygidgroup.
bynamehosts.
byaddrhosts.
bynamemail.
aliasesnetid.
bynamepasswd.
bynamepasswdbyuidprotocols.
bynameprotocols.
bynumberrpc.
bynamerpc.
bynumberservices.
bynameservices.
byservicenameypservers清单5使用domainname命令显示域名.
如果放在反撇号(`)中,这个命令的结果就被插入命令行中.
除了ypservers文件之外,这个目录中的其他所有文件都代表一个NIS数据库.
通过收集惟一数据库名的列表,就可以判断出需要把哪些数据库迁移到LDAP.
NIS用不同的搜索键存储相同的数据,比如密码文件有按名称和UID两种搜索方式;在这种情况下,它们都代表密码数据库.
有些文件与数据库的对应关系并不明显:例如,mail.
aliases是别名表.
如果有疑问,可以查看/var/yp/Makefile.
developerWorksibm.
com/developerWorks/cn/LPI301考试准备,主题305:集成和迁移第10页,共35查看服务器之后,可能希望查看一些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给出准备迁移到ertw.
com域所用的bash命令.
清单6.
设置环境变量,准备LDAP迁移exportLDAP_BASEDN="dc=ertw,dc=com"exportLDAP_BINDDN="cn=root,dc=ertw,dc=com"exportLDAP_DEFAULT_MAIL_DOMAIN=ertw.
com清单6的第一行是LDAP树的基DN,使用这个DN生成后面的所有DN.
第二行是根DN.
只有在使用在线模式时,才需要密码.
清单6的最后一行设置电子邮件地址的默认域名.
一些工具不提示输入这一信息,所以现在设置它以避免麻烦.
工具分为两类.
第一类中的文件的名称以migrate_all_开头.
其他文件属于第二类,它们的名称以migrate_开头,后面是文件名或数据库名.
第一类中的脚本用来收集数据;第二类中的脚本用来把原来的格式转换为LDIF.
现在可以采用两种方式.
可以使用migrate_all_脚本之一,它会自动地从所选位置(NIS、文件、NIS+m等等)获取所有通用数据库;也可以只获取相关数据,并使用单独的迁移脚本把数据转换为LDIF.
第一种方式比较简单.
清单7演示如何使用migrate_all_nis_online.
sh以在线模式把所有NIS数据迁移到LDAP.
清单7.
使用migrate_all_nis_online.
sh脚本把NIS数据迁移到LDAP[root@server1migration]#.
/migrate_all_nis_online.
shEntertheNISdomaintoimportfrom(optional):Nosuchmapnetworks.
byaddr.
Reason:InternalNISerrorEnterthehostnameofyourLDAPserver[ldap]:localhostibm.
com/developerWorks/cn/developerWorksLPI301考试准备,主题305:集成和迁移第11页,共35Enterthecredentialstobindwith:mypasswordDoyouwishtogenerateaDUAConfigProfile[yes|no]noImportingintodc=ertw,dc=com.
.
.
Creatingnamingcontextentries.
.
.
Migratinggroups.
.
.
Migratinghosts.
.
.
Migratingnetworks.
.
.
Migratingusers.
.
.
Migratingprotocols.
.
.
Migratingrpcs.
.
.
Migratingservices.
.
.
Migratingnetgroups.
.
.
Migratingnetgroups(byuser).
.
.
sh:/etc/netgroup:NosuchfileordirectoryMigratingnetgroups(byhost).
.
.
sh:/etc/netgroup:Nosuchfileordirectoryaddingnewentry"dc=ertw,dc=com"ImportingintoLDAP.
.
.
addingnewentry"ou=Hosts,dc=ertw,dc=com".
.
.
.
.
outputomitted.
.
.
addingnewentry"cn=rquotad,ou=Rpc,dc=ertw,dc=com"addingnewentry"cn=rquotad,ou=Rpc,dc=ertw,dc=com"ldap_add:Alreadyexists(68)/usr/bin/ldapadd:returnednon-zeroexitstatus:savingfailedLDIFto/tmp/nis.
ldif.
X17515清单7首先运行migrate_all_nis_onlinesh脚本,这个脚本从NIS获取数据,把数据转换为LDIF,然后使用ldapadd导入数据.
脚本的第一个提示是NIS域;可以按Enter表示采用系统上的默认NIS域.
然后,脚本导入NIS数据(在这个系统上,因为没有使用网络映射,会显示一个不太严重的错误).
脚本提示输入关于LDAP服务器的信息,比如主机名和密码(绑定DN和基DN通过清单6中输入的环境变量获得).
应该选择不导入DUAConfigProfile,除非有支持它的模式,而这是不可能的.
如果此时遇到由于无效DN语法造成的错误,那么要确定已经在slapd.
conf中导入了nis.
schema文件.
如果模式是正确的,脚本就会把数据导入LDAP树.
脚本可能由于清单7末尾这样的错误而终止.
由于NIS中存储数据的方式,在一些数据库中可能有重复的条目.
这种情况对于NIS没关系,但是在LDAP中就会造成问题.
根据您的需要,这个问题有几个解决方案:编辑LDIF文件(这个示例中的/tmp/nis.
ldif.
X17515),删除重复的条目,然后删除LDAP数据库并导入文件.
用-c选项让ldapadd忽略错误.
exportLDAPADD="/usr/bin/ldapadd-c"命令可以实现这个目标(注意,脚本仍然会报告错误,但是数据会顺利地导入).
编辑migrate_all_nis_online.
sh,把ETC_SERVICES、ETC_PROTOCOLS和ETC_RPC设置为/dev/null而不是临时文件.
这么做就会跳过数据库处理(注意,一些migrate_all_脚本可以被环境变量覆盖,而不是NIS变量).
跳过migrate_all_nis_online.
sh并执行手工迁移.
前三种方法不需要解释,只要您对结果满意(比如第三种方法没有LDAP中的协议、RPC和服务),就可以采用.
第四种方法需要解释一下.
developerWorksibm.
com/developerWorks/cn/LPI301考试准备,主题305:集成和迁移第12页,共35如果您只想把组和用户迁移到LDAP中,那么只需复制文件本身并使用提供的其他脚本生成LDIF,并使用ypcat从NIS获取数据.
清单8显示这个过程.
清单8.
手工迁移组和用户[root@server1migration]#ypcatpasswd>/tmp/passwd.
tmp[root@server1migration]#ypcatgroup>/tmp/group.
tmp[root@server1migration]#.
/migrate_base.
pl>/tmp/ldif[root@server1migration]#.
/migrate_passwd.
pl/tmp/passwd.
tmp>>/tmp/ldif[root@server1migration]#.
/migrate_group.
pl/tmp/group.
tmp>>/tmp/ldif[root@server1migration]#ldapadd-x-D"cn=root,dc=ertw,dc=com"\-w"mypassword"-f/tmp/ldifaddingnewentry"dc=ertw,dc=com"addingnewentry"ou=Hosts,dc=ertw,dc=com".
.
.
.
.
outputomitted.
.
.
清单8的前两行使用ypcat从NIS获取数据并放到/tmp中的一个文件中.
下面三行生成LDIF.
migrate_base在树中生成一些基本条目,后两行把密码和组文件转换为LDIF.
注意,这里使用追加操作符(>>),所以产生的文件将包含三个迁移脚本的输出.
最后,调用ldapadd导入数据.
无论采用哪种方法,都应该执行一些基本的搜索,确保可以看到数据.
确定可以看到密码的散列值(应该使用根DN,因为访问控制列表可能禁止看到密码).
现在,NIS数据已经放到LDAP中了.
在所有NIS客户机都迁移完毕之前,对NIS的所有修改都必须复制到LDAP中,反之亦然.
迁移客户机和检查结果迁移客户机很简单,只需在客户机上设置NSS和PAM.
前一节详细讨论过这个过程.
简单地说,用服务器信息填充/etc/ldap.
conf,并编辑/etc/nsswitch.
conf,把nis替换为ldap.
如果设置PAM,那么需要编辑/etc/pam.
d中的相关文件,添加对pam_ldap.
so的引用.
测试客户机的方法是,作为常规用户登录客户机,并对迁移到LDAP的数据库运行getent命令.
方式2:与LDAP集成第二种方式是让NIS和LDAP共存.
如果您有无法与LDAP通信的客户机(由于没有本机LDAP模块或由于不支持PAM),或者如果迁移的过渡期很长,那么这种方式会很有帮助.
NIS/LDAP共存方式与第一种策略相似:1.
判断正在使用哪些NIS数据库.
2.
把NIS数据装载到LDAP中.
3.
把NIS服务器替换为ypldapd.
4.
重新配置将使用LDAP的客户机.
继续使用NIS的客户机不需要修改,因为ypldapd是一种功能完整的NIS服务器.
它与操作系统附带的标准ypserv之间的惟一差异是,ypldapd从LDAP而不是本地文件获取数据.
前两个步骤与第一种方式相同,所以我们从步骤3开始.
ibm.
com/developerWorks/cn/developerWorksLPI301考试准备,主题305:集成和迁移第13页,共35把NIS服务器替换为ypldapdypldapd是一个NIS服务器守护进程,它从LDAP而不是/var/yp中的数据库文件获取数据.
它是PADL提供的商业软件,但是通过向PADL发电子邮件,可以获得30天试用许可证(参见参考资料).
安装ypldapd很简单:1.
把软件解压到/opt/ypldapd.
2.
把许可证复制到/opt/ypldapd/etc/padlock.
ldif.
3.
编辑配置文件/opt/ypldapd/etc/ypldapd.
conf.
4.
停止现有的NIS服务器.
5.
启动ypldapd.
首先,作为根用户运行mkdir-p/opt/ypldapd,生成ypldapd目录(如果/opt不存在的话,还会创建/opt).
进入这个目录(cd/opt/ypldapd),用tar-xzf/tmp/ypldapd_linux-i386.
tar.
gz对ypldapd发行版进行解压.
这会把ypldapd文件放在适当的目录中.
您应该已经获得了一个许可证文件,将把它放在/opt/ypldapd/etc/padlock.
ldif中.
如果从电子邮件复制许可证,应该确保电子邮件客户机没有对较长的行进行换行:密钥应该是四行,包含一系列attribute:value对.
ypldapd的配置在/opt/ypldapd/etc/ypldapd.
conf文件中.
这里有一个ypldapd.
conf.
sample文件,可以首先对它执行复制.
与前面看到的其他实用程序一样,需要提供关于LDAP服务器的信息.
清单9给出一个简单的ypldapd.
conf文件.
清单9.
ypldapd.
conf示例#TheNISdomainnameypdomainertw#TheLDAPserverandbaseDNldaphostlocalhostbasedndc=ertw,dc=com#Credentials.
.
.
TheusermustbeabletoreadtheuserPasswordattributebinddncn=ypldapd,dc=ertw,dc=combindcredmypassword#ThemapofNISdatabasestoDNs(relativetobasedn)#Ifyouusedthemigrationtoolsthenyoushouldn'thavetochangeanythingnamingcontextsnamingcontexts.
conf#Shouldypldapdcachedatacachingon#Cachelifetime,inminutescache_dump_interval15#Shouldpasswordsbehiddenhide_passwordsoff#Howmanyypldapdserverscanberunningatagiventimemaxchildren5ypldapd.
conf就绪之后,就可以关闭ypserv的所有实例,然后运行sbin/ypldapd,它会在后台启动ypldapd.
迁移客户机并检查结果为了测试新的NIS服务器,运行ypwhich,它会报告绑定的NIS服务器.
如果遇到错误,那么要确认没有其他ypserv实例正在运行,只有一个ypldapd正在运行.
然后通过输入ypcatpasswd获取映射(这假设服务器也正在运行一个客户机).
developerWorksibm.
com/developerWorks/cn/LPI301考试准备,主题305:集成和迁移第14页,共35仍然使用NIS的客户机应该也能够对新服务器运行ypwhich和ypcat.
对于要迁移到LDAP的客户机,请参考前面的迁移说明.
LDAP与UNIX服务的集成本节讨论SeniorLevelLinuxProfessional(LPIC-3)考试301的305.
3主题的内容.
这个主题的权值为1.
在本节中,学习:集成SSH与LDAP集成FTP与LDAP集成HTTP与LDAP集成FreeRADIUS与LDAP集成打印服务与LDAP如果配置了NSS和PAM,那么大多数应用程序都会正确地使用LDAP.
需要通知某些应用程序使用PAM,或者通过访问LDAP提供更多功能.
本节主要讨论常用的UNIX守护进程以及它们如何支持LDAP集成.
集成SSH与LDAPOpenSSH发行版通过PAM与LDAP集成,前提是这个功能已经进行过编译.
检查方法是运行ldd/usr/sbin/sshd|greppam,查看是否链接了PAM共享库.
如果没有,就必须用--with-pam重新编译sshd.
要想使用PAM,一定要有PAM配置文件/etc/pam.
d/sshd.
清单10给出一个使用system-auth栈的PAM配置文件示例.
清单10.
/etc/pam.
d/system-auth示例authrequiredpam_stack.
soservice=system-authaccountrequiredpam_stack.
soservice=system-authpasswordrequiredpam_stack.
soservice=system-authsessionrequiredpam_stack.
soservice=system-authPAM配置文件就绪之后,就可以配置sshd,让它使用PAM.
在/etc/ssh/sshd_config中,添加UsePAMyes并重新启动sshd.
集成FTP与LDAP有许多种FTP守护进程,LPIC3考试并没有明确指定使用哪一种.
最简单的集成方法是依靠NSS集成.
当FTP服务器执行密码搜索时,NSS工具会使用LDAP.
但是,在现代系统中,FTP服务器很可能内置了PAM支持.
在这些情况下,要在/etc/pam.
d中创建PAM配置文件.
这个文件常常称为ftp,但是在不同的软件和发行版中名称可能不同.
例如,在RedHat包中,vsftpd守护进程使用/etc/pam.
d/vsftpd而不是默认的/etc/pam.
d/ftp.
ibm.
com/developerWorks/cn/developerWorksLPI301考试准备,主题305:集成和迁移第15页,共35当ftp守护进程找到它的PAM配置文件之后,就会像其他PAM客户机一样处理PAM.
可以使用清单10所示的配置.
还可以考虑在auth中使用pam_listfile.
soitem=usersense=denyfile=/etc/ftpusersonerr=succeed和pam_shells,从而像传统FTP服务器一样,限制可以登录的用户和有效的shell.
集成HTTP与LDAPApacheWeb服务器包含用LDAP后端处理基本HTTP身份验证的模块,而不是使用传统的基于htpasswd文件的后端.
这种功能是通过mod_authnz_ldap和mod_ldap模块提供的.
第一个模块提供使用LDAP信息验证Web用户身份的机制,而mod_ldap为mod_authnz_ldap(和未来任何基于LDAP的模块)提供一个访问LDAP的接口,包括连接池和缓存.
本节中的说明针对Apache2.
2.
如果您使用的是Apache2.
0,那么应该使用mod_auth_ldap模块而不是mod_authnz_ldap.
这两个模块的配置方法是相似的.
mod_ldap和mod_authnz_ldap模块都是Apache发行版的组成部分.
如果您手工编译Web服务器,就需要在configure命令中添加--enable-authnz-ldap--enable-ldap.
如果使用发行版中的Apache版本,就要安装适当的模块(对于RedHat发行版,这些模块在核心httpd包中).
当用户请求一个受保护的资源时,Apache返回一个错误码401(未授权).
此时,Web浏览器应该提示用户输入用户名和密码.
然后,Web浏览器重新发出请求,并在Authorization头中编码用户名和密码.
如果Web服务器接受了用户名和密码,就把请求的页面发送给客户机;否则,服务器再次返回401.
如果配置为通过LDAP检查密码,Apache首先作为一个预定义的用户绑定到服务器,并对用户执行搜索以查找DN.
然后,服务器用这个用户和提供的密码重新绑定.
如果服务器可以成功地作为这个用户绑定,就认为身份验证成功了.
身份验证成功之后,服务器可以执行其他授权任务,比如检查DN或属性,或者检查用户是否传递了搜索过滤器.
如果配置了这些检查,检查必须顺利通过,才可以执行授权.
mod_authnz_ldap的配置与使用文本文件的标准身份验证方法相似.
清单11给出最简单的LDAP身份验证配置,其中不包含授权.
清单11.
LDAP身份验证的Apache配置LoadModuleldap_modulemodules/mod_ldap.
soLoadModuleauthnz_ldap_modulemodules/mod_authnz_ldap.
soAuthTypebasicAuthNameProtectedByLDAPAuthBasicProviderldapAuthLDAPUrlldap://192.
168.
1138/ou=People,dc=ertw,dc=comuid#Anonbindforfirstphase#AuthLDAPBindDN#AuthLDAPBindPasswordAuthzLDAPAuthoritativeoffrequirevalid-userdeveloperWorksibm.
com/developerWorks/cn/LPI301考试准备,主题305:集成和迁移第16页,共35清单11的前两行把所需的模块装载到Web服务器中.
配置的其余部分包含在一个Location容器中,这意味着它只应用于以/protected开头的请求.
配置首先声明Basic身份验证和名称ProtectedByLDAP.
Web浏览器会向用户显示这个名称.
AuthBasicProvider行告诉Apache身份验证是通过LDAP提供的.
然后是AuthLDAPUrl,这向Apache指出LDAP服务器.
参数的形式是ldap://host:port/basednattributescopefilter.
host和port定义LDAP服务器,basedn是开始执行初始搜索的基DN.
attribute是在初始搜索期间与用户名一起搜索的属性(默认属性是uid).
scope是one或sub,分别表示一级元素或所有子元素.
filter是一个可选的过滤器,它与给定的用户/属性组合形成逻辑AND关系.
清单11中的示例把AuthLDAPBindDN和AuthLDAPBindPassword注释掉了,这会导致匿名绑定.
也可以在这里指定一个用户.
无论采用哪种方式,执行初始绑定的用户必须能够搜索AuthLDAPUrl命令中提供的属性.
最后两行允许任何有效用户,从而禁用授权.
AuthzLDAPAuthoritativeoff意味着,即使LDAP拒绝授权(但是不拒绝身份验证),后续模块仍然可以允许访问.
requirevalid-user来自另一个模块,所以需要实现这种延迟.
如果不使用这两行,可以使用与LDAP相关的配置,比如检查组成员关系或LDAP属性.
清单12给出清单11的部分配置,但是它把访问限制在具有ou=Engineering属性和值的用户.
清单12.
限制对特定OU的访问AuthzLDAPAuthoritativeonrequireldap-filterou=engineering在清单12中要注意两点.
首先,现在打开了AuthzLDAPAuthoritative(这是默认设置),这是因为您的需求可以由LDAP模块处理.
第二,ldap-filter不包含圆括号.
Apache使用给定的LDAP过滤器,与uid(或AuthLDAPUrl命令中指定的属性)执行逻辑AND,用简单的字符串插入操作构建搜索过滤器.
如果在您的过滤器中添加额外的引号或圆括号,产生的查询就会变得无效.
身份验证会失败,并在服务器的error_log中记录一条日志消息.
集成FreeRADIUS与LDAPFreeRADIUS是一种开放源码的RemoteAuthenticationDialInUserService(RADIUS)服务器,常常用于拨号或其他网络设备的身份验证.
客户机使用RADIUS验证用户的身份,RADIUS服务器进而使用LDAP查找信息.
可以按照两种方式集成PAM和FreeRADIUS:使用PAM,或者通过rlm_ldap模块启用本机LDAP支持.
应该根据您计划如何使用RADIUS来做出选择.
如果只需要身份验证,或者不希望修改LDAP模式,那么应该使用PAM.
如果需要使用RADIUS属性,那么更容易的方法是配置LDAP模块并把属性存储在LDAP中(RADIUS允许服务器向要求身份验证的设备发送配置细节,因此可以为不同的用户提供不同的服务).
对于PAM模式,一定要像其他系统一样为LDAP设置PAM.
FreeRADIUS的PAM配置文件是/etc/pam.
d/radiusd.
可以以FreeRADIUS附带的默认配置文件作为起点,取消radiusd.
conf的ibm.
com/developerWorks/cn/developerWorksLPI301考试准备,主题305:集成和迁移第17页,共35authenticate部分中pam关键字的注释标志.
接下来,编辑用户文件并查找DEFAULTAuth-Type=System.
把System关键字改为PAM.
重新启动radiusd.
本机LDAP模块rlm_ldap比较复杂一些.
首先,必须在系统上安装FreeRADIUS,使用rlm_ldap模块进行构建(--enable-ldap).
构建FreeRADIUS的方法与大多数其他包相似,所以不在这里讨论.
如果您的Linux发行版包含FreeRADIUS,那么它很可能包含LDAP模块.
FreeRADIUS在一个称为openldap.
schema的文件中包含一个LDAP模式.
把这个文件复制到/etc/openldap/schema/freeradius.
schema中,并通过slapd.
conf中的include指令把它导入OpenLDAP中.
这个模式提供几个属性和两个对象类.
对象类之一是radiusprofile;它用于将用RADIUS执行身份验证的任何用户.
radiusprofile是一个任意的对象类,因此可以应用于任何条目.
radiusObjectProfile是一个结构化对象类,用来创建radius配置文件的容器;它对于操作是不必要的.
接下来,像PAM示例中一样编辑默认的用户文件,但是不把默认方法改为PAM,而是注释掉整个部分.
这个文件控制如何对用户进行身份验证和授权.
取消默认方法就能够让LDAP模块接管用户身份验证和授权的处理.
radiusd.
conf需要多做一些配置.
在authenticate和authorize部分中,取消ldap关键字的注释标志,这会启用LDAP身份验证和授权.
还必须找到Auth-TypeLDAP{ldap}部分并取消注释.
最后,取消ldap{.
.
.
}部分的注释,输入服务器的地址、基DN和可选的身份验证信息.
与已经看到的其他软件一样,初始绑定会搜索这个用户的DN;然后,作为这个用户执行第二次绑定,以确认密码并接收属性.
因此,最初用来执行绑定的用户(如果没有配置用户,就是匿名用户)必须能够对uid属性执行搜索,用户必须能够读取自己的属性.
需要由LDAP执行身份验证的用户必须使用radiusProfile对象类,还要有dialupAccess属性和属性值(比如"yes").
在更高级的配置中,可以用这个属性值应用不同的设置;但是对于基本用途,这个属性可以是任何值.
FreeRADIUS是一种非常健壮的RADIUS服务器,需要做大量配置工作.
这里讨论的两项配置只是启用LDAP所需的.
集成CUPS与LDAPCommonUNIXPrintingSystem(CUPS)是当前流行的打印守护进程,这是因为它容易配置,支持InternetPrintingProtocol(IPP),而且向后兼容传统的lpr工具.
CUPS支持PAM,但是必须指定执行身份验证的方式和时间.
首先编辑/etc/pam.
d/cups,使它支持LDAP.
接下来,在/etc/cups/cupsd.
conf中,为打印机创建一个要求身份验证的容器,见清单13.
清单13.
要求身份验证的打印机容器AuthTypeBasic清单13所示的配置要求对以/printers开头的任何URL执行Basic身份验证.
CUPS配置几乎与Apache的配置相同,所以对照清单11应该可以理解这一配置.
但是,CUPS使用PAM而不是本机developerWorksibm.
com/developerWorks/cn/LPI301考试准备,主题305:集成和迁移第18页,共35LDAP模块,所以不需要LDAP配置.
CUPS使用PAM进行身份验证是由它的配置方式决定的.
现在,在尝试浏览/printers下的URL时(这包括在打印机上打印),会提示输入密码.
清单14显示这样的提示.
清单14.
确认CUPS正在使用LDAP[sean@bobLPIC-III_5]$lprindex.
xmlPasswordforseanonlocalhostmypassword[sean@bobLPIC-III_5]$如果密码不正确或PAM没有起作用,那么会再次提示输入密码.
但是,PAM是成功的,文档会打印出来,用户返回到shell提示.
LDAP与Samba的集成本节讨论SeniorLevelLinuxProfessional(LPIC-3)考试301的305.
4主题的内容.
这个主题的权值为1.
在本节中,学习:从smbpasswd迁移到LDAP理解OpenLDAPSamba模式以LDAP作为Samba密码后端Samba是UNIX社区与MicrosoftWindows网络进行集成的方式.
通过使用这种软件,可以与Microsoft网络(客户机和服务器)共享文件,而且使UNIX计算机对于其他Windows客户机表现为一台Windows计算机.
理解Samba身份验证Samba的目标是与Windows网络集成,所以它必须使用Windows所用的身份验证机制.
如果通过Windows服务器进行身份验证,那么不会产生问题;但是Samba服务器常常作为凭证的存储库.
因此,需要密码散列值的两个拷贝—一个用于传统的UNIX密码,另一个用于Windows密码.
Microsoft密码与UNIX密码的相似之处是,它们都是真实密码的散列值.
散列函数是一种单向函数,它们接受一个长度可变的输入(比如密码),输出一个长度固定的散列值(字符串).
不可能用散列值推算出原来的密码,但是可以尝试大量不同的输入,希望产生的散列值碰巧匹配.
对于Microsoft密码,存储两个不同的密码散列值:LANManager散列值和WindowsNT散列值.
前者不如后者安全,因为在执行散列计算之前对密码做了一些操作,这会减少可能产生的输出数量.
设计WindowsNT散列值就是为了克服这些限制.
尽管存储两个散列值,但是如果所有客户机都支持NT散列值(在WindowsNTSP3和更高版本中提供),就可以禁用LANManager支持.
在传统上,Samba把密码散列值存储在smbpasswd文件中,并使用smbpasswd等工具按照相同的名称管理密码文件.
这很容易转移到LDAP上,让多个Samba服务器可以执行身份验证,而不需要使用PrimaryDomainController或其他Microsoft基础结构.
把数据存储在LDAP中还会减少在网络上传输的重复信息.
ibm.
com/developerWorks/cn/developerWorksLPI301考试准备,主题305:集成和迁移第19页,共35理解Samba模式NT密码与UNIX密码不同,不能存储在userPassword属性中.
因此,必须扩展LDAP模式,让它能够存储Microsoft设备所需的密码散列值和其他信息.
Samba套件以samba.
schema的形式分布模式文件.
把这个文件复制到/etc/openldap/schema,并在slapd.
conf中使用include指令,让它成为服务器模式的一部分.
samba.
schema引入了几个新的对象类,见表4.
表4.
samba.
schema中的对象类对象类描述sambaSamAccount提供NT环境中帐户(计算机、用户等等)所需的信息.
sambaGroupMapping把UNIX组映射到Windows组.
sambaTrustPassword提供关于域之间的信任关系的身份验证信息.
sambaDomain在LDAP树中存储关于域的信息.
在设置Samba/LDAP之后,这个对象类将自动添加到LDAP树中.
为Samba配置LDAP为Samba配置LDAP需要编辑smb.
conf以设置LDAP数据源,然后处理用户的LDAP条目,让它们了解新的Samba属性.
在smb.
conf中,有一个passdbbackend=tdbsam行,它代表smbpasswd文件存储机制.
把这一行替换为清单15中的代码,并根据自己的环境进行修改.
清单15.
使用ldapsam密码存储#ldapsamrequirestheuritotheLDAPserverpassdbbackend=ldapsam:ldap://192.
168.
1.
138/#AuserinyourLDAPserverthatcanreadandwritethenewattributes#Thepasswordwillbeenteredlaterldapadmindn=cn=root,dc=ertw,dc=com#Sameassearchbaseldapsuffix=dc=ertw,dc=com#OUsforusers/computers/groupsldapusersuffix=ou=Peopleldapmachinesuffix=ou=Computersldapgroupsuffix=ou=Group设置smb.
conf之后,重新启动Samba并执行smbpasswd-W.
系统会提示您输入在smb.
conf中设置的LDAP域DN的密码.
然后,Samba将使用LDAP数据对用户进行身份验证.
在LDAP中管理Samba用户必须先用sambaSamAccount对象类设置用户,然后他们才能使用Samba.
这包括设置密码散列值和向用户分配安全标识符(SID).
smbpasswd实用程序很容易处理这个问题,这个工具通常用来向smbpasswd文件中添加用户.
如果smb.
conf配置成使用LDAP(比如像清单15那样),smbpasswd将会管理LDAP用户.
developerWorksibm.
com/developerWorks/cn/LPI301考试准备,主题305:集成和迁移第20页,共35为了设置新用户,首先要用posixAccount对象类和uid属性设置用户帐户;如果用户通过LDAP和PAM或NSS登录,uid属性应该已经提供.
接下来,运行smbpasswd-ausername修改用户的LDAP条目,包括设置Samba密码.
清单16显示设置Samba之后的典型用户条目.
清单16.
Samba用户的条目dn:cn=JimJoe,ou=people,dc=ertw,dc=comgivenName:Jimsn:Joecn:JimJoeuid:jjoeuidNumber:1000sambaSID:S-1-5-21-2287037134-1443008385-640796334-userPassword::e01ENX1yTDBZMjB6QytGenQ3MlZQek1TazJBPT0=sambaLMPassword:5BFAFBEBFB6A0942AAD3B435B51404EEsambaNTPassword:AC8E657F83DF82BEEA5D43BDAF7800CCloginShell:/bin/bashgidNumber:4homeDirectory:/home/asambaAcctFlags:[U]objectClass:inetOrgPersonobjectClass:sambaSamAccountobjectClass:posixAccountobjectClass:top清单16中的粗体行是smbpasswd添加的.
从顶部开始,首先在帐户中添加了一个SID.
通过使用smbpasswd,就不需要计算这个值,因为smbpasswd会计算出要使用的SID.
接下来,存储LanManager和NT密码散列值.
sambaAcctFlags用来存储条目的一些属性.
这个标志的有效值如下:N:不需要密码D:禁用帐户H:需要主目录T:其他帐户的临时副本U:常规用户帐户M:MNS(MajorityNodeSetcluster)登录用户帐户W:工作站信任帐户(WorkstationTrustAccount)S:服务器信任帐户(ServerTrustAccount)L:自动锁定X:密码未过期I:域信任帐户(DomainTrustAccount)最后,sambaSamAccount对象类启用所有这些属性.
除了这里描述的属性之外,还可以设置许多其他选项来存储Windows特有的信息.
参考pdbedit手册页,了解如何从命令行读取和修改Samba用户信息.
Samba可以充当WindowsPrimaryDomainController(PDC),Windows客户机需要额外信息才能正确地工作.
密码同步既然有两组密码(userPassword和两个Samba散列值),所以必须设法让这些密码保持同步.
如果用户修改自己的Samba密码(从命令行或从Windows客户机),就应该修改UNIX密码.
同样,如果用户修改UNIX密码,也应该修改Samba密码.
ibm.
com/developerWorks/cn/developerWorksLPI301考试准备,主题305:集成和迁移第21页,共35第一种情况很容易处理.
在smb.
conf的[global]部分中添加ldappasswordsync=yes,并重新启动Samba.
以后的任何密码修改都会同时修改Samba和userPassword散列值.
当用户通过UNIXpasswd命令修改密码时,需要通过PAM修改Samba密码.
Samba附带mod_smbpasswd,它用于通过Samba系统验证和修改密码.
目前不需要验证密码,所以只使用password函数.
清单17给出PAM配置文件的部分内容,它同时修改LDAP中的UNIX和Samba密码.
清单17.
同时修改UNIX和Samba密码的PAM密码栈passwordrequisitepam_cracklib.
sotry_first_passretry=3passwordoptionalpam_smbpass.
souse_authtokuse_first_passpasswordsufficientpam_unix.
somd5shadownulloktry_first_passuse_authtokpasswordsufficientpam_ldap.
souse_authtokpasswordrequiredpam_deny.
so在清单17中,添加的行显示为粗体.
pam_smbpass模块设置为可选的,所以如果用户没有配置为Samba用户,这个步骤就会失败.
Samba密码修改发生在UNIX和LDAP密码修改之前,因为这两个密码标为sufficient,这意味着如果第一个步骤成功,就会停止处理.
清单17就绪之后,用户从命令行修改密码时,就会同时修改Samba密码.
把现有用户迁移到LDAP在迁移到LDAP时,很可能在基于文件的密码系统中存在用户,需要迁移这些用户.
pdbedit实用程序可以把帐户从一个地方复制到另一个地方.
清单18演示如何使用pdbedit迁移用户.
-i参数设置数据源,-e参数设置目的地.
在运行pdbedit命令之前,应该在smb.
conf中设置ldapsam数据库.
清单18.
把用户从tdbsam迁移到ldapsam[root@server1~]#pdbedit-eldapsam-itdbsamImportingaccountforfred.
.
.
okImportingaccountforjsmith.
.
.
ok如果使用比较老的smbpasswd密码后端,那么应该使用smbpasswd而不是tdbsam.
LDAP与ActiveDirectory的集成本节讨论SeniorLevelLinuxProfessional(LPIC-3)考试301的305.
5主题的内容.
这个主题的权值为2.
在本节中,学习:Kerberos与LDAP的集成跨平台身份验证单点登录概念OpenLDAP和ActiveDirectory之间的集成和兼容性限制在几乎所有公司中都可以找到MicrosoftWindows;您的环境很可能已经使用了Microsoft的企业目录服务ActiveDirectory.
ActiveDirectory基于两种开放协议:LDAP和Kerberos.
理解了这两种developerWorksibm.
com/developerWorks/cn/LPI301考试准备,主题305:集成和迁移第22页,共35协议并适当地配置Linux系统,您的Linux机器就可以通过企业目录执行身份验证并支持单点登录(singlesignon,SSO).
这意味着,用户只需要登录机器一次,用户的凭证就能够在整个网络上通过身份验证.
理解KerberosKerberos这个名称来自古希腊神话中地狱里的一只有三个头的狗.
这种协议让用户和服务器可以通过不可信网络相互证明自己的身份.
它是在MassachusettsInstituteofTechnology(MIT)开发的,最初供他们自己的网络使用,后来应用于许多其他网络.
Microsoft选择Kerberos作为Windows2000的ActiveDirectory的组成部分.
KerberosV是当前已经开发完的最新版本,但是有时候也会遇到KerberosIV.
KerberosV向后兼容那些仍然使用KerberosIV的系统.
Kerberos协议Kerberos协议让服务能够验证用户的身份,而不需要查看密码.
这是通过一个互信的服务器AuthenticationService(AS)实现的.
AS与每个用户和服务共享一个秘密(secret).
使用这个秘密保护AS和通信的另一方之间的信息;AS甚至可以向用户提供发往其他人的消息(称为票据(ticket)).
在后一种情况下,用户无法读取票据,因为他们不掌握共享的秘密.
所有客户机和服务器组成一个Kerberos域(realm),Kerberos域很像NIS域,在某些方面也与LDAP树的基DN相似.
域定义向一组公用Kerberos服务器执行身份验证的所有设备和人.
在一般情况下,域是组织的DNS区,使用大写形式表示,比如ERTW.
COM.
对于Kerberos来说,客户机是从Kerberos服务器获取票据的计算机,服务器是提供授予票据的Kerberos服务的设备.
在Kerberos域中进行身份验证的所有内容都有一个对应的Kerberos主体(principal),它标识进行身份验证的用户或设备,并与密码或共享的秘密相关联.
当用户连接服务器时,他们实际上要连接服务器上运行的一个服务.
应该单独处理每个服务,而且必须把每个服务作为一个主体向Kerberos服务器注册.
服务的主体采用servicename/servername@REALM形式,而用户的主体采用user@REALM形式.
可以把Kerberos协议看作包含两个不同的阶段:用户最初登录到域,以及向服务证明用户的身份.
Kerberos的出色之处在于,初始登录只执行一次;以后可以向许多服务器多次执行服务身份验证.
Kerberos的第一个阶段从用户向Kerberos服务器(具体地说,是一个称为KeyDistributionCenter[KDC]的组件)请求TicketGrantingTicket(TGT)开始,TGT稍后将用于请求服务.
KDC生成一个TGT,用用户的密码加密TGT,然后把TGT发送给用户.
TGT就像是公司的访客通行证.
您向门卫(KDC)证明自己的身份,门卫给您一张有效期一天的访客通行证.
通过这个过程,您可以保护自己的ID,还会限制访客通行证被盗给公司带来的风险.
经过一段比较短的时间之后,TGT就会过期,常常是大约8小时.
在第二个阶段,用户要访问一个服务.
用户向Kerberos服务器的TicketGrantingService(TGS)组件发送一个请求,其中包含TGT和服务的名称(主体).
TGS检查TGT是否仍然有效,然后发送一个用这个服务的共享秘密加密的票据.
最后,用户向服务提供这个票据.
如果服务可以成功地解密ibm.
com/developerWorks/cn/developerWorksLPI301考试准备,主题305:集成和迁移第23页,共35这个票据,服务就知道Kerberos系统已经批准了服务请求.
在这个阶段,根本不需要通过网络发送密码.
攻击者可能捕捉到一个票据,然后再次使用它,这称为重放攻击(replayattack).
Kerberos通过限制票据的生命周期并在加密票据中包含时间戳来抵御重放攻击.
服务的票据可能只在5分钟内有效,所以如果票据的时间超过了5分钟,服务就认为出现了票据重放.
为了有效地实施这种保护,所有时钟必须同步.
LDAP如何切入与PAM系统相似,Kerberos只提供一个身份验证框架.
用户信息并不存储在Kerberos数据库中.
Kerberos秘密可以存储在LDAP数据库中,也可以单独存储.
如何选择取决于Kerberos的实现.
无论怎样,LDAP都是用来存储用户信息的,比如主目录和个人信息.
无论Kerberos数据库存储在哪里,都必须保证它的安全.
Kerberos密钥就像是密码:它们可能被盗,攻击者可能使用它们生成TGT和票据.
大多数指南都强烈建议把Kerberos服务器放在单独的设备上,并尽可能加以保护.
为Linux用户配置MicrosoftActiveDirectoryActiveDirectory使用的Kerberos和LDAP实现与Linux附带的实现兼容.
Microsoft扩展了Kerberos以便支持Windows特有的属性,但是这并不妨碍UNIX用户使用它(参见参考资料中的Microsoft文档).
ActiveDirectory模式必须扩展,才能支持某些UNIX属性,这在Windows2003Server上可以轻松地实现.
访问DomainController的ControlPanel,并选择AddorRemovePrograms>Add/RemoveWindowsComponents.
在ActiveDirectoryServices组件中,选择IdentityManagementforUNIX子组件(如果使用比较早的Windows版本,这个组件可能称为ServerforNIS).
安装这个软件,LDAP模式就会扩展;用户对话框也会包含一个UNIXAttributes选项卡.
在ActiveDirectoryUsersandComputers应用程序中,编辑DomainUsers安全组.
注意新的选项卡UNIXAttributes.
把一个组和NIS域分配给您的DomainUsers组,见图2.
这样就使UNIX系统能够看到这个组.
这个组将成为用户的主组.
developerWorksibm.
com/developerWorks/cn/LPI301考试准备,主题305:集成和迁移第24页,共35图2.
把UNIX属性分配给组仍然在Users容器中,找到希望在UNIX服务器上使用的用户.
找到这个用户的UNIXAttributes选项卡,并把标准的UNIX属性分配给它.
图3给出了一个示例用户.
ibm.
com/developerWorks/cn/developerWorksLPI301考试准备,主题305:集成和迁移第25页,共35图3.
用户的UNIX属性图3中的用户已经分配了主组、主目录、shell和用户id.
接下来,必须创建一个允许访问LDAP树的服务帐户,因为在默认情况下禁用了匿名访问.
对这个用户使用以下配置:Name:LDAPserviceaccount(或您选择的名称)Userlogonname:ldap(或您选择的名称)Password:您选择的密码Usercan'tchangepassword:选择Passwordneverexpires:选择Primarygroup:DomainGuests服务帐户应该只是DomainGuests的成员.
在MemberOf选项卡上,把DomainGuests组添加到这个帐户中,在组列表中突出显示它,然后单击SetPrimaryGroup按钮.
修改组之后,可以把DomainUsers组从配置文件中删除.
如果您的安全策略禁止密码选项,那么每次修改密码时,必须调整Linux配置(在下面讨论).
注意,在这里LDAP只用于存储目录信息,并不存储密码,所以减轻了修改密码的需求.
配置LinuxLinux端的配置涉及三个步骤.
首先,通过/etc/ldap.
conf设置目录访问.
接下来,把PAM配置为执行Kerberos身份验证.
最后,把Samba配置为使用ActiveDirectory信息进行身份验证,并把它加入域中.
developerWorksibm.
com/developerWorks/cn/LPI301考试准备,主题305:集成和迁移第26页,共35在开始配置之前,必须确定Linux机器使用Windows服务器获得DNS和网络时间.
Linux服务器还必须在域的MicrosoftDNS区中有主机记录.
配置LDAPLDAP的配置方法与前面一样,但是需要一些从UNIX属性到Microsoft属性的映射.
清单19显示的/etc/ldap.
conf使用前面设置的用户帐户访问一个MicrosoftLDAP目录.
清单19.
配置ldap.
conf以使用Microsoft目录#Informationaboutthedirectoryurildap://192.
168.
1.
151binddnldap@ertw.
combindpwldapsslnobasedc=ertw,dc=com#Mapattributesnss_map_objectclassposixAccountusernss_map_objectclassshadowAccountusernss_map_attributeuidsAMAccountNamenss_map_attributehomeDirectoryunixHomeDirectorynss_map_attributeshadowLastChangepwdLastSetnss_map_objectclassposixGroupgroupnss_map_attributeuniqueMembermemberpam_login_attributesAMAccountNamepam_filterobjectclass=Userpam_passwordad清单19中的配置首先使用前面设置的凭证将模块指向MicrosoftLDAP服务器.
然后,把属性的UNIX名称映射为Microsoft名称,比如使用sAMAccountName代表userid.
最后,在/etc/nsswitchconf的passwd、group和shadow部分中添加ldapwinbind(保留files).
这使系统从LDAP和Samba获取目录信息(稍后配置Samba).
完成这个步骤之后,可以运行getentpasswd查看LDAP用户.
注意,必须为ActiveDirectory中的用户设置UNIX属性,用户才能显示在这个列表中.
配置KerberosKerberos是通过PAM和/etc/krb5.
conf文件配置的.
如果要对DNS使用MicrosoftDNS服务器,那么只需要指定域,因为会从DNS自动获得服务器信息.
清单20显示/etc/krb5.
conf的内容.
清单20.
ERTW.
COM域的/etc/krb5.
conf[logging]default=FILE:/var/log/krb5libs.
logkdc=FILE:/var/log/krb5kdc.
logadmin_server=FILE:/var/log/kadmind.
log[libdefaults]default_realm=ERTW.
COMdns_lookup_realm=falsedns_lookup_kdc=trueticket_lifetime=24hforwardable=yes[realms]ibm.
com/developerWorks/cn/developerWorksLPI301考试准备,主题305:集成和迁移第27页,共35ERTW.
COM={default_domain=ertw.
com}[domain_realm].
ertw.
com=ERTW.
COMertw.
com=ERTW.
COM[appdefaults]pam={debug=falseticket_lifetime=36000renew_lifetime=36000forwardable=truekrb4_convert=false}krb5.
conf划分为多个部分,各部分的名称包围在方括号中.
logging部分指定各个日志文件的路径.
libdefaults部分配置Kerberos库:具体指,dns_lookup_kdc让库搜索DNS中的服务器记录来查找KDC.
这个记录类似_kerberos.
_tcp.
ERTWCOM.
这样,响应是服务器的名称和要联系的端口.
realms部分定义域和相关联的DNS区.
domain_realm起相反的作用:它允许主机根据它的完全限定域名(FQDN)判断它的域.
最后,appdefaults部分设置使用Kerberos的应用程序;在这个示例中,为PAM配置了一些默认选项.
在实践中,一般不需要配置krb5.
conf,因为默认的配置文件包含所需的所有元素.
您只需要在适当的地方替换上自己的域(realm)和域名.
还可以使用系统中的Kerberos配置实用程序,比如authconfig.
PAM的配置与前面的LDAP和smbpasswd的配置相似.
在适当位置插入对KerberosPAM库的调用.
清单21给出在配置Kerberos之后Fedorasystem-auth文件的部分内容.
清单21.
配置Kerberos之后的system-auth文件authsufficientpam_unix.
sonulloktry_first_passauthsufficientpam_krb5.
souse_first_passauthrequiredpam_deny.
soaccountrequiredpam_unixsobroken_shadowaccount[default=badsuccess=okuser_unknown=ignore]pam_krb5.
soaccountrequiredpam_permit.
sopasswordsufficientpam_unix.
somd5shadownulloktry_first_passuse_authtokpasswordsufficientpam_krb5.
souse_authtokpasswordrequiredpam_deny.
sosessionrequiredpam_unix.
sosessionoptionalpam_krb5.
soKerberos直接添加在授权阶段中UNIX密码检查之后,并设置为sufficient项.
这意味着,如果找到了UNIX密码,就不再查询Kerberos.
如果没有找到UNIX密码,就查询Kerberos.
如果Kerberos检查失败,密码栈也会失败.
如果没有找到用户,就把控制传递给pam_deny模块,这会返回失败.
帐户阶段使用另一种语法.
每个PAM模块可以返回不同的选项,比如"success"或"nosuchuser".
方括号使管理员能够根据不同的返回码采取不同的操作.
清单21实现这样一种策略:如果pam_krb5返回成功的结果,那么继续处理.
如果用户是未知的,那么完全忽略这个模块.
其他情况developerWorksibm.
com/developerWorks/cn/LPI301考试准备,主题305:集成和迁移第28页,共35都被认为是失败.
这种行为required关键字相似,但是未知用户不会导致失败.
关于这种语法的更多细节(包括选项),请参考pam.
conf(5)手册页.
密码和会话阶段包含栈中的模块,但是没有指定特殊选项.
现在,您应该能够用ActiveDirectory凭证登录Linux服务器.
下一步是配置Samba,并为服务器创建一个计算机帐户来进一步保护连接.
配置Samba并加入域对于Samba的配置,首先必须从smb.
conf中删除现有的密码后端,以及/etc/samba和/var/cache/samba中的所有tdb文件.
为了让Samba使用AD,必须在smb.
conf的[global]部分中添加清单22所示的指令.
清单22.
AD集成所需的Samba配置#Activedirectorysecuritysecurity=adsrealm=ERTW.
COMusekerberoskeytab=yes#Identitymappingidmapbackend=adldapidmapsuffix=dc=ertw,dc=com#LDAPconfigurationldapadmindn=cn=ldap,cn=users,dc=ertw,dc=comldapsuffix=dc=ertw,dc=com#Winbindwinbindusedefaultdomain=yeswinbindnestedgroups=yes清单22首先指定要使用ADS安全模式(远程ActiveDirectory服务器)以及Kerberos域.
第二部分配置idmap,这个特性会把远程MicrosoftSID映射为本地UNIXid.
这个配置指定ActiveDirectory是信息源.
映射在Microsoft端进行,因为我们已经在用户和组的UNIXAttributes选项卡中输入了ID.
服务器只需从LDAP获取这一信息.
LDAP的配置比较熟悉;它把LDAP连接的DN设置为前面创建的ldap用户.
注意,容器是cn=users而不是以前使用的ou=people.
密码是通过smbpasswd输入的.
最后两行启用Winbind,这是一些MicrosoftRemoteProcedureCalls的实现(关于Winbind的更多信息参见参考资料).
这使我们能够从ActiveDirectory服务器获得更多信息,而不只是已经添加了UNIX属性的组和用户.
配置了smb.
conf之后,启动Samba和winbind服务.
Samba配置的最后几步是设置admindn密码并加入域.
清单23演示如何把计算机加入域.
ibm.
com/developerWorks/cn/developerWorksLPI301考试准备,主题305:集成和迁移第29页,共35清单23.
设置admindn密码并加入域[root@server1~]#smbpasswd-WSettingstoredpasswordfor"cn=ldap,cn=users,dc=ertw,dc=com"insecrets.
tdbNewSMBpassword:ldapRetypenewSMBpassword:ldap[root@server1~]#netadsjoin-Uadministratoradministrator'spassword:mypasswordUsingshortdomainname--ERTW0Joined'SERVER1'torealm'ERTW.
COM'测试现在,应该能够用ActiveDirectory凭证登录服务器,并在不需要登录的情况下浏览远程计算机上的文件共享.
下面这些命令有助于测试:netadstestjoin:测试计算机帐户wbinfo-u:显示ActiveDirectory用户的列表并测试winbindklist:在通过Kerberos登录之后,显示已经发出的TGT和服务票据smbclient-k-L'\\SERVERNAME':使用Kerberos登录,显示SERVERNAME提供的共享列表LDAP与电子邮件服务的集成本节讨论SeniorLevelLinuxProfessional(LPIC-3)考试301的305.
6主题的内容.
这个主题的权值为1.
在本节中,学习:为电子邮件服务规划LDAP模式结构在LDAP中创建电子邮件属性集成Postfix和LDAP集成sendmail和LDAPsendmail和Postfix是比较流行的两种邮件传输代理(MTA).
MTA的作用是从系统接收消息,把消息投递给最终用户或下一跳MTA.
MTA还从用户接收消息,并查找能够投递这个消息的远程MTA.
sendmail和Postfix都依赖于各种映射—也就是键/值对,通常保存在平面文件或BDB等散列数据库中.
这种搜索也非常适合LDAP.
LDAP的优点是许多主机可以共享相同的配置,更容易开发管理LDAP数据的工具,而平面文件中的数据必须重新构建为散列表.
与磁盘读相比,LDAP的开销应该不会太大,尤其是在为LDAP树建立了适当的索引的情况下.
配置sendmailsendmailMTA是一种很复杂的软件,在其中添加LDAP只会增加复杂性.
因为sendmail几乎可以进行无限制的配置,所以可以用sendmail做几乎任何事情.
缺点是往往把简单的事情弄得更复杂.
sendmail程序对一种常常称为cf的语言进行解释,从而处理邮件.
cf是一种适合由sendmail解析的语言,并不适合人类阅读.
幸运的是,人们可以使用一种称为M4的语言生成结果代码,这种语言的语法简单得多.
developerWorksibm.
com/developerWorks/cn/LPI301考试准备,主题305:集成和迁移第30页,共35sendmail映射许多cf操作都涉及到搜索映射(键-值对的序列)中的信息.
每个映射都有专门的用途,比如aliases映射邮件别名,mailertable映射电子邮件的静态路由.
映射是一个两列的实体;在左边(LHS)执行搜索,返回右边(RHS)的对应值.
映射的概念无法直接转换为LDAP.
对sendmail映射的单键搜索只能返回一个RHS条目(RHS可以有多个值,但是只能有一个键实例存在).
为了处理这个问题,sendmail定义了一个模式,从而允许把键-值对存储在LDAP中.
另外,sendmail把每个映射请求转换为一个LDAP查询过滤器,过滤器从单一条目返回一组属性.
您可以使用sendmail模式,也可以修改过滤器来处理树中的数据.
首先,在服务器的模式中添加misc.
schema模式(OpenLDAP附带这个模式).
这将实现基于LDAP的邮件路由.
然后,添加sendmail发行版提供的sendmail.
schema,这样就可以在LDAP中存储映射.
配置LDAP邮件路由一些组织用多台邮件服务器处理所有用户的邮件,这是由于受到地理因素的限制,或者是为了便于管理服务器容量.
在这种情况下,一个用户的邮箱可能在服务器wpgertw.
com上,但他的电子邮件地址却是sean@ertw.
com.
LDAP邮件路由允许任何sendmail服务器接收邮件,执行LDAP搜索,然后把邮件地址改写为内部版本.
所以,如果需要改变目标服务器,那么只需修改LDAP即可.
在任何情况下,用户的电子邮件地址都不需要改变.
misc.
schema实现了一个关于LDAP路由的因特网草案.
这个模式提供inetLocalMailRecipient对象类和以下属性:mailLocalAddress:这个属性定义组织之外的人员所看到的电子邮件地址.
mailRoutingAddress:这个属性定义用户的内部地址,通常包含保存用户邮箱的服务器.
mailHost:这个属性定义处理这个用户的电子邮件的服务器.
用户的主机信息可以保存在mailRoutingAddress或mailHost中.
例如,mailRoutingAddress设置为sean@wpg.
ertw.
com,mailHost设置为mx.
ertw.
com,这似乎相互矛盾.
如果设置了主机,邮件就投递到主机地址,而不考虑路由地址.
如果路由地址属性存在,地址仍然被改写为路由地址.
对于sean@wpg.
ertw.
com这个示例,邮件信封中的地址被改写为sean@wpg.
ertw.
com,但是邮件会投递到mx.
ertw.
com.
清单24给出启用LDAP路由的M4代码.
这段代码应该放在/etc/mail/sendmail.
mc中;然后,必须重新构建sendmail.
cf.
通常,应该进入/etc/mail/并运行make;或者运行m4sendmail.
mc>sendmail.
cf.
清单24.
在sendmail.
mc中启用LDAP路由define(`confLDAP_DEFAULT_SPEC',`-hlocalhost-bdc=ertw,dc=com')FEATURE(`ldap_routing')LDAPROUTE_DOMAIN(`ertw.
com')第一行为内部LDAP客户机设置默认参数:主机和搜索库.
第二行启用LDAP路由特性,第三行为LDAP路由启用ertw.
com域.
ibm.
com/developerWorks/cn/developerWorksLPI301考试准备,主题305:集成和迁移第31页,共35注意inetLocalMailRecipient的mailLocalAddress属性和inetOrgPerson的mail属性的重复.
sendmail允许向ldap_routing特性传递额外的参数,从而覆盖它在内部使用的搜索.
第一个参数是用来查找mailHost属性的过滤器,第二个参数用来查找mailRoutingAddress.
因此,FEATURE(`ldap_routing',`ldap-1-T-vmailHost-k(&(objectClass=inetLocalMailRecipient)(mail=%0))',`ldap-1-T-vmailRoutingAddress-k(&(objectClass=inetLocalMailRecipient)(mail=%0))')让sendmail使用mail属性,而不是使用mailLocalAddress.
搜索过滤器由-k开关指定,要返回的属性由-v指定.
其他参数是sendmail的标准参数.
配置别名sendmail把LDAP别名实现为LDAP树中的一系列条目,使用sendmailMTAAliasObject对象类启用sendmailMTAKey属性.
您可能希望把别名放在它们自己的容器中.
清单25给出一个sendmail别名的LDIF,这个别名接收exec@ertw.
com的邮件并把邮件发送给hair@ertwcom和teeth@ertw.
com.
清单25.
exec@ertw.
com的别名dn:sendmailMTAKey=execs,ou=aliases,dc=ertw,dc=comobjectClass:sendmailMTAAliasObjectsendmailMTACluster:externalsendmailMTAAliasGrouping:aliasessendmailMTAKey:execssendmailMTAAliasValue:hair@ertwcomsendmailMTAAliasValue:teeth@ertw.
com第一个属性sendmailMTACluster定义可以使用这个别名的服务器.
还必须在sendmail.
mc文件中定义集群名称,比如define(`confLDAP_CLUSTER',`external').
这个集群被用作搜索过滤器的一部分,所以如果没有定义它,就不能使用别名.
另一种定义集群的方法是设置sendmailMTAHost,这使条目只应用于特定的主机.
sendmailMTAAliasGrouping必须是aliases;这是搜索过滤器的一部分.
键是别名的名称;最后,目标可以是一个或多个值.
最后一步是用define(`ALIAS_FILE',`ldap:')M4指令配置sendmail,从而使用LDAP获得别名文件.
一般情况下,如果在sendmail.
mc中需要一个文件,就可以加上ldap:并在LDAP中引用映射.
在这种情况下,sendmailMTAAliasGrouping将成为映射的名称.
配置PostfixPostfix比sendmail简单,但是与sendmail兼容.
Postfix仍然采用映射的概念,但是不会把映射转换为模式,而是必须定义自己的查询过滤器,它们应该使用您自己的属性.
提速啦的来历提速啦是 网站 本着“良心 便宜 稳定”的初衷 为小白用户避免被坑 由赣州王成璟网络科技有限公司旗下赣州提速啦网络科技有限公司运营 投资1000万人民币 在美国Cera 香港CTG 香港Cera 国内 杭州 宿迁 浙江 赣州 南昌 大连 辽宁 扬州 等地区建立数据中心 正规持有IDC ISP CDN 云牌照 公司。公司购买产品支持3天内退款 超过3天步退款政策。提速啦的市场定位提速啦主...
819云是我们的老熟人了,服务器一直都是稳定为主,老板人也很好,这次给大家带来了新活动,十分给力 香港CN2 日本CN2 物理机 E5 16G 1T 20M 3IP 240元0官方网站:https://www.819yun.com/ 特惠专员Q:442379204套餐介绍套餐CPU内存硬盘带宽IP价格香港CN2 (特价)E5 随机分配16G1T 机械20M3IP240元/月日本CN2 (...
对于Megalayer云服务器提供商在之前也有对于他们家的美国服务器和香港服务器进行过评测和介绍,但是对于大部分网友来说需要独立服务器和站群服务器并不是特别的普及,我们很多网友使用较多的还是云服务器或者VPS主机比较多。在前面也有在"Megalayer新增香港VPS主机 1GB内存 50GB SSD 2M带宽 月59元"文章中有介绍到Megalayer商家有新增香港CN2优化VPS主机。那时候看这...