转贴 [url]http://linux.chinaitlab.com/administer/775180.html[/url]

长久以来Linux和 Windows一直对立存在并快速发展着,企业中的应用也逐渐分为两大阵营。它们彼此既不互相竞争,也不互相协作。虽然 Windows与Linux之间的竞争水火不容,但目标都希望为公司提供高质量且经济高效的IT服务。作为企业IT管理者,实现此目标的方法之一是共享Active Directory。几乎所有的IT组织都采用Active Directory,为它们的Windows桌面和 服务器提供身份验证服务。与其针对Linux环境维护一个不同的身份验证基础结构(加上一组不同的用户名和密码),还不如让Linux计算机也采用Active Directory,这样岂不是更好?本文中向您介绍如何实现这一目的。
  Windows身份验证
  Windows推出集成网络身份验证和单一登录系统至今已有一段时间了。在Windows 2000之前,Windows NT域控制器(DC)使用NT LAN Manager (NTLM) 协议为 Windows客户端提供身份验证服务。虽然NTLM不像当初想象的那样 安全,但它还是非常有用的,它完美地解决了需要在网络上跨多个 服务器维护重复用户帐户的问题。
  自Windows 2000开始,Microsoft便从NTLM移到了Active Directory及其集成Kerberos身份验证服务。与NTLM相比,Kerberos更 安全,而且更适合调整。此外,Kerberos更是Linux和UNIX系统早已采纳的行业标准,从而为这些平台打开了与Windows集成的大门。
  Linux身份验证
  Linux(以及在其上面运行的GNU 工具和库)当初并不是以单一身份验证机制的设计理念进行构建的。因此,Linux 应用程序开发人员就逐渐养成了一种习惯,即创建属于自己的身份验证方案。他们设法通过在/etc/passwd中查询名称和密码哈希,或者提供截然不同 (和个别)的机制,来实现这一目标。
  由此产生了很多身份验证机制,以至于无法对其进行管理。1995年,Sun提出了称为“可插入身份验证模块”(Pluggable Authentication Modules, PAM) 的机制。PAM提供了一组所有应用程序开发人员都可以使用的通用身份验证API,以及管理员配置的后端,允许多种“可插入”身份验证方案。通过使用 PAM API 进行身份验证以及使用Name Server Switch (NSS) API来查询用户信息,Linux应用程序开发人员可以少编写一些代码,并且Linux管理员可从同一个地方配置和管理身份验证过程。
  大多数Linux发布版本都会随附多个PAM身份验证模块,其中包括支持对LDAP目录进行身份验证和使用Kerberos进行身份验证的模块。用户可以使用这些模块对Active Directory进行身份验证,但这其中存在一些明显的限制。
   Samba和Winbind
  Samba是一种开放源代码项目,旨在在Windows与Linux环境之间提供集成。Samba包含的组件使Linux计算机有权访问 Windows文件和打印服务,同时还提供了基于Linux的服务来模拟Windows NT 4.0 DC。使用Samba客户端组件,Linux计算机便可利用Windows NT和Active Directory DC 所提供的Windows 身份验证服务。
  Samba 在这个项目中对我们来说最有趣的一部分叫做Winbind。Winbind 是在Samba客户端上运行的后台程序(在Windows中称为服务),它的作用是充当在Linux计算机上运行的PAM和NSS与在DC上运行的 Active Directory之间通信的代理。具体来说,Winbind 使用Kerberos来对Active Directory和LDAP进行身份验证,以检索用户和组信息。Winbind 还提供其他服务,如使用类似于Active Directory中DCLOCATOR的算法来查找DC的功能,以及通过使用RPC与DC进行通信来重置Active Directory密码的功能。
  Winbind解决了多个仅使用Kerberos和PAM无法解决的问题。具体来说,Winbind并不是将DC进行硬编码以便按照PAM Kerberos模块的方式进行身份验证,而是以类似于Microsoft DC LOCATOR模块运行的方式通过搜索 DNS 定位程序记录来选择DC。
   三种身份验证策略
  假设Linux计算机上提供了LDAP、Kerberos 和 Winbind 三种身份验证,我们可以采用三种不同的实现策略允许Linux计算机使用Active Directory来进行身份验证。
  使用LDAP身份验证使用Active Directory进行身份验证的最简单但成效最低的方法是,将PAM 配置为使用 LDAP 身份验证,如图1 所示。虽然 Active Directory 属于 LDAPv3 服务,但 Windows 客户端使用Kerberos(回退到 NTLM)而不是 LDAP 进行身份验证。
  LDAP身份验证(称为 LDAP 绑定)通过网络以明文形式传递用户名和密码。对于大多数用途来说,这不仅不安全,而且也是无法接受的。
  图1 使用 LDAP 对 Active Directory 进行身份验证

 
     降低以明文形式传递凭据的风险的唯一方法是使用类似于SSL 的 协议加密客户端与Active Directory 进行通信所使用的通道。这绝对可行,但会增加在DC和Linux计算机上管理 SSL 证书的负担。此外,使用 PAM LDAP 模块并不支持更改已重置的或过期的密码。
  使用 LDAP 和 Kerberos 利用 Active Directory 进行 Linux 身份验证的另一种策略是,将 PAM 配置为使用 Kerberos 身份验证,以及将 NSS 配置为使用 LDAP 查找用户和组信息,如图 2 所示。此方案的优点是,它相对来说比较安全,而且它利用的是 Linux 的“内置”功能。但是它不利用 Active Directory DC 发布的 DNS 服务位置 (SRV) 记录,所以您会被迫挑选一组特定的 DC 来进行身份验证。对于管理即将过期的 Active Directory 密码或是直至最近的适当组成员身份查询,它提供的方法也不是很直观。
 
  
  图2 使用LDAP和Kerberos对Active Directory进行身份验证
    
    使用Winbind、 Active Directory进行 Linux 身份验证的第三种方法是,将PAM和NSS配置为调用Winbind后台程序。Winbind 将使用LDAP、Kerberos 或 RPC(使用其中最合适的一个),将不同的PAM和NSS请求转换为相应的Active Directory调用。图3说明了这一策略。
  图3 使用 Winbind 对 Active Directory 进行身份验证

