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
是一种开放源代码项目,旨在在 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 进行身份验证
阅读(904) | 评论(0) | 转发(0) |