互操作性

使用 Active Directory 对 Linux 客户端进行身份验证

Gil Kirkpatrick

 

概览:

  • 如何在 Windows 和 Linux 中进行身份验证
  • 使用 Samba 和 Winbind
  • 实施策略
  • 逐步了解 Linux 与 Active Directory 的集成

目录

Windows 身份验证
Linux 身份验证
Samba 和 Winbind
三种身份验证策略
我们的实施计划
查找适当的软件
构建 Samba
配置 Linux 网络
配置 Linux 时间同步
配置 PAM 和 NSS
安装和配置 Samba
ID 映射问题
加入域并登录
如果域不能正常工作该怎么办?
既然域能正常工作,您又应该怎么办?
第三方解决方案

共和党和民主党。牙膏和桔子汁。Linux 和 Windows。有些东西放在一起就是不搭配,对吧?我曾参与过的每个 IT 商店都分成两大阵营:Windows 团队和 Linux 团队。它们彼此既不互相竞争,也不互相协作。事实上,有些地方甚至还在地板上画上一道黄线,以绝对确保两组之间没有不适当的友善关系。

我是 Windows 这一边的,当然也曾嘲弄过那些使用 Linux 的同事,但我们的目标是一致的,全都希望为公司提供高质量且经济高效的 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(包含 Linux 用户凭据的传统文本文件)中查询名称和密码哈希,或者提供截然不同(和个别)的机制,来实现这一目标。

由此产生了很多身份验证机制,以至于无法对其进行管理。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 绑定)通过网络以明文形式传递用户名和密码。对于大多数用途来说,这不仅不安全,而且也是无法接受的。

fig01.gif

图 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 密码或是直至最近的适当组成员身份查询,它提供的方法也不是很直观。

fig02.gif

图 2 使用 LDAP 和 Kerberos 对 Active Directory 进行身份验证(单击图像可查看大图)

使用 Winbind 使用 Active Directory 进行 Linux 身份验证的第三种方法是,将 PAM 和 NSS 配置为调用 Winbind 后台程序。Winbind 将使用 LDAP、Kerberos 或 RPC(使用其中最合适的一个),将不同的 PAM 和 NSS 请求转换为相应的 Active Directory 调用。图 3 说明了这一策略。

fig03.gif

图 3 使用 Winbind 对 Active Directory 进行身份验证(单击图像可查看大图)

我们的实施计划

由于与 Active Directory 的集成的增强,我选择在 Red Hat Enterprise Linux 5 (RHEL5) 上使用 Winbind 来进行我的 Linux 与 Active Directory 集成项目。RHEL5 是最新的商用 Red Hat Linux 发布版本,而且它在企业数据中心中相当受欢迎。

使 RHEL5 对 Active Directory 进行身份验证基本上需要下列五个不同的步骤:

  1. 查找并下载适当的 Samba 以及其他依存组件。
  2. 构建 Samba。
  3. 安装并配置 Samba。
  4. 配置 Linux,特别是 PAM 和 NSS。
  5. 配置 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) 所需的所有二进制文件。

我必须下载和更新图 4 中列出的程序包来构建和安装最新的 3.0 版 Samba(但我从未尝试过较新的 3.2 版)。请注意,这些程序包主要针对 Fedora Core (fc) 发布版本。Red Hat 以 Fedora 使用的相同源为基础,而且完全可与它交互。针对 Fedora Core 7 及更高版本构建的程序包,不需要任何修改即可在 RHEL5 上运行。请将下载的 RPM 文件放在 /usr/src/redhat/RPMS 目录中。

图 4 构建和安装 Samba 3.0.31 所需的程序包

samba-3.031-0.fc8.src.rpm Samba 3.0.31 源 RPM
gnutls1.6.3-3.fc7.i386 GNU 传输层安全性 (TLS) 库
gnutils-devel-1.6.3-3.fc7.i386 GNU 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 文件夹。完成后,使用该命令安装源程序包,如图 5 所示。

fig05.gif

