原文地址:
http://www.ibm.com/developerworks/cn/education/linux/smb-ldap/smb-ldap.html
开放源码 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 开发者园地上另一篇题为Using Samba as a 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 发行版将解决这两个问题。
收集和构建必需的软件
关键字就是选择……
如果有一种精神可以实实在在地体现开放源码软件运动的特色,那就是“选择”的观念。我们可以选择不同的分发版,因而又可以选择捆绑软件和多种文件系统布局。我们可以选择不同的软件包管理器和软件分发版 ― 是源代码还是预编译的二进制文件?尽管就其本身而言,所有这些选择的自由都是神圣而光荣的,但它也使提供如何构建复杂的结构(就象一台 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
文件并添加您想要的选项。使用上一页的示例:--with-smbmount --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
中。
现在,所有必需的软件都已就位,我们可以开始配置。
配置 OpenLDAP
LDAP 配置过程
安装了服务器软件之后,下一步是将 OpenLDAP 配置成 Samba 的用户认证源。本章讨论下列内容:创建必需的 LDAP 配置文件、添加特定于 Samba 的模式、用一些基本项填充 LDAP 目录和配置 LDAP 以使用 PAM(可插入的认证模块)进行用户认证。
有许多规划 LDAP 树的方法。出于本教程的目的,我们创建了如下的 DN(专有名称,Distinguished Name)树:
- 我们的顶级 DN:dc=syroidmanor,dc=com
- 顶级下面有三个组织单元(ou)
- ou=Users ― 用来存储用户帐户,对于由 UNIX 和 Windows 系统混合组成的域而言,是 nis.schema 的 shadowAccount 和 samba.schema 的 sambaAccount;对于仅由 Windows 系统组成的域而言,是 samba.schema 的 sambaAcount。
- ou=Computers ― 用来存储 Windows 系统的计算机帐户(sambaAccount)
- ou=Groups ― 用来存储 Windows 系统和基于 UNIX 的系统(以及其它知道 LDAP 的客户机)的用户组(nis.schema 的 posixGroup)。
注:不使用影子密码(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/samba-version/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 端。
配置 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\n *Retype*new*password* %n\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\n *Retype*new*password* %n\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 = \\%L\profiles\%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/smbldap-usershow.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。
结束语和参考资料
更多的参考资料: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 as a 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 树中。
祝您好运,玩得开心点!
反馈
请将您对本教程的反馈发送给我们。我们盼望获得您对本教程的意见!
参考资料
-
这样您就拥有了它 ― 一个完全配置的、将为 Samba PDC 提供用户认证的 OpenLDAP 服务器。或者至少假定您最终得到了。这并非取笑您,毫无疑问,本教程中所包含内容所处的环境,会因为某些原因而对某些人无效。还记得我们先前在收集和构建必需的软件 中讨论的开放源码软件的选择么?有时,选择是一把双刃剑。选择也增加了一层复杂性,因为并非“条条大路通罗马”。因此我们修修补补,最终找到一个解决方案 ― 但最终,它也可能只比原始方案更好些。然后,本着开放源码模型的精神,我们又将那些解决方案回报给社区。
因为本教程中的主题范围所限,所以不能讨论某些背景资料。例如,我们在本教程开始时假定您已经有效地启动和运行了 Samba PDC;我们还假定您对 LDAP 幕后的术语和概念有基本的理解。如果您发现自己对 LDAP/Samba 的了解有一些缺陷,则请看一看后两页中列出的参考资料。它们包含一些优秀的背景材料和深入的看法,即使是对于经验丰富的管理员,这些参考资料也肯定会使他们受益匪浅。
我相信,您已经发现此处提供的参考资料对于您的特定实现是有用和有益的。与往常一样,感谢提出意见、指出缺点和勘误。请填写最后一页的反馈表单,或者直接给我发邮件(ibm-feedback@syroidmanor.com)。