实施计划
  由于与Active Directory 的集成的增强,我选择在Red Hat Enterprise Linux 5 (RHEL5) 上使用Winbind 来进行我的Linux与Active Directory 集成项目。RHEL5是最新的商用Red Hat Linux 发布版本,而且它在企业数据中心中相当受欢迎。
  使RHEL5 对 Active Directory 进行身份验证基本上需要下列五个不同的步骤:
  ·查找并 下载适当的 Samba 以及其他依存组件。
  ·构建 Samba。
  ·安装并配置 Samba。
  ·配置 Linux,特别是 PAM 和 NSS。
  ·配置 Active Directory。
  本文的下面几节将详细介绍这些步骤。
   查找适当的软件
  Linux 与 Windows 之间最大的区别之一是,Linux 由一个小型操作系统内核和大型的可单独 下载和 安装的组件集构成。这虽然可以创建为某些任务而进行优化的特定 Linux 配置,但也会使服务器的配置和管理变得极为复杂。不同的发布版本处理这种情况的方式也不一样。Red Hat(及其非商用版 Fedora)使用 Red Hat Package Manager (RPM) 来安装和管理这些组件。
  适用于 Red Hat 的 Linux 组件包含两种形式。RPM 文件包含针对组件版本、Linux 发布版本和 CPU 体系结构的特定组合而预先编译和构建的二进制文件。因此,您可以 下载和 安装二进制文件,例如,针对在 Intel x86 体系结构 CPU 上运行的 Fedora 版本 10 构建的通用 UNIX 打印系统 (Common UNIX Printing System, CUPS) 的 1.3.8-5 版本。假如有十多种不同的 CPU 体系结构、100 多个 Linux 发布版本,还有上千个程序包和版本,则要选择的二进制 RPM 的数量之多便可想而知。
  另一方面,源 RPM 文件包含给定程序包的实际源代码。但您需要自己下载和安装源、配置构建选项,以及编译和链接二进制文件。构建您自己的操作系统组件这一想法使习惯于 Microsoft 在 Windows 安装 CD 上提供什么就安装什么的 Windows 用户十分畏怯,但是程序包管理器可使整个过程相当轻松,而且非常可靠。Samba 小组发布更新和安全修补程序的速度惊人,仅在 2008 年七、八月两个月内,就发布了四个版本的 Samba 3.2,总共包含 100 多个错误和安全修补程序。对于此项目,我下载了最新的 Samba 稳定版本 3.0.31 版的源。
  为什么要下载 Samba 源,而不下载预先编译的二进制文件集呢?当然,我刚开始也尝试过这么做,但在调试器上花了数小时之后,我发现下载的二进制文件并不是使用支持 Active Directory 身份验证的正确选项构建而成的。具体来说,在 Active Directory 中支持 Linux ID 映射的代码在默认版本中被关闭了,因此我必须使用适当的构建选项重建 Samba。稍后,我将在本文中详细讨论 ID 映射。
  虽然 Linux 原本是小型内核,但 Red Hat Enterprise 发布版本预先安装了许多程序包。这通常会使生活变得更轻松,因为您从完全正常运行的操作系统开始着手,但预先安装的程序包有时会与您以后想要安装的软件发生冲突。
  我在安装 Red Hat 时,因为想要使用较新的版本,所以并没有包含 Samba(通常会默认安装 Samba)。但是,较新版本的 Samba 要求已安装的几个其他库和实用工具也要使用新版本。这类的依赖问题非常烦人,不过,使用 RPM 就可以轻松解决。
  承载二进制 RPM 程序包的网站很多。我使用的网站(勿庸置疑,是我找到的第一个网站)称为 PBONE,网址为 rpm.pbone.net。该网站提供了搜索程序包的简便方法,并且具有我的 CPU 体系结构 (i386) 和操作系统发布版本 (Red Hat Enterprise Linux 5/Fedora 7&8) 所需的所有二进制文件。
  我必须下载和更新程序包来构建和安装最新的 3.0 版 Samba(但我从未尝试过较新的 3.2 版)。请注意,这些程序包主要针对 Fedora Core (fc) 发布版本。Red Hat 以 Fedora 使用的相同源为基础,而且完全可与它交互。针对 Fedora Core 7 及更高版本构建的程序包,不需要任何修改即可在 RHEL5 上运行。请将下载的 RPM 文件放在 /usr/src/redhat/RPMS 目录中。
  构建和安装 Samba 3.0.31 所需的程序包:
  
      samba-3.031-0.fc8.src.rpmSamba 3.0.31 源 RPM
  gnutls1.6.3-3.fc7.i386GNU 传输层安全性 (TLS) 库
  gnutils-devel-1.6.3-3.fc7.i386GNU TLS 开发文件
  popt-1.12-3.fc8.i386命令行参数分析库
  popt-devel-1.12-3.fc8.i386命令行参数分析开发文件
  cups-libs-1.2.12-11.fc7.i386通用 UNIX 打印机系统库
  cups-devel-1.2.12-11.fc7.i386通用 UNIX 打印机系统开发文件
  cups-1.2.12.11.fc7.i386通用 UNIX 打印机系统二进制文件

    构建Samba
  构建 Samba 的第一歩是下载适当的源 RPM。我从 PBONE 站点下载了 Samba 3.0.31 的源 RPM。然后,将下载的源 RPM 文件放到 /usr/src/redhat/SRPMS 中,这是构建过程中用于源 RPM 的标准目录。
  打开终端会话(在 Windows 中称为命令行窗口)并移至 SRPMS 文件夹。完成后,使用该命令安装源程序包,如图4所示。
 
   
 图4 安装 Samba 源 RPM
    
    如果您看到“用户 mockbuild 不存在,请使用根”错误警告,请不要担心。这个错误指出尚未安装 Mock 构建实用工具,但没有这些实用工具,构建过程也可以进行。
  然后,移至 /usr/src/redhat/SPECS 目录并编辑文件 SAMBA.SPEC,该文件包含了 Samba 构建选项。搜索以“CFLAGS=”开头的那一行,并确保存在“--with-shared-modules=idmap_ad,idmap_rid”选 项。此选项可确保构建过程包含将 Linux UID(唯一标识符)适当转换到 Active Directory 的代码。图5显示了此选项。
 
   图5 with-shared-modules 构建选项
    
    接下来,您可能必须更新计算机上的一些库,才能适当构建和安装 Samba,具体取决于您安装的是哪个版本的库。在我的例子中,我必须使用 rpm --install 命令安装图 4 中列出的程序包;在某些情况下,我必须使用 --force 选项来克服一些依赖问题。
  要构建 Samba,请移至 /usr/src/redhat 目录,并运行命令 rpmbuild –bb SPECS/samba.spec,如图6所示。此过程将新的 samba-3.0.31-0.i386 RPM 文件留在 /usr/src/redhat/RPMS 目录中。我们稍后将在此项目中安装这个 RPM 文件。
 
   
  图6 创建 Samba 二进制 RPM 文件