图 5 安装 Samba 源 RPM(单击图像可查看大图)

如果您看到“用户 mockbuild 不存在,请使用根”错误警告,请不要担心。这个错误指出尚未安装 Mock 构建实用工具,但没有这些实用工具,构建过程也可以进行。

然后,移至 /usr/src/redhat/SPECS 目录并编辑文件 SAMBA.SPEC,该文件包含了 Samba 构建选项。搜索以“CFLAGS=”开头的那一行,并确保存在“--with-shared-modules=idmap_ad,idmap_rid”选项。此选项可确保构建过程包含将 Linux UID(唯一标识符)适当转换到 Active Directory 的代码。图 6 显示了此选项。

fig06.gif

图 6 with-shared-modules 构建选项(单击图像可查看大图)

接下来,您可能必须更新计算机上的一些库,才能适当构建和安装 Samba,具体取决于您安装的是哪个版本的库。在我的例子中,我必须使用 rpm --install 命令安装图 4 中列出的程序包;在某些情况下,我必须使用 --force 选项来克服一些依赖问题。

要构建 Samba,请移至 /usr/src/redhat 目录,并运行命令 rpmbuild –bb SPECS/samba.spec,如图 7 所示。此过程将新的 samba-3.0.31-0.i386 RPM 文件留在 /usr/src/redhat/RPMS 目录中。我们稍后将在此项目中安装这个 RPM 文件。

fig07.gif

图 7 创建 Samba 二进制 RPM 文件(单击图像可查看大图)

配置 Linux 网络

为了使用 Active Directory 进行身份验证,您的 Linux 计算机必须能够与 DC 通信。您必须配置三个网络设置才能与 DC 通信。

首先,重要的是通过使用动态主机配置协议 (DHCP) 或使用 ifconfig 命令为 Linux 计算机分配适当的 IP 地址和网络掩码,来确保适当配置该计算机的网络接口。在 RHEL5 下,通过从“系统”|“管理”菜单中选择“网络”来配置网络,如图 8 所示。

fig08.gif

图 8 配置网络(单击图像可查看大图)

接着,确保将 Linux 计算机的 DNS 解析程序设置为与 DC 使用相同的 DNS 名称服务器;在大多数情况下,假定您要使用 Active Directory 集成的 DNS,则该 DC 是您想要加入 Linux 计算机的域中的 DC。在用于配置网络的相同网络配置实用工具的 DNS 选项卡上,配置 DNS 解析程序,如图 9 所示。

fig09.gif

图 9 设置主 DNS 解析程序(单击图像可查看大图)

最后,完成上述步骤后,您必须设置 Linux 计算机的主机名称以反映它在域中的名称。虽然您可以使用网络配置应用程序设置主机名称,但这一方法不一定始终适用。

但是,可直接编辑 /etc/hosts 文件,并在具有 <IP 地址> <FQDN> <主机名称> 形式的 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。图 10 显示了如何设置 Linux 网络时间源的一个示例。

fig10.gif

图 10 配置网络时间协议(单击图像可查看大图)

配置 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 身份验证过程的某个方面。图 11 显示了 GDM 的 PAM 配置文件的内容。

fig11.gif

图 11 Gnome Desktop Manager 的 PAM 配置文件(单击图像可查看大图)

PAM 配置文件中的每个项目都具有 <管理组> <控制> <模块> <参数> 的形式,其中 <管理组> 对应于配置条目所属的设施:身份验证、帐户、密码或会话。图 12 中描述的控制关键字可控制 PAM 处理配置条目的方式。该文件的第三栏包含 /lib/security 目录中的 PAM 共享库的名称。共享库包含可动态加载的可执行代码,类似于 Windows 中的 DLL。模块名称后的其他术语都是 PAM 传递到共享库的参数。

图 12 PAM 控制关键字

