将LDAP 目录用于Samba 认证
时间:2005-11-30 来源:mantou
源自:IBM : developerWorks 中国网站
PDF制作:eTony
Tom Syroid
2003-04-10
开放源码Samba 将Unix 或Linux 系统转变成了用于Microsoft Windows 网络客
户机的文件和打印服务器。您可以配置LDAP(轻量级目录访问协议,Lightweight
Directory Access Protocol)来为Samba PDC(主域控制器)提供用户认证。
未来之路
本教程详细讲述了将LDAP(轻量级目录访问协议,Lightweight Directory Access Protocol)目录用于存储
Samba 用户帐户信息(通常存储在smbpasswd 文件中)所需的步骤。这里概述的过程是基于Samba 和OpenLDAP
的当前稳定发行版的,在撰写本文时它们分别是2.2.4 和2.0.23。如果您正在从头构建系统,除非您有不这样
做的特殊需求或理由,那么建议您总是使用Samba 和OpenLDAP 的最新版本。对于Samba 尤其是如此,因为目
前正在进行大量关于程序的LDAP 和Windows 域集成的开发。Samba 当前的CVS HEAD 分支(它是最新的开发
树,最终将成为Samba 3.0)将使得与LDAP 的集成更为轻松,因为管理员将不必象现在这样担心两种用户帐户
(UNIX smbpasswd 帐户和Windows 域帐户)的同步;Samba 3.0 将取消对现有smbpasswd 帐户的需求。
学完本教程后,您应该对下列内容有清晰的理解:
● 如何收集、构建和/或安装必需的软件。
● 如何配置以便使用OpenLDAP 服务器。
● 如何配置Samba,以及如何将用户、组和机器帐户添加到OpenLDAP 服务器。
● 还有如何维护(删除和修改)帐户信息。
本教程不详细讲述配置Samba 担任PDC(主域控制器,Primary Domain Controller)的机制。可以在IBM
eServer 开发者园地上另一篇题为将Samba 用作PDC 的教程上获得这些信息。
假定条件
本教程假定以下条件:
● 一个可正常运行的、完全配置好的Linux/UNIX 系统。本教程是基于Red Hat R7.3 的。它也在RedHat
7.2 和Gentoo Linux(用于高级用户的“元分发版(metadistribution)”)上测试过。理论上,给定
的指示信息应该可以在任何*NIX 操作系统上工作;路径名和约定因分发版而异。
● 可正常运行的、配置好的Samba PDC 安装。除了上一页提到的IBM eServer 开发者园地中的教程之外,
F. Hagethorn 还创建了一组很棒的脚本,以帮助您快速地使用Samba 创建PDC。他将自己的产品称为
VASC(十分高级的Samba 配置,Very Advanced Samba Configuration),您可以在这里找到它。
● 对LDAP 所用概念和术语的基本理解(例如,专有名称、组织单元、对象类等)。即使是对正确地实现
LDAP 服务器过程中背后的基本概念作一个简介,其篇幅也可以轻易地达到密密麻麻的50 页内容。Adam
Tauno Williams 为LDAP 结构和约定准备了很好的介绍;可以下载其PDF 格式。有关详细信息,请参阅
结束语和参考资料一章。
● 对常用管理术语和过程(如文件权限、创建用户帐户、移动和复制文件等)的基本理解。
● 您需要足够的计算机来处理文件共享和目录查找的负载(假定Samba 和OpenLDAP 在同一机器上运行―
这是小到中型企业比较常用的配置),尽管对某些人来说这个问题可能很明显。本教程是根据在具有三个
磁盘ServeRAID 阵列、双P3 1.2 GHz 处理器和1GB RAM 的IBM eServer xSeries 型号220 上编写和
测试的。根据配置,这台机器可以轻松地为250-350 个用户服务,这个数量取决于所服务的文件大小和
并发用户的数目。
为什么使用LDAP 目录?
在传统的Samba 安装中,用户帐户和密码信息存储在/usr/local/samba/private/smbpasswd 中(或者,根据配
置,有时存储在/etc/smbpasswd 中)。因为LM/NT 密码散列和smbpasswd 散列之间的不兼容性,所以用户必
须首先存在于服务器的/etc/passwd 文件中,然后将该用户手工添加到smbpasswd 文件中。对于少量用户这很
好,但随着用户群逐渐增大,这种方法的不利方面也随之显现。例如:
● 必须串行执行所有认证查找。假定每次域登录大约进行两次查找(一次用于正常的会话连接,另一次在映
射网络驱动器或打印机时执行),对于大型站点,这是一个性能瓶颈。我们所需要的是象数据库中所使用
的那种建立索引的方法。
● 想要将smbpasswd 文件复制到多个Samba 服务器的管理员只得使用外部工具(如rsync 和ssh),或
者编写定制的、内部脚本。
● smbpasswd 文件的结构缺少用来存储属性的字段,这些属性包括主目录、密码到期时间/日期以及其它密
码详细信息(例如,能/不能更改)和用户/组RID(相对标识符,Relative Identifier)。
使用LDAP 目录服务会减轻这些限制,以及其它限制,并允许将集中资源用于所有用户管理。
有两件事是Samba/LDAP 安装无法“开包”即可完成的:
● 从Windows 2000 活动目录(Active Directory)服务器检索用户帐户信息。
● 减少对/etc/passwd 的需求。
暂定于2002 年夏末发布的Samba 3.0 发行版将解决这两个问题。
关于作者
最近几年,Tom Syroid 凭借其技能和实践经验从事技术写作;他是Outlook 2000 in a Nutshell(O'Reilly)
和OpenLinux Secrets(Hungry Minds)的作者。他还撰写了许多关于Linux/UNIX 系统管理和安全性问题的短
文。Tom 很熟悉Samba、Apache、Microsoft Office(97、2000 和XP)、SSH、DNS/BIND 以及其它各种开放源
码产品/技术。在操作系统方面,Tom 配置和管理过许多系统,这些系统包括运行各种版本的Windows (95、
98、ME、NT、2000、XP)、大多数Linux分发版(Redhat、OpenLinux、Mandrake、Slackware、TurboLinux、
SuSE 和Yellow Dog Linux)以及AIX(4.3.x 和5L)。Tom 还具备相当丰富的硬件知识;他在编写各种外型和
大小的PC 的规范、构建和维护这些PC 方面都很有经验,对IBM xSeries 产品系列和RS/6000 产品系列方面
也有相当的研究。
欢迎批评和反馈意见。可通过[email protected]
关键字就是选择……
如果有一种精神可以实实在在地体现开放源码软件运动的特色,那就是“选择”的观念。我们可以选择不同的分
发版,因而又可以选择捆绑软件和多种文件系统布局。我们可以选择不同的软件包管理器和软件分发版― 是源
代码还是预编译的二进制文件?尽管就其本身而言,所有这些选择的自由都是神圣而光荣的,但它也使提供如何构
建复杂的结构(就象一台LDAP 服务器,它担任300 台工作站的Samba PDC ― 其中一半工作站使用漫游概要
― 一样复杂)的详细指示信息变得很难。
为了进行简化,并集中精力处理后面的任务,正如先前提到的那样,本文是基于Red Hat R7.3 的。为什么使用
Red Hat?因为它容易获得,而且Linux 管理员们相对比较了解Red Hat 的文件系统布局和init 脚本约定,而
且手头又恰好有Red Hat 分发版。最后声明一下― 无论您使用Red Hat、SuSE、Gentoo 还是Slackware,基
本过程都是相似的。但是,为了按照本教程的主题进行下去,我们必须从某处出发,该起点是一个正确的Red Hat
安装、一些RPM 包和一些Perl 脚本。
必需的软件包
如果您打算遵循本教程中提供的指示信息,则需要下载或预安装下列软件包:
● 最新的稳定Samba 发行版(www.samba.org)。撰写本文时是2.2.4。
● 最新的稳定OpenLDAP 发行版(www.openldap.org),目前是2.0.23。
● 因特网上差不多有数百个由管理员和程序员们编写的脚本,它们用来减轻将用户帐户信息填充到LDAP 目
录的手工过程。IDEALX 上有一个Perl 脚本包,它允许管理员创建必需的Samba 对象类并管理目录。
PADL 上的人们发布了一个脚本集,它允许管理员从常用UNIX 配置文件(如/etc/passwd, /
etc/group、NIS 详细信息等)迁移多种帐户信息。关于Samba 到LDAP 的迁移脚本有必要警告一句:一
组对于某个安装有效的脚本未必对另一个安装有效。开放源码应用程序在不同的修订版之间变化很大,
Linux 分发版以使用自己独特的文件系统布局而“声名狼藉”,每个管理员都喜欢以自己的方式做事。所
有这些累积起来,造成了前面提到的无规律状态。本教程使用来自IDEALX 的脚本,因为它们看起来相对
精练一些。如果您没有获得此处详细描述的脚本,则请尝试另一套脚本。无论您用哪一套脚本,都请确保
在非生产系统上测试您选择的脚本。
从源代码编译Samba
第一步是下载最新的Samba 源代码tar 包(或者从SAMBA_2_2 CVS 树检出最新版本;可在Samba 网站上找到
CVS 下载说明)。之所以需要源代码,是因为必须将Samba 配置成使用LDAP 目录进行用户认证,这一配置必须
在编译程序组件之前完成。您可能会找到为LDAP 预构建的RPM 包,但这种包少之又少(IDEALX.org 过去常常
构建基于LDAP 的Samba RPM,但我上次发现他们已经将该包从他们的站点上删除了)。
将源代码复制到方便的位置(例如,/usr/local/src),然后用下列命令对它解压缩:
tom@phaedrus src $ tar xvzf samba-latest.tar.gz
现在,用“cd”命令进入samba/source 目录,然后输入./configure --help 来查看配置选项列表。出于本教
程的目的,此处列出构建Samba 的方法:
tom@phaedrus source $ ./configure
--with-smbmount
--with-automount
--with-configdir=/etc/samba
--with-ldapsam
上述配置的关键是--with-ldapsam 选项;就是该选项通知Samba 将LDAP SAM 而不是smbpasswd 用于用户认
证。--with-smbmount 是仅用于Linux 的选项,您可以完全按照自己的个人喜好来改换Samba 配置文件的位
置。
当配置过程完成时,输入make && make install。现在,如果不出现任何错误,Samba 就已准备就绪了。
注意:可以将Samba 配置成使用加密密码或明文密码。大多数管理员会选择前者。但是,加密密码与PAM(可插
入的认证模块,Pluggable Authentication Modules)是互斥的。如果您构建Samba 时使用了--with-pam 选
项,并且尝试同时使用加密密码和LDAP 目录,那么最终结果是您会碰到一些令人头疼的、前后不一致的行为。在
这一点上请相信我。
来自简单RPM 的Samba
如果您是铁杆RPM 迷,或者只是想确保RPM 数据库的完整性,以下是如何从Samba SRPM(源RPM)构建三个必
需的RPM 的方法。
● 首先从Red Hat(ftp.redhat.com 或本地镜像)获取最新的samba-2.2.X-X.src.rpm。
● 安装RPM:rpm -ivh samba-2.2.X-X.src.rpm。
● 编辑/usr/src/redhat/SPECS/samba.spec 文件并添加您想要的选项。使用上一页的示例:--withsmbmount
--with-pam --with-ldapsam。
● 现在构建RPM:cd /usr/src/redhat/SPECS/ && rpm -ba samba.spec。这个操作将创建三个RPM 文件,
samba-common-X.X.X-X、samba-client-X.X.X-X 和samba-X.X.X-X。
处理RPM 时的一个警告:如果您正在从Red Hat 以外的来源(例如,从Samba 站点下载的RPM)安装RPM,请
总是卸载任何现有的Samba 包。我多次看到许多人最终在他们的系统上得到两个不同的Samba 副本,因为他们
所安装的第三方RPM 放置二进制文件的位置与Red Hat 不同(也就是,新安装并未覆盖先前的安装)。这个警
告同样适用于任何从源代码安装RPM 的人― 首先卸载任何现有的RPM!
从Red Hat 系统卸载Samba RPM:
[root@pdc root]# rpm -qa | grep samba
samba-common-2.2.3a-3
samba-2.2.3a-3
samba-client-2.2.3a-3
[root@pdc root]# rpm -e samba
安装OpenLDAP
安装OpenLDAP 很容易;如果您进行了标准的服务器安装,就已经完成了三分之二的OpenLDAP 安装工作。
以下是您的“路线图”……在Red Hat 7.2 和7.3 上执行缺省的服务器安装,则会安装openldap-version.rpm
和openldap-clients-version.rpm,但却忽略安装openldap-servers-version.rpm。因此,您应该做的第一件
事就是进行检查,以确保撰写本文以来,Red Hat 的人们没有更改他们的安装策略:
[root@pdc root]# rpm -qa | greg samba
浏览上述操作产生的输出。您应该已经安装了三个RPM:一个常用组件(只是openldap)、一个客户机组件和
一个服务器组件。您可能必须从安装CD 找到服务器RPM 并安装它。没有服务器RPM,您将丢失一些关键配置文
件、模式目录以及实际的LDAP 守护进程。
安装IDEALX Perl 脚本
对于安装而言,最后一些问题是安装由IDEALX 维护的一组脚本。尽管并非绝对必需(您可以总是使用OpenLDAP
提供的实用程序手工插入记录),但在配置和填充服务器时,它们确实使工作变得轻松。实际上除此以外有许多许
多与LDAP 和Samba 进行相互操作的脚本和程序,因此,如果您不喜欢IDEALX 所提供的版本,请在Google 上
进行搜索并找到您喜欢的脚本。
可以从这里获得RPM 格式和TGZ 格式的IDEALX 脚本。将它们下载到硬盘并解压缩到选定的目录。出于本教程
的用途,我们将脚本放置在/usr/local/sbin 中。
现在,所有必需的软件都已就位,我们可以开始配置。
LDAP 配置过程
安装了服务器软件之后,下一步是将OpenLDAP 配置成Samba 的用户认证源。本章讨论下列内容:创建必需的
LDAP 配置文件、添加特定于Samba 的模式、用一些基本项填充LDAP 目录和配置LDAP 以使用PAM(可插入的
认证模块)进行用户认证。
有许多规划LDAP 树的方法。出于本教程的目的,我们创建了如下的DN(专有名称,Distinguished Name)树:
● 我们的顶级DN:dc=syroidmanor,dc=com
● 顶级下面有三个组织单元(ou)
注:不使用影子密码(shadow password)的UNIX 系统不需要shadowAccount 对象;在此类情况下,
posixAccount 对象布局(也是来自于nis.schema)就足够了。
步骤1:复制samba.schema
第一步是将samba.schema 复制到/etc/openldap/schema。
如果从源代码编译Samba,则该文件位于[base-src-dir,通常是,/usr/local/src/samba]/example/LDAP/] 目
录。如果将修改过的RPM 用于安装,则该文件可能(布局因分发版而异)在/usr/share/doc/sambaversion/
examples/LDAP/ 下。
提示:一些较早的Samba 包(2.2.x 之前)在samba.schema 中列出了一种属性类型displayName。这一项复制
了inetorgperson.schema 中的相同项。在此类情况下,通过在关联块的每行前面放置一个井号(#)来编辑
samba.schema 并注释掉displayName 属性类型。
步骤2:编辑/创建slapd.conf
下一步是创建或编辑/etc/openldap/slapd.conf;一些OpenLDAP 安装创建一个基本slapd.conf 文件以用作出
发点,另一些则不是这样。
下一页将讨论下列清单中相关项的说明。
# /etc/openldap/slapd.conf
# last modified, 4/20/02 by TMS
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
include /etc/openldap/schema/nis.schema
include /etc/openldap/schema/redhat/rfc822-MailMember.schema
include /etc/openldap/schema/redhat/autofs.schema
include /etc/openldap/schema/redhat/kerberosobject.schema
include /etc/openldap/schema/samba.schema
pidfile //var/run/slapd.pid
argsfile //var/run/slapd.args
#Sample Access Control
# Allow read access of root DSE
# Allow self write access
# Allow authenticated users read access
# Allow anonymous users to authenticate
access to dn="" by * read
access to *
by self write
by users read
by anonymous auth
# if no access controls are present, the default is:
# Allow read by all
# rootdn can always write
###############################################
############# ldbm database definitions#############
###############################################
database ldbm
suffix "dc=syroidmanor,dc=com"
rootdn "cn=Manager,dc=syroidmanor,dc=com"
rootpw secret
# The database directory MUST exist prior to running slapd AND
# should only be accessibleby the slapd/tools. Mode 700 recommended.
directory /var/lib/ldap
# Indices to maintain
index primaryGroupID eq
index rid eq
index uid eq
index uidNumber eq
index gidNumber eq
index cn pres,sub,eq
index objectClass eq
index default sub
# ends
详细讨论slapd.conf
注:下面的讨论是关于上一页中显示的slapd.conf 的:
● 文件名是slapd.conf,而不是某些人猜想中的sldap.conf。
● slapd.conf 的用途是控制/配置OpenLDAP 服务器守护程序。
● include 语句告知LDAP 服务器为对象存储启用哪种模式;确保您列出了samba.schema。
● 一些模式具有依赖性。许多人没有意识到这一点,他们最后为设法找出其LDAP 服务器不能启动的故障原
因而大伤脑筋。依赖性总是在模式文件(模式文件只是文本;要快速地检查模式文件类型:less
nameofschema.schema)的开始部分列出。例如,samba.schema 依赖于cosine.schema 中uid 属性和
inetorgperson.schema 的displayName 属性;与此相反,core.schema 是“顶级”模式,没有依赖性。
● 请注意关于访问控制的注释― 如果没有访问控制,那么所有用户都只能进行读操作;而rootdn
(cn=Manager)总是可以读/写。
● 项是区分大小写的。“cn=Manager”与“cn=manager”不同。这一事实使得许多管理员成天挠着头皮设法
搞清楚为什么他们不能访问自己的目录。
● rootpw 项正如其名称一样― rootdn 或“Manager”在对目录进行写操作时必须提供的密码。显
然“secret”不是好的选择。好的密码应该混合大、小写和标点符号,并至少有8 个字符长。而且,假
定root 密码是存储在纯文本中,确保小心地保护对该文件的访问,以切实避免它“对全世界都可读”。
大多数安装都正确地配置了该文件,但进行复核没有坏处。在Red Hat 下,OpenLDAP 服务器是作为用户
/组ldap.ldap 运行的。
● database 项确定目录数据的存储格式。取决于为该目录服务的后端类型,这一项可以是ldbm、shell 或
passwd 中的一种。也存在使用象MySQL 或DB2 这样的关系数据库来存储目录对象的选项。请参阅man
slapd.conf 以获取详细信息(请牢记,man 命令是您的朋友!)。通常,对RDBM 的支持需要重新编译
OpenLDAP。
下一步我们将创建/etc/openldap/ldap.conf 文件
步骤3:创建ldap.conf
与/etc/openldap/slapd.conf 相比,/etc/openldap/ldap.conf 相对简单些。ldap.conf 由OpenLDAP 客户机
和库使用。警告:在一些LDAP 配置中,服务器上出现了两个ldap.conf文件:/etc/ldap.conf(由PAM 使用)
和/etc/openldap/ldap.conf(由LDAP 客户机和库使用);不要混淆这两者。
# /etc/openldap/ldap.conf
# LDAP defaults for clients and libraries
# At a minimum, HOST and BASE need to be set
# See man ldap.conf for further settings and options
HOST 127.0.0.1
BASE dc=syroidmanor, dc=com
# ends
其它可用于ldap.conf 的选项包括搜索超时、最大返回搜索大小、连接端口(如果不是缺省的话)和用于通过
Cyrus SASL 进行连接的几个安全性特性。注:每个用户都可以通过创建.ldaprc 并将它放置在自己的主目录中
来指定唯一的设置。管理员也可以通过强制LDAP 只读取/etc/openldap/ldap.conf 文件来覆盖这个选项。
步骤4:启动服务器
最后,启动OpenLDAP 服务器。在基于Red Hat 的系统上,输入/etc/init.d/ldap start。服务器启动时应该
有错误或声明。如果不是这样:
● 验证您装入了正确的模式并满足了所有依赖性。
● 验证/var/lib/ldap 存在并由被指派运行服务器的用户/组(在Red Hat 下是ldap.ldap)所拥有。
● 对所有配置文件的拼写、正确的“dn”项等进行复核。
● 着手阅读LDAP 文档(man ldap、info slapd 和www.openldap.org 是三个不错的起点)。
初始项
既然LDAP 服务器已经在运行了,是用一些初始项填充目录的时候了。有两种进行这一操作的方法:
● 一,使用我们在本教程先前部分下载并安装的smbldap-tools 脚本。
● 二,创建文本文件(base.ldif)并用ldapadd 命令添加项。
我们将从smbldap-tools 方法入手……
使用smbldap-populate.pl
根据第2 章中提供的安装指示信息,首先用“cd”命令进入/usr/local/sbin。您会在那里找到一个名为
mkntpwd.tar.gz 的文件。进行下列操作以解压缩、构建和编译程序:
[root@thor sbin]# tar xvzf mkntpwd.tar.gz
[root@thor sbin]# cd mkntpwd
[root@thor sbin]# make
[root@thor sbin]# make install
# Note: this will place the built executable in /sbin;
# I prefer all my smbldap files together in one place,
# so the following further steps are required.
[root@thor sbin]# cd .. && rm -rf ./mkntpwd (remove the directory
so the file can be copied back)
[root@thor sbin]# mv /sbin/mkntpwd /usr/local/sbin
现在,在您喜欢的文本编辑器里打开/usr/local/sbin/smbldap_conf.pm,然后开始编辑。您将找到略少于一页
的指示信息(## Configuration Start here),它确切地指出了哪些项需要更改。如果您已经脱离了本章先前讨
论的组织单元,则必须更改$usersdn、$computersdn 和$groupsdn 项。此外:
● 在$binddn 下输入dn=Manager 而不是“manager”(如果您采用本教程中所使用的示例的话;关键在于
确保与所有LDAP 和SMBLDAP 工具配置文件上的大小写匹配)。
● 不要忘记对$_userSmbHome/$_userProfile 节中使用的任何反斜杠进行转义操作(“”)。
● 确保到smbpasswd 的路径是正确的(我的项读取/usr/local/samba/bin/smbpasswd)。
● 检查所有属于UID、GID 等的项,以确保所用的项与您的用户/组编号约定匹配。
最后,执行smbldap-populate.pl。如果配置是正确的,脚本将输出一串“adding entry...”资料,并且用一组
基本对象填充目录。如果得到任何“credential”或“cannot bind”错误,则说明smbldap_conf.pm 中某处存
在拼写错误― 回头重新检查您的项。
用LDIF 文件进行手工填充
OpenLDAP 当然可以满足那些喜欢手工执行操作的管理员。填充LDAP 目录的第二种方法是使用LDIF 文件。LDIF
文件是文本文件,具有多个遵循特定格式的项。下面是两个样本目录对象项。
dn: dc=syroidmanor,dc=com
objectClass: domain
dc: syroidmanor
dn: ou=Users,dc=syroidmanor,dc=com
objectClass: top
objectClass: organizationalUnit
ou: Users
description: System Users
用上述格式创建一个名为base.ldif 的文件并创建您希望的对象。将该文件保存到您所选择的目录,然后执行下
列命令:
[root@thor root]# ldapadd -x -h localhost -D "cn=Manager,dc=syroidmanor,dc=com"
-f /root/base.ldif -W
系统将提示您输入“Manager”的密码(在所提供的示例中是“secret”),如果文件中没有语法错误,则用该文
件的内容填充目录。
输入man ldapadd 以获取上述选项开关作用的说明。可在结束语和参考资料一章获取样本base.ldif 文件。
为PAM 认证配置LDAP
如果您选择使用PAM(请牢记先前的警告― PAM 与Samba 和加密密码的合作并不好),则需要配置LDAP 以使
用PAM 进行用户认证(这是个与使用LDAP 认证Samba 用户截然不同的问题)。幸运的是,在Red Hat 下这个
过程很简单,因为有捆绑的程序:/usr/sbin/authconfig/usr/sbin/authconfig。
作为root 用户,从命令行或终端窗口,输入authconfig 并选择下列选项/复选框:
● Cache Information
● Use LDAP
● “不要”选择Use TLS ― 除非您彻底了解您的安全认证协议,否则启动和运行TLS 是一个痛苦的过程
● Your Server 是127.0.0.1(除非LDAP 服务器物理上位于另一个系统上)
● Base DN: dc=syroidmanor,dc=com
● Use Shadow Passwords
● Use MD5 Passwords
● Use LDAP Authentication
● 再次选择,Server: 127.0.0.1
● Base DN: dc=syroidmanor,dc=com
Cache Information 选项意味着使用nscd(名称服务高速缓存守护程序,Name Service Caching Daemon)服
务;它高速缓存频繁使用的LDAP 请求。在最后一个对话框上选择OK 将自动启动nscd 守护程序。最后一个难
题是编辑/etc/ldap.conf 文件。
编辑/etc/ldap.conf
正如本章先前部分所提到的,当使用PAM 认证时,LDAP 使用另一个ldap.conf 文件。打开您喜欢的文本编辑器
并将下列内容添加到/etc/ldap.conf 中:
# /etc/ldap.conf
# LDAP authentication configuration
# last modified, 4/15/02, TMS
host 127.0.0.1
# your LDAP server
base dc=syroidmanor,dc=com
# your DN search base
# point the nss modules to the correct search base
nss_base_passwd dc=syroidmanor,dc=com?sub
nss_base_shadow dc=syroidmanor,dc=com?sub
nss_base_group ou=Groups,dc=syroidmanor,dc=com?one
ssl no
pam_passwd md5
# ends
在上述示例中,因为目录树的组织而使用了“? sub”查询选项;我们选择分离
出“ou=Computers”和“ou=Users”。有关?sub 和?one 选项的更多详细信息,请在因特网上搜索RFC2307。
还可获得一份PDF 文档,它解释了PAM 和NSS 背后的概念和实现;请参阅结束语和参考资料一章以获取更多信
息。
测试
最后,关键时刻到来了― 这一切都有效吗?
转到包含SMBLDAP Perl 脚本的目录;所提供的示例在/usr/local/sbin 中。使用smbldap-tools 创建新用户
时输入下列命令:
[root@thor sbin]# ./smbldap-useradd.pl -m testuser2
adding new entry "uid=testuser2,ou=Users,dc=syroidmanor,dc=com"
[root@thor sbin]# ./smbldap-passwd.pl testuser2
Changing password for testuser2
New password :
Retype new password :
all authentication tokens updated successfully
[root@thor sbin]#
现在,尝试用刚才创建的帐户从另一台计算机登录到系统上。如果正确地配置了一切,则应该正确地认证您:
[tom@phaedrus tom]$ ssh testuser2@thor
testuser2@thor's password:
Last login: Thu Apr 25 11:28:24 2002 from 192.168.1.100
[testuser2@thor testuser2]$ id
uid=1000(testuser2) gid=100(users) groups=100(users)
现在,让我们转过头来研究一下等价的Samba 端。
配置
在完成LDAP 部分的配置之后,所剩下的工作就只是告知Samba 执行用户认证时要使用LDAP 目录服务而不是自
身的密码文件smbpasswd。这是个相对简单的过程,尤其是当假定了这样的起点:我们已经有一个配置正确、功能
正常的Samba PDC。首先,给出一些背景知识说明:
● Samba 将其所有的配置信息存储在一个文件中,这就是smb.conf。这个文件的位置因安装选项而异;缺
省目录是/usr/local/samba/lib。
● 我们的服务器正在进行域认证的域名为SYROIDMANOR(smb.conf 中的“workgroup =”选项)。
● 该服务器的NETBIOS 名是THOR。
● 该服务器被配置成该网络的“主浏览器(master browser)”。
● 该服务器被配置成提供“漫游”概要;它们存储在/home/samba/profiles 下。
● 当用户登录时,位于/home/netlogon 目录中的任何脚本都将运行。
下一步是添加必需的特定于LDAP 的选项。这些选项都放置在smb.conf 的[global] 节中。
LDAP 服务器详细说明
下列配置片段显示了“引导”Samba 将目录服务用于用户认证所需的特定于LDAP 的选项:
;LDAP-specific settings
ldap admin dn = "cn=Manager,dc=syroidmanor,dc=com"
ldap server = localhost
ldap port = 389
ldap ssl = no
ldap suffix = "ou=Users,dc=syroidmanor,dc=com"
● 第一行告知Samba 谁是LDAP 目录的管理员;即Samba 在添加、删除或修改用户帐户时的登录用户。
注:这一项必须与slapd.conf 文件的rootdn 项匹配(要完全匹配― 注意大小写!)。
● 下一行指定了主管LDAP 目录的计算机的名称。在本教程提供的案例中,Samba 和OpenLDAP 位于同一系
统中。如果在您的网络拓扑结构中LDAP 驻留在另一个系统上,则用该计算机的名称替换localhost。也
可以使用静态IP 代替计算机名称。
● 第三行是配置LDAP 服务器“侦听”的端口。端口389 是标准的非加密端口;636 是标准的加密端口。
如果将下一行设置成ldap ssl = on,则Samba 会自动尝试与端口636 上的目录服务器通信。
● ldap ssl 选项决定是否对PDC 和LDAP 服务器之间的通信加密。如果您正在使用SSL 加密,则将ldap
ssl = no 更改成yes(或“on”)。我们不设置成加密通信,因为两种服务都基于同一服务器。
● ldap suffix 是在搜索目录时使用的基本DN。如果除去该选项,则LDAP 将从树顶(即
dc=syroidmanor,dc=com)开始所有搜索。将这个选项设置成常用搜索点(如“Users”)会加快查找时
间。
上一节还可以再添加一条选项:ldap root passwd =。如果有其它选项存在,那么将管理员密码原封不动地留在
配置文件中就决不是一个好主意(在/etc/openldap/slapd.conf 情况下,不存在其它选项)。在这种情况下我
们确实另有选择― 可以将它作为秘密隐藏在tdb 数据库中。
管理秘密
整个练习的目的是将所有用户认证信息存储到一个中央资源库(也即LDAP 目录)中。但是Samba 守护程序必须
代表LDAP 管理员更改那里存储的信息。这意味着Samba 必须知道管理员的密码。我们加密了该密码并将它储存
在只有Samba 能够访问的tdb 数据库中,而不是将该密码放在他人可能“闯入”的文件中。完成这一操作的命
令是:
smbpasswd -w yoursecretpassword
这一操作将创建一个名为secrets.tdb 的文件,在缺省安装的情况下该文件存储在目录/
usr/local/samba/private 中。注:您在上述操作中输入的密码必须与/etc/openldap/slapd.conf 中包含
的“秘密”密码匹配。
脚本更新
我们需要对smb.conf 作的最后的更改是两个选项行,其中一行允许用户从客户机更改其密码,另一行允许在必
要时自动添加机器帐户。下面是这两个选项行:
;password sync
passwd program = /usr/local/sbin/smbldap-passwd.pl -o %u
passwd chat = *New*password* %n *Retype*new*password*
%n *passwd:*all*authentication*tokens*updated*
unix password sync = Yes
;automatically add trust accounts
add user script = /usr/local/sbin/smbldap-useradd.pl
-m -d /dev/null -g computers -s /bin/false
如您所见,我们只是用本教程中先前安装的Perl 脚本替换了/usr/local/samba/bin/smbpasswd 命令。之所以
这样更改,是因为smbpasswd 不知道如何与LDAP 服务器交互;而取代它的Perl 脚本则知道。下一页是完整的
smb.conf 清单。
完整的smb.conf
# /usr/local/samba/lib/smb.conf
# samba configuration file
# last updated: 4/19/2002 by tms
[global]
;basic server settings
workgroup = SYROIDMANOR
netbios name = THOR
server string = Samba-LDAP PDC running %v
socket options = TCP_NODELAY IPTOS_LOWDELAY SO_SNDBUF=8192 SO_RCVBUF=8192
;PDC and master browser settings
os level = 64
preferred master = yes
local master = yes
domain master = yes
wins support = yes
;security and logging settings
security = user
encrypt passwords = yes
log file = /var/log/samba/log.%m
log level = 2
max log size = 50
hosts allow = 127.0.0.1 192.168.1.0/255.255.255.0
;password sync
passwd program = /usr/local/sbin/smbldap-passwd.pl -o %u
passwd chat = *New*password* %n *Retype*new*password* %n
*passwd:*all*authentication*tokens*updated*
unix password sync = Yes
;LDAP-specific settings
ldap admin dn = "cn=Manager,dc=syroidmanor,dc=com"
ldap server = localhost
ldap port = 389
ldap ssl = no
ldap suffix = "ou=Users,dc=syroidmanor,dc=com"
;user profiles and home directory
logon home = \%L\%U
logon drive = H:
logon path = \%Lprofiles\%U
logon script = netlogon.bat
;automatically add trust accounts
add user script = /usr/local/sbin/smbldap-useradd.pl
-m -d /dev/null -g computers -s /bin/false
# ==== shares ====
[homes]
comment = Home Directories
valid users = %S
browseable = no
writeable = yes
create mask = 0664
directory mask = 0775
[profiles]
path = /home/samba/profiles
writeable = yes
browseable = no
create mask = 0600
directory mask = 0700
[netlogon]
comment = Network Logon Service
path = /home/netlogon
read only = yes
browseable = no
write list = tom
扔掉开关……
关键时刻已经来到……现在是测试您手艺的时候了。在控制台(或控制台窗口中)以root 用户输入(在Red
Hat 系统上,一些分发版对其初始化脚本使用不同的布局):
/etc/init.d/smb start [或者如果Samba 已经运行,restart]
使用Samba 总是很容易知道您是否拼错了选项或参数― 守护程序将在没有任何错误警告的情况下启动和退出。
这就是为什么总是在ps -ef | grep smb 命令后面跟上Samba start|restart 是个好主意的原因。您应该看到
至少一个smbd 和一个nmbd 守护程序正在运行。
如果Samba 启动失败:
● 输入testparm(或者/usr/local/samba/bin/testparm,因Samba 安装而异)并检查输出。如果有语法
错误,testparm 将指出它出现的行号。
● 检查您的网络连接(以root 用户运行ifconfig -a);Samba 在运行之前需要检查活动的网络接口。
● 检查Samba 日志以获取任何内部信息。日志位置也是取决于构建时的配置;在缺省编译上,您会在/
usr/local/samba/var 下找到它们。
接下来我们将研究使用IDEALX 脚本编制实用程序进行帐户管理。
管理Samba 用户
在开始执行将用户添加到LDAP 目录的实际操作之前,迅速复习一下与用户/机器帐户有关的Samba 规则以及这
些规则是如何在访问LDAP 存储时规范Samba 的行为,这样做是没有坏处的。
● 规则一:在可以将用户添加到smbpasswd 密码文件之前,该用户必须在托管Samba 服务的系统上拥有
UNIX/Linux 帐户(通常存储在/etc/passwd 中)。如果您尝试使用/usr/local/samba/bin/smbpasswd
实用程序添加用户帐户,则会被告知这种情况。如果您尝试用smbldap-useradd.pl 脚本添加用户(我们
将稍后讨论它),则不会获得这一情况的警告。
● 规则二:如果您尝试用前面提到的Perl 脚本添加用户帐户(对于用户,我的意思是说用户帐户或机器帐
户),则会为上述用户在LDAP 目录中创建POSIX 帐户。然后,该用户就能够登录到通过该LDAP 服务
器进行认证的任何基于POSIX 的机器上。这个用户将不能访问任何由该LDAP 服务器认证并由Samba 服
务器托管的Samba 共享。这是因为该用户存在于LDAP 树的posixAccount 分支中,而不是在
sambaAccount 分支中。
● 规则三:(该规则是上述的规则一和二的结合),如果希望用户同时在LDAP 服务器上具有POSIX 帐户
和Samba 帐户,则首先确保它们在Samba 服务器上拥有现成的系统帐户,然后用smbldap-useradd.pl
将它们添加到LDAP 目录。
LDAP 的帐户结构
迄今为止,我们对LDAP 帐户结构的大多数讨论,都太过理论化了。为了进一步了解LDAP 下的POSIX 帐户和
Samba 帐户的差异,同时为了更详细地说明前一页中讨论的帐户创建过程,让我们研究一个示例。下面显示了一位
用户的LDIF(LDAP 目录信息文件,LDAP Directory Information File)输出,该用户是用下列命令创建的:/
usr/local/sbin/smbldap-useradd.pl -m -P tom (“-m”基于/etc/skel 中包含的模板创建用户目录和概
要;“-P”在添加了该用户之后提示输入密码)。要产生实际LDIF 输出:/usr/local/sbin/smbldapusershow.
pl tom
[root@thor sbin]# /usr/local/sbin/smbldap-usershow.pl tom
dn: uid=tom,ou=Users,dc=syroidmanor,dc=com
objectClass: top
objectClass: account
objectClass: posixAccount
cn: tom
uid: tom
uidNumber: 500
gidNumber: 100
homeDirectory: /hometom
loginShell: /bin/bash
gecos: User
description: User
userPassword:: e1NTSEF9bWxBL1RHZFNoTkREEWlGTndZOFlCWUVUdWp3MGgrbTc=
接下来,让我们将另一个用户添加到同一用户项,并执行下列操作:
root@thor root # useradd -p test tom2
root@thor root # /usr/local/samba/bin/smbpasswd tom2
New SMB password: typesecretpassword
Retype new SMB password: typesecretpassword
User added
All authentication tokens updated
root@thor root #
现在,如果输入/usr/local/sbin/smbldap-usershow.pl tom,则获得下列输出:
dn: uid=tom,ou=Users,dc=syroidmanor,dc=com
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: sambaAccount
cn: tom
uid: tom
uidNumber: 500
gidNumber: 100
homeDirectory: /hometom
loginShell: /bin/bash
gecos: User
description: User
userPassword:: e1NTSEF9bWxBL1RHZFNoTkREEWlGTndZOFlCWUVUdWp3MGgrbTc=
lmPassword: 552902031BEDE9EFAAD3B435B51404EE
pwdCanChange: 0
pwdMustChange: 2147483647
ntPassword: 878D8014606CDA29677A44EFA1353FC7
pwdLastSet: 1010179230
rid: 2000
如您所见,用户tom 的LDIF 现在同时具有posixAccount 详细信息和sambaAccount 信息。
侧栏:uid、gid 和RID
您也许在Samba 文档或者可能是在LDAP 帐户的输出中见到过对术语RID 的引用。那么什么是RID 呢?UNIX
操作系统(包括象Linux 这样的派生物)通过整数uid(用户标识,User ID)唯一地标识用户,并通过整数
gid(组标识,Group ID)唯一地标识组。当以某一用户登录时,通过输入id 即可访问这个信息。
当前的Microsoft 操作系统通过称为RID 的值唯一地标识用户和组,该值通常是一个用十六进制表示的整数。
在UNIX 下,用户和组存在于独立的名称空间中。而在Microsoft 操作系统上,用户和组存在于一个名称空间
中。
Samba 使用下列公式将UNIX uid 和gid 映射为RID:
rid = 2 (uid) + 1000
rid = 2 (gid) + 1001
因此,如果工作在Red Hat 系统上的用户tom,其uid 为500,gid 为500,则映射到Microsoft 域中的RID
分别为2000 和2001。
结束语
这样您就拥有了它― 一个完全配置的、将为Samba PDC 提供用户认证的OpenLDAP 服务器。或者至少假定您最
终得到了。这并非取笑您,毫无疑问,本教程中所包含内容所处的环境,会因为某些原因而对某些人无效。还记得
我们先前在收集和构建必需的软件中讨论的开放源码软件的选择么?有时,选择是一把双刃剑。选择也增加了一层
复杂性,因为并非“条条大路通罗马”。因此我们修修补补,最终找到一个解决方案― 但最终,它也可能只比原
始方案更好些。然后,本着开放源码模型的精神,我们又将那些解决方案回报给社区。
因为本教程中的主题范围所限,所以不能讨论某些背景资料。例如,我们在本教程开始时假定您已经有效地启动
和运行了Samba PDC;我们还假定您对LDAP 幕后的术语和概念有基本的理解。如果您发现自己对LDAP/Samba
的了解有一些缺陷,则请看一看后两页中列出的参考资料。它们包含一些优秀的背景材料和深入的看法,即使是对
于经验丰富的管理员,这些参考资料也肯定会使他们受益匪浅。
我相信,您已经发现此处提供的参考资料对于您的特定实现是有用和有益的。与往常一样,感谢提出意见、指出缺
点和勘误。请填写最后一页的反馈表单,或者直接给我发邮件([email protected])。
更多的参考资料:LDAP 和OpenLDAP
下列参考资料将引导您开始理解和实现LDAP 目录服务的旅程:
● 到www.openldap.org 查找关于OpenLDAP 项目一切权威的资料来源。您不仅可以在此处找到最新
OpenLDAP 发行版(当撰写本文时是2.0.23),而且可以找到许多好文档。特别地,查看OpenLDAP 2.0
Administrator's Guide。
● 在巨大的万维网上,有无数关于LDAP 配置和实现的参考资料。打开您喜欢的浏览器,上Google.com 输
入“LDAP and OpenLDAP”作为搜索短语,以获取内容广泛的列表。真正的窍门在于分清良莠。我所发现
的两个特别有用的参考资料是Meer 和Biondo 编写的LDAP Implementation HOWTO,以及YoLinux
LDAP Tutorial。YoLinux 教程上还有非常不错的OpenLDAP 链接。另一份好的参考资料是Luiz Ernesto
Pinheiro Malere 编写的LDAP Linux HOWTO。就个人而言,我发现没有一篇HOWTO 向我提供了我所需要
的全部知识,因此,从大量参考资料中获取最有用的信息是很重要的。
● IBM 的红皮书一直是高级的和特定于平台的信息的良好来源。在红皮书站点上的一次简单搜索将为您网罗
40 个以上使用术语“ ldap” 的链接结果。我个人向您推荐的书籍是Understanding LDAP(SG24-4986-
00)和LDAP Implementation Cookbook(SG24-5110-00)。
● Adam Tauno Williams 编写了两份很好的教程,它们详细讲述了如何以及为什么使用PAM 和NSS 认证和
LDAP V3。两者都有PDF 文件。
● 本教程中讨论的名称服务模块nss_ldap 和pam_ldap 是由PADL Software 维护和分发的。
更多参考资料:Samba
与LDAP 类似,Web上的Samba 参考资料也很丰富:
● 正式Samba 站点是www.samba.org。在这里,您会找到最新稳定源代码(各种平台和分发版的RPM 和
TGZ 文件)的最新下载,以及通过CVS 提供的最新开发成果。Samba 站点上的可用文档也很多。尤其是
获取Samba-HOWTO-Collection;它有PDF 和HTML 两种格式。Samba 邮件列表也是经验和信息的很棒的
来源。
● 不要忘记浏览随Samba 一起提供的文档。假定基本安装的目录是/usr/local/samba,则可以在../
swat/using_samba 下找到O'Reilly 的Using Samba 一书的完整文本,并可在../swat/help 下找到一
些有用的HTML 文档。
● 当然,配置Samba 担任Windows 域控制器的权威指南是我编写的将Samba 用作PDC ,该教程目前位于
IBM eServer 开发者园地。
● IDEALX.org 是获取本教程中使用的Samba/LDAP Perl 脚本的地方。同一位置还有一份Samba PDC/LDAP
HOWTO 可下载;但是,它不完整并有很多模糊之处,而且没有反映Samba 的最新功能。
● PADL Software 站点除了托管前面提到的nss_ldap 和pam_ldap PAM 模块外,还有迁移脚本集,您也许
有兴趣查看一下。类似于IDEALX 脚本,它们是用Perl 编写的,PADL 脚本旨在迁移诸如/
etc/hosts、/etc/group、/etc/networks 和/etc/passwd 之类的UNIX 配置文件,而不是针对Samba
用户管理。
● 最后,是Ignacio Coupeau 维护的一篇Samba-PDC LDAP V3 HOWTO。它在许多方面也不完整,但为您指
出了大方向。它还有一些关于配置Samba 以使用SSL 和TLS 进行认证的好参考资料。注:HEAD 补丁
Coupeau 列表已经集成到Samba HEAD CVS 树中。
祝您好运,玩得开心点!