配置 Linux 网络
  为了使用 Active Directory 进行身份验证,您的 Linux 计算机必须能够与 DC 通信。您必须配置三个网络设置才能与 DC 通信。
  首先,重要的是通过使用动态主机配置 协议 (DHCP) 或使用 ifconfig 命令为 Linux 计算机分配适当的 IP 地址和网络掩码,来确保适当配置该计算机的网络接口。在 RHEL5 下,通过从“系统”|“管理”菜单中选择“网络”来配置网络,如图7所示。
 
   
  图7 配置网络
    
    接着,确保将 Linux 计算机的 DNS 解析程序设置为与 DC 使用相同的 DNS 名称服务器;在大多数情况下,假定您要使用 Active Directory 集成的 DNS,则该 DC 是您想要加入 Linux 计算机的域中的 DC。在用于配置网络的相同网络配置实用工具的 DNS 选项卡上,配置 DNS 解析程序,如图8所示。
 
 
  图8 设置主 DNS 解析程序
    
    最后,完成上述步骤后,您必须设置 Linux 计算机的主机名称以反映它在域中的名称。虽然您可以使用网络配置应用程序设置主机名称,但这一方法不一定始终适用。
  但是,可直接编辑 /etc/hosts 文件,并在具有 <主机名称> 形式的 localhost.localdomain 条目下添加条目。(例如,“10.7.5.2 rhel5. linuxauth.local linuxauth”)。请注意,如果不这么做,当您将 Linux 计算机加入到域后,会在目录中创建错误的计算机对象。
  配置Linux 时间同步
  Kerberos 协议需要身份验证系统具有能在相对较小的时间内同步的时钟。默认情况下,Active Directory 可允许的偏差时间最长为五分钟。为了确保您的 Linux 系统与 DC 的系统时钟维持在这个时间内,您应该将 Linux 系统配置为使用 DC 的网络时间协议 (NTP) 服务。
  然后,在 Linux 服务器上,从“系统”|“管理”菜单中运行日期与时间实用工具,然后单击“网络时间协议”选项卡。选中“启用网络时间协议”框,然后添加您要用作网络时间 源的 DC 的 IP 地址。请注意,这通常应该是在域中担任主域控制器 (PDC) 仿真器灵活单主机操作 (FSMO) 角色的 DC。图9显示了如何设置 Linux 网络时间源的一个示例。
 
  图9 配置网络时间协议