关键字 描述
Required 如果模块成功,则 PAM 将继续评估管理组的其余项目,并且结果将由其余模块的结果决定。如果模块失败,PAM 将继续评估,但向调用应用程序返回失败消息。
Requisite 如果模块成功,PAM 将继续评估管理组条目。如果模块失败,PAM 将返回到调用应用程序,并且不做进一步处理。
Sufficient 如果模块成功,PAM 将向调用应用程序返回成功消息。如果模块失败,PAM 会继续评估,但结果将由后续模块决定。
Optional 除非模块是为管理组指定的唯一模块,否则 PAM 将忽略模块的结果。
Include PAM 包括引用的 PAM 配置文件的内容,并且还会处理该配置文件包含的条目。

您可以看到每个管理组都包含多个条目。PAM 按照调用命名的模块的顺序处理条目。然后,该模块返回成功或失败消息,而 PAM 将继续根据控制关键字进行评估。

您可能会注意到,GDM 的 PAM 配置文件在它的所有管理组中都包含系统身份验证。这正是 PAM 为 GDM 建立默认身份验证行为的方式。通过修改系统身份验证,您可以修改在其 PAM 配置中包含系统身份验证文件的所有应用程序的身份验证行为。图 13 中介绍了默认系统身份验证文件。

fig13.gif

图 13 PAM 系统身份验证文件(单击图像可查看大图)

Name Service Switch (NSS) 模块将隐藏系统数据存储的详细信息以防应用程序开发人员看见,这与 PAM 隐藏身份验证的详细信息的方式大体相似。NSS 允许管理员指定存储系统数据库的方式。具体来说,管理员可以指定如何存储用户名和密码信息。因为我们希望应用程序使用 Winbind 在 Active Directory 中查询用户信息,所以我们必须修改 NSS 配置文件才能显示此信息。

Red Hat 包含一个小型的图形小程序,可用来配置 PAM 和 NSS,称为 system-config-authentication。它负责管理您需要对系统身份验证和 nss.conf 文件进行的大部分(而非全部)更改。

运行 system-config-authentication 应用程序后,您会看到如图 14 所示的对话框。选中“用户信息”(用于配置 nss.conf 文件)和“身份验证”(用于修改系统身份验证文件)这两个选项卡上的 Winbind 选项。

fig14_L.gif

图 14 systemconfig-authentication 对话框

单击“配置 Winbind”按钮,您将看到如图 15 所示的对话框。在 Winbind 域字段中输入要对用户进行身份验证的域的名称,并选择“ads”作为安全模式。在 Winbind ADS 领域字段中输入 Active Directory 域的 DNS 域名称。在 Winbind 域控制器字段中,输入您希望该 Linux 系统对其进行身份验证的 DC 的名称,也可以输入星号,表明 Winbind 应通过查询 DNS SRV 记录来选择 DC。

fig15.gif

图 15 配置 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”会话部分中的最后一行之前插入一行(请参见图 16)。这一行将 PAM 配置为创建用户的主目录(如果用户没有主目录)。它将目录 /etc/skel 用作“框架”或模板,而且将权限掩码 0644(所有者具有的读写权限、主要组具有的读取权限,以及其他人具有的读取权限)分配给新文件夹。

fig16.gif

图 16 为用户创建主目录(单击图像可查看大图)

安装和配置 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。图 17 介绍了 Active Directory ID 映射的过程。

fig17.gif

图 17 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 映射的实际工作方式。

fig18.gif

图 18 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 来执行此操作(请参见图 19)。这会告诉 Winbind,使用 Active Directory 进行身份验证的每个用户的主目录都将是 /home/<用户名>。但务必要先创建好 /home 目录。

fig19.gif

图 19 指定主目录的名称(单击图像可查看大图)

加入域并登录

既然网络、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 用户名登录。如果一切运行正常,您应该能够登录。

针对 Active Directory ID 映射配置 Active Directory

此信息仅在您使用 Active Directoryy ID 映射时才适用。如果您决定使用 RID 映射,可随时跳过此边栏。

