通过Active Directory验证Linux客户端身份(1)


长久以来Linux和Windows一直对立存在并快速发展着,企业中的应用也逐渐分为两大阵营。它们彼此既不互相竞争,也不互相协作。虽然Windows与Linux之间的竞争水火不容,但目标都希望为公司提供高质量且经济高效的IT服务。作为企业IT管理者,实现此目标的方法之一是共享ActiveDirectory。几乎所有的IT组织都采用ActiveDirectory,为它们的Windows桌面和服务器提供身份验证服务。与其针对Linux环境维护一个不同的身份验证基础结构(加上一组不同的用户名和密码),还不如让Linux计算机也采用ActiveDirectory,这样岂不是更好?本文中向您介绍如何实现这一目的。

Windows身份验证

Windows推出集成网络身份验证和单一登录系统至今已有一段时间了。在Windows2000之前,WindowsNT域控制器(DC)使用NT LAN Manager(NTLM)协议为Windows客户端提供身份验证服务。虽然NTLM不像当初想象的那样安全,但它还是非常有用的,它完美地解决了需要在网络上跨多个服务器维护重复用户帐户的问题。

自Windows2000开始,Microsoft便从NTLM移到了ActiveDirectory及其集成Kerberos身份验证服务。与NTLM相比,Kerberos更安全,而且更适合调整。此外,Kerberos更是Linux和UNIX系统早已采纳的行业标准,从而为这些平台打开了与Windows集成的大门。

Linux身份验证

Linux(以及在其上面运行的GNU工具和库)当初并不是以单一身份验证机制的设计理念进行构建的。因此,Linux应用程序开发人员就逐渐养成了一种习惯,即创建属于自己的身份验证方案。他们设法通过在/etc/passwd中查询名称和密码哈希,或者提供截然不同(和个别)的机制,来实现这一目标。

由此产生了很多身份验证机制,以至于无法对其进行管理。1995年,Sun提出了称为“可插入身份验证模块”(PluggableAuthenticationModules,PAM)的机制。PAM提供了一组所有应用程序开发人员都可以使用的通用身份验证API,以及管理员配置的后端,允许多种“可插入”身份验证方案。通过使用PAMAPI 进行身份验证以及使用Name Server Switch(NSS)API来查询用户信息,Linux应用程序开发人员可以少编写一些代码,并且Linux管理员可从同一个地方配置和管理身份验证过程。

大多数Linux发布版本都会随附多个PAM身份验证模块,其中包括支持对LDAP目录进行身份验证和使用Kerberos进行身份验证的模块。用户可以使用这些模块对ActiveDirectory进行身份验证,但这其中存在一些明显的限制。

Samba和Winbind

Samba是一种开放源代码项目,旨在在Windows与Linux环境之间提供集成。Samba包含的组件使Linux计算机有权访问Windows文件和打印服务,同时还提供了基于Linux的服务来模拟WindowsNT4.0 DC。使用Samba客户端组件,Linux计算机便可利用Windows NT和Active DirectoryDC所提供的Windows 身份验证服务。

Samba在这个项目中对我们来说最有趣的一部分叫做Winbind。Winbind是在Samba客户端上运行的后台程序(在Windows中称为服务),它的作用是充当在Linux计算机上运行的PAM和NSS与在DC上运行的ActiveDirectory之间通信的代理。具体来说,Winbind使用Kerberos来对ActiveDirectory和LDAP进行身份验证,以检索用户和组信息。Winbind还提供其他服务,如使用类似于ActiveDirectory中DCLOCATOR的算法来查找DC的功能,以及通过使用RPC与DC进行通信来重置ActiveDirectory密码的功能。

Winbind解决了多个仅使用Kerberos和PAM无法解决的问题。具体来说,Winbind并不是将DC进行硬编码以便按照PAMKerberos模块的方式进行身份验证,而是以类似于MicrosoftDC LOCATOR模块运行的方式通过搜索 DNS定位程序记录来选择DC。

三种身份验证策略

假设Linux计算机上提供了LDAP、Kerberos 和Winbind三种身份验证,我们可以采用三种不同的实现策略允许Linux计算机使用ActiveDirectory来进行身份验证。

使用LDAP身份验证使用Active Directory进行身份验证的最简单但成效最低的方法是,将PAM 配置为使用LDAP身份验证,如图1 所示。虽然 Active Directory 属于 LDAPv3 服务,但Windows客户端使用Kerberos(回退到 NTLM)而不是 LDAP 进行身份验证。

LDAP身份验证(称为LDAP绑定)通过网络以明文形式传递用户名和密码。对于大多数用途来说,这不仅不安全,而且也是无法接受的。

使用 LDAP 对 Active Directory 进行身份验证

降低以明文形式传递凭据的风险的唯一方法是使用类似于SSL 的协议加密客户端与ActiveDirectory进行通信所使用的通道。这绝对可行,但会增加在DC和Linux计算机上管理 SSL 证书的负担。此外,使用 PAMLDAP模块并不支持更改已重置的或过期的密码。

使用 LDAP 和 Kerberos 利用 Active Directory 进行 Linux 身份验证的另一种策略是,将PAM配置为使用 Kerberos 身份验证,以及将 NSS 配置为使用 LDAP 查找用户和组信息,如图2所示。此方案的优点是,它相对来说比较安全,而且它利用的是 Linux 的“内置”功能。但是它不利用 ActiveDirectoryDC 发布的 DNS 服务位置 (SRV) 记录,所以您会被迫挑选一组特定的 DC来进行身份验证。对于管理即将过期的 ActiveDirectory密码或是直至最近的适当组成员身份查询,它提供的方法也不是很直观。

使用LDAP和Kerberos对Active Directory进行身份验证

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

使用 Winbind 对 Active Directory 进行身份验证

实施计划

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

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

·查找并下载适当的 Samba 以及其他依存组件。

·构建 Samba。

·安装并配置 Samba。

·配置 Linux,特别是 PAM 和 NSS。

·配置 Active Directory。

本文的下面几节将详细介绍这些步骤。


相关内容

    暂无相关文章