配置PAM和NSS
  PAM和NSS提供Linux 应用程序(如桌面)与Winbind之间的联系媒介。与许多Linux 服务一样,您可以通过文本文件来配置 PAM 和 NSS。我们先来讨论一下如何配置 PAM。
  PAM 为使用它的应用程序提供了四个与身份验证相关的功能。身份验证设施允许应用程序确定使用它的用户。帐户设施提供的帐户管理功能(如登录时间限制)与身份验 证并不是特别相关。密码设施提供请求和管理密码的机制。会话设施执行与用户相关的安裝和应用程序的拆卸任务,例如,在用户特定的目录中记录或创建文件。
  Red Hat 下的 PAM 将它的配置文件 存储在 /etc/pam.d 目录中,其中包含使用 PAM 进行身份验证的每个应用程序的文本文件。例如,文件 /etc/pam.d/gdm 包含 Gnome Desktop Manager (GDM) 的 PAM 配置信息,即 Red Hat 的默认窗口运行环境。每个 PAM 配置文件都包含多行内容,其中每行分别定义 PAM 身份验证过程的某个方面。图10显示了 GDM 的 PAM 配置文件的内容。
 
 
  图10 Gnome Desktop Manager 的 PAM 配置文件
    
    PAM 配置文件中的每个项目都具有 <管理组> <控制> <模块> <参数> 的形式,其中 <管理组> 对应于配置条目所属的设施:身份验证、帐户、密码或会话。该文件的第三栏包含 /lib/security 目录中的 PAM 共享库的名称。共享库包含可动态加载的可执行代码,类似于 Windows 中的 DLL。模块名称后的其他术语都是 PAM 传递到共享库的参数。
   PAM 控制关键字
   Required如果模块成功,则 PAM 将继续评估管理组的其余项目,并且结果将由其余模块的结果决定。如果模块失败,PAM 将继续评估,但向调用应用程序返回失败消息。
   Requisite如果模块成功,PAM 将继续评估管理组条目。如果模块失败,PAM 将返回到调用应用程序,并且不做进一步处理。
   Sufficient如果模块成功,PAM 将向调用应用程序返回成功消息。如果模块失败,PAM 会继续评估,但结果将由后续模块决定。
   Optional除非模块是为管理组指定的唯一模块,否则 PAM 将忽略模块的结果。
   IncludePAM包括引用的 PAM 配置文件的内容,并且还会处理该配置文件包含的条目。
  您可以看到每个管理组都包含多个条目。PAM 按照调用命名的模块的顺序处理条目。然后,该模块返回成功或失败消息,而 PAM 将继续根据控制关键字进行评估。
  您可能会注意到,GDM 的 PAM 配置文件在它的所有管理组中都包含系统身份验证。这正是 PAM 为 GDM 建立默认身份验证行为的方式。通过修改系统身份验证,您可以修改在其 PAM 配置中包含系统身份验证文件的所有应用程序的身份验证行为。图11中介绍了默认系统身份验证文件。
 
  图11 PAM 系统身份验证文件
    
    Name Service Switch (NSS) 模块将隐藏系统数据 存储的 详细信息以防应用程序开发人员看见,这与 PAM 隐藏身份验证的详细信息的方式大体相似。NSS 允许管理员指定存储系统数据库的方式。具体来说,管理员可以指定如何存储用户名和密码信息。因为我们希望应用程序使用 Winbind 在 Active Directory 中查询用户信息,所以我们必须修改 NSS 配置文件才能显示此信息。
  Red Hat 包含一个小型的图形小程序,可用来配置 PAM 和 NSS,称为 system-config-authentication。它负责管理您需要对系统身份验证和 nss.conf 文件进行的大部分(而非全部)更改。
  运行 system-config-authentication 应用程序后,您会看到如图12 所示的对话框。选中“用户信息”(用于配置 nss.conf 文件)和“身份验证”(用于修改系统身份验证文件)这两个选项卡上的 Winbind 选项。
 
   
  图12 systemconfig-authentication 对话框
    
    单击“配置 Winbind”按钮,您将看到如图13所示的对话框。在 Winbind 域字段中输入要对用户进行身份验证的域的名称,并选择“ads”作为安全模式。在 Winbind ADS 领域字段中输入 Active Directory 域的 DNS 域名称。在 Winbind 域控制器字段中,输入您希望该 Linux 系统对其进行身份验证的 DC 的名称,也可以输入星号,表明 Winbind 应通过查询 DNS SRV 记录来选择 DC。
 
   
  图13 配置 Winbind 对话框
    
    选择您的 Active Directory 用户应该具有的适当默认命令行界面,在本例中,我选择的是 Bourne-again Shell 或 BASH。此时,不要按下“加入域”按钮,稍后,再将此计算机加入到域。
  在将 /etc/pam.d/system-auth 文件修改为支持 Winbind 后,还需要对其进行另一个更改。当 Linux 用户登录时,系统要求该用户必须拥有主目录。主目录包含许多用户特定的首选项和配置条目,与 Windows 注册表非常相似。问题在于,因为您要在 Active Directory 中创建用户,所以 Linux 不会自动为用户创建主目录。幸运的是,您可以将 PAM 配置为在其会话配置期间为用户创建主目录。
  打开 /etc/pam.d/system-auth 文件,然后向下滚动到底部,在标有“session optional map_mkhomedir.so skel=/etc/skel umask=0644”会话部分中的最后一行之前插入一行(请参见图14)。这一行将 PAM 配置为创建用户的主目录(如果用户没有主目录)。它将目录 /etc/skel 用作“框架”或模板,而且将权限掩码 0644(所有者具有的读写权限、主要组具有的读取权限,以及其他人具有的读取权限)分配给新文件夹。
 
   
  图14 为用户创建主目录