您必须先对 Active Directory 本身进行一些更改,然后才能使用 Active Directory 帐户登录到您的 Red Hat 服务器。首先,Active Directory 架构必须适合 Winbind 用来存储用户信息的属性。如果您运行的是 Windows Server 2003 R2,则表示此架构已经准备就绪。如果您拥有 Active Directory 架构的早期版本,则必须使用 Microsoft Services for UNIX (SFU) 程序包对其进行扩展。

您可以在 Technet 上的 Services for UNIX 上找到更多信息。SFU 还包含另一个针对 Active Directory 用户和计算机 Microsoft 管理控制台 (MMC) 管理单元的属性页,用于管理 Linux 所需的用户 ID 和组 ID 信息。

适当设置架构后,您必须为所有可能登录您的 Linux 计算机的用户(和他们所属的组)提供 Linux 标识符。这表示您必须为可能登录您的 Linux 计算机的用户和组定义 uidNumber 和 gidNumber 属性的值。但是您应该注意这些属性的一些要求:

  1. Linux 要求要进行身份验证的每个用户都必须有 UID。由于您要管理 Active Directory 中的用户信息,所以要登录 Linux 计算机的每个用户帐户都必须具有唯一的 uidNumber 属性。您用于 uidNumber 的特定值并不重要,但它在所有可能登录 Linux 计算机的用户中必须是唯一的。
  2. 每个 Linux 用户也必须具有默认组标识符,因此,要登录 Linux 计算机的每个 Active Directory 用户也需要 gidNumber 属性值。此值在用户中不必是唯一的,但它必须唯一地标识组。
  3. Active Directory 中的每个组对于它的 gidNumber 属性来说都应该具有唯一值。严格来讲,组可以没有 gidNumber 属性值,但 Winbind 在对用户进行身份验证时,会希望用户所属的每个组都具有唯一的 gidNumber 值。最简单的方法可能是确保每个组都具有唯一的 gidNumber 值。
  4. Winbind 希望它在 Active Directory 中查询的每个用户都是 Domain Users 组的成员,因此它也希望 Domain Users 组具有 gidNumber 属性值。

要是行不通怎么办?

使用 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 计算机。

这四家公司分别为 CentrifyLikewise SoftwareQuest SoftwareSymark。这四家供应商都提供了相似的功能,其中包括跨越各个 Linux 发布版本的组策略管理。Likewise Software 最近还公开了它实现的开放源代码,称为 Likewise Open,但它的组策略组件仍旧是商用产品。Likewise Open 将可用于多个主要的 Linux 发布版本。(注:撰写本文时,本人就职的公司 NetPro 已由 Quest Software 收购。)

有了可用的商用产品后,还有必要使用 Samba 和 Winbind 来构建自己的身份验证系统吗?如果花钱购买集成软件不在预算之内,则可以利用免费的 Samba 开放源代码路由。您还可以获得所有的源代码,这样的好处真是令人难以抗拒。但是,迁移现有的 Linux 计算机及其现有的 UID 是非常棘手的问题。

另一方面,假如您想要省下安装和实现的时间、需要迁移现有的 Linux 计算机,或是希望有人对您的问题提供权威性的解答,那么寻求其中的一种商用解决方案比较划算。另外,如果您需要使用组策略管理功能,那么商用产品是您唯一的选择。

但是,无论您采取哪种方式,将 Linux 身份验证与 Active Directory 集成都可以减少您为管理多用户帐户投入的精力、增强系统安全性,并为您提供单一的标识存储来进行管理和审核,而这些全都是相当吸引人的理由,值得试一试。

Gil Kirkpatrick 在他 30 年的职业生涯中设计或开发了十多种成功的商用软件产品,而且他还是 Directory 专家会议(现在改名为专家会议)的创办人。Gil 是《Active Directory Programming》的作者,并且经常为《Windows IT Pro》和《TechNet 杂志》撰写文章。Gil 目前在 NetPro(现在是 Quest Software 的一部分)担任常驻专家一职,他是各种安全性、标识和市场营销项目的顾问,并且经常在全球各地的技术讲座和会议中发表演说。