安装和配置Samba
  要安装您刚刚创建的 Samba 二进制文件,请转至 /usr/src/redhat/RPMS 目录。由 rpmbuild 命令创建的所有 RPM 文件都会显示在此目录中。请记住,Samba 包括允许 Linux 客户端访问 Windows(或 Samba)文件共享的二进制文件,以及允许 Linux 系统充当 Windows 文件服务器、Windows 打印机服务器和 Windows NT 4.0-style DC 角色的代码。
  要让 Linux 对 Active Directory 进行身份验证,我们根本用不到这么多角色,其实我们只需要使用 Samba 公共文件和 Samba 客户端二进制文件就可以了。为了方便起见,这些文件可为两个 RPM 文件:samba-client-3.0.31-0.i386.rpm 和 samba-common-3.0.31-0.i386.rpm。使用 rpm --install 命令安装 RPM 文件,请看下面的示例:rpm --install samba-common-3.0.31-0.i386.rpm。(请注意,您需要先安装 –common RPM 文件。)
  安装了Samba 客户端二进制文件后,您必须修改默认 Samba 配置,以确保 Winbind 使用 Active Directory 适当处理身份验证。所有 Samba 配置信息(包括客户端和服务器)都可以在 smb.conf 文本文件中找到,该文件在默认情况下位于 /etc/samba 目录中。Smb.conf 可能包含大量配置选项,本文只会对其内容进行简要介绍。samba.org 网站和 Linux 主页简要讨论了 smb.conf。
  第一步是将 Winbind 配置为使用 Active Directory 进行身份验证。您必须将 smb.conf 中的安全模式设置为“ads”。system-config-authentication 实用工具应该已经帮您设置好了,但检查一下总是比较保险。编辑 smb.conf 文件,并搜索标有“域成员选项”的部分。找出以“security”开头的那一行,并确定它的内容是“security = ads”。下一个配置步骤是确定 Winbind 如何将 Windows 安全主体(如用户和组)映射到 Linux 标识符,这需要进行进一步的说明。
   ID 映射问题
  通过 Active Directory 对 Linux 用户进行身份验证时有个大问题我还没有提到,那就是用户和组的 UID 问题。Linux 和 Windows 在内部都不是根据用户名来引用用户的,而是使用唯一的内部标识符。Windows 使用安全标识符(即 SID),它能够唯一标识 Windows 域中的每个用户,其结构长度可以变化。SID 也包含唯一域标识符,以便 Windows 区别不同域中的用户。
  Linux 的方案则简单得多,Linux 计算机上的每个用户都有一个 UID,而此 UID 只是一个 32 位的整数。但是 UID 的范围受限于计算机本身。在某台 Linux 计算机上具有 UID 436 的用户,不一定与另一台 Linux 计算机上具有 UID 436 的用户相同。因此,用户必须登录他需要访问的每台计算机,这显然不是理想的情况。
  Linux 网络管理员解决此问题的常用方法是,使用 Network Information System (NIS) 或共享 LDAP 目录来提供网络身份验证。网络身份验证系统提供用户的 UID,而使用该身份验证系统的所有 Linux 计算机都将共享相同的用户和组标识符。在这种情况下,我将使用 Active Directory 来提供唯一的用户和组标识符。
  要解决此问题,我可以采用两种策略。第一个(也是最明显的)策略是,为每个用户和组创建 UID,并将该标识符与各自的对象一起存储到 Active Directory 中。这样一来,当 Winbind 对用户进行身份验证时,它就可以查询该用户的 UID,然后将它提供给 Linux 作为该用户的内部标识符。Winbind 将此方案称为 Active Directory ID 映射,或 idmap_ad。图15介绍了 Active Directory ID 映射的过程。
 
  
  图15 Active Directory ID 映射
    
    Active Directory ID 映射的唯一缺点是,我们必须提供一种机制来确保每个用户和组都拥有标识符,而且这些标识符在林中都是唯一的。有关详细信息,请参阅“针对 Active Directory ID 映射配置 Active Directory”边栏。
  幸好,还有另外一种 ID 映射策略,这种策略的管理负荷要少得多。回想一下,我们在前面曾提到过 Windows SID 可以唯一标识域中的用户和域本身。SID 中能唯一标识域中用户的部分称为相对标识符(或 RID),而且这部分事实上是一个 32 位的整数。因此,Winbind 可在用户登录时直接从 SID 中提取 RID,然后将该 RID 用作唯一的内部 UID。Winbind 将此策略称为 RID 映射,或 idmap_rid。图 18 描述了 RID 映射的实际工作方式。
 
   
  图16 RID 映射
    
    RID 映射具有零管理负荷的优点,但是您不能将它用在多域的环境中,因为不同域中的用户可能拥有相同的 RID 值。但是,如果您拥有单个 Active Directory 域,则可以使用 RID 映射。
  要配置 Winbind ID 映射策略,请再次编辑 /etc/samba/smb.conf 文件,并且添加“idmap backend = ad”行来使用 Active Directory 映射策略;如果您要使用 RID 映射策略,请添加“idmap backend = rid”行。确保该文件中不存在任何其他指定映射策略的行。
  对于 Winbind,我们还需要在 smb.conf 文件中添加其他配置选项。虽然我们已将 PAM 设置为在每个用户登录时为其创建主目录,但是还需要告诉 Winbind 主目录的名称是什么。我们可以通过将“template homedir = /home/%U”行添加到 smb.conf 来执行此操作(请参见图17)。这会告诉 Winbind,使用 Active Directory 进行身份验证的每个用户的主目录都将是 /home/<用户名>。但务必要先创建好 /home 目录。
 
  图17 指定主目录的名称
    
    加入域并登录
  既然网络、PAM、NSS 和 Samba Winbind 都已配置成功,现在应该将 Linux 计算机加入到域中。可使用 Samba NET 命令来执行此操作。在外壳程序提示符下,运行“net ads join –U <管理员名称>”。使用具有足够权限来将计算机加入到域的帐户名称替换 <管理员名称>。
  net 命令会提示您输入用户的密码。如果一切运行正常,net 命令会将您的计算机加入到域中。您可以使用 Active Directory 用户和计算机来查找刚刚创建的计算机帐户。
  您可以使用称为 wbinfo 的 Winbind 测试工具来 测试加入的状态。运行 wbinfo –t 将测试计算机与域之间的信任关系。运行 wbinfo –u 将列出域中的所有用户,而运行 wbinfo –g 将列出域中的所有组。
  如果您成功将 Linux 计算机加入到域中,则下一步是尝试使用 Active Directory 用户帐户和密码登录。注销 Linux 计算机,然后使用 Active Directory 用户名登录。如果一切运行正常,您应该能够登录。
   要是行不通怎么办?
  使用Winbind 设置Linux 计算机以便使用Active Directory 进行身份验证并非易事。要配置的东西有很多,而且很多地方都可能会出错,而 Linux 的每个版本和 Samba 的每个版本之间又都存在一些细微差别,这更是雪上加霜。但是您可以查找几个地方,以帮助确定怎样操作。
  首先是Linux 系统日志文件,它保存在 /var/log/messages 中。Samba 将重大事件的消息(例如,丢失文件或配置失败)存储在这个文件中。除了系统日志文件外,还有 Samba 和 Winbind 的日志文件。您可以在 /var/log/samba 中找到这些文件,而且它们还会为您提供一些其他信息。
  您可以通过修改Winbind 的启动脚本来设置调试级别,来提高 Winbind 发出的日志消息的详细程度(和数量)。编辑 /etc/init.d/winbind 外壳脚本,然后在 windbindd 命令中添加“-d 5”。这可将调试级别增加到 5(允许的值范围为 1 至 10),使 Winbind 生成更详细的错误消息。
  如果Winbind 最后可与 DC 通信,您可以运行网络数据包捕获实用工具,如 Netmon 3.1。这使您可以精确分析 Winbind 要进行的操作。而且,您还可以检查 DC 上的 Windows 安全日志,此日志会显示身份验证尝试。
   如果行得通,您又应该做些什么呢?
  如果一切都能顺利进行,现在您就可以使用在 Active Directory 中保存的凭据登录 Linux 系统中了。与在 Linux 计算机上本地管理标识,或与使用诸如 NIS 之类的不安全系统相比,这是一项重大改进。它使您可以将您的用户管理任务集中到一个标识存储上:Active Directory。
  但是,要让这套解决方案真正具备实际用途,还缺几样东西。首先,无法保证能获得技术支持,有点像撞大运。大多数 Linux 组织对于 Active Directory 都不是很了解,而且您可以从 Linux 社区获得的支持完全取决于谁刚好读到您的帖子以及他们当天的心情。
  Samba 也没有迁移或部署工具。如果您具有现有的 Linux 帐户及其相关的用户 ID 和权限,则您在将它们迁移至 Active Directory 时,必须手动确保它们维护其 UID。
  最后,Samba 仍然无法使用最重要的 Active Directory 应用程序之一,即组策略,尽管已经实施了此策略。虽然您可以使用 Samba 将 Linux 系统加入到 Active Directory 中,但无法使用组策略来管理它。
   第三方解决方案
  使用Active Directory 对 Linux 计算机进行身份验证显然是件好事,但使用 Samba Winbind 推出您自己的解决方案,即使不把您累死,也会让您感到枯燥无味。您可能会想,一些创新的软件供应商可能会提出易于使用的解决方案,您猜得没错。
  对于我在本文中演示的版本,有四家商用软件供应商已经开发了易于安装和使用的相应版本。它们几乎为每个受欢迎的 Linux、UNIX 和 Apple Macintoshes 版本都提供了代码和迁移工具,另外也支持使用组策略管理 Linux 计算机。
  这四家公司分别为Centrify、Likewise Software、Quest Software 和 Symark。这四家供应商都提供了相似的功能,其中包括跨越各个 Linux 发布版本的组策略管理。Likewise Software 最近还公开了它实现的开放源代码,称为 Likewise Open,但它的组策略组件仍旧是商用产品。Likewise Open 将可用于多个主要的 Linux 发布版本。
  有了可用的商用产品后,还有必要使用 Samba 和 Winbind 来构建自己的身份验证系统吗?如果花钱购买集成软件不在预算之内,则可以利用免费的 Samba 开放源代码 路由。您还可以获得所有的源代码,这样的好处真是令人难以抗拒。但是,迁移现有的 Linux 计算机及其现有的 UID 是非常棘手的问题。
  另一方面,假如您想要省下安装和实现的时间、需要迁移现有的 Linux 计算机,或是希望有人对您的问题提供权威性的解答,那么寻求其中的一种商用解决方案比较划算。另外,如果您需要使用组策略管理功能,那么商用产品是您唯一的选择。
  但是,无论您采取哪种方式,将Linux 身份验证与 Active Directory 集成都可以减少您为管理多用户帐户投入的精力、增强系统安全性,并为您提供单一的标识存储来进行管理和审核,而这些全都是相当吸引人的理由,值得试一试。