本文转自:http://www.storageonline.com.cn/os-app/linux-unix/linux-authentication/
为安全起见,计算机系统只有经过授权的合法用户才能访问,在这里如何正确鉴别用户的真实身份是一个关键的问题。所谓用户鉴别,就是用户向系统以一种安全的方式提交自己的***明,然后由系统确认用户的身份是否属实的过程。换句话说,用户鉴别是系统的门户,每个用户进入到系统中都必须经过鉴别这一道关。
最初,Linux系统的用户鉴别过程就像各种Unix系统的一样:系统管理员为用户建立一个帐号并为其指定一个口令,用户用此指定的口令登录后重新设置自己的口令,这样用户就具有了一个只有他自己知道的秘密口令。一般情况下,用户的口令经过加密处理后存放于 /etc/passwd 文件中。用户登录时,登录服务程序提示用户输入其用户名和口令,然后将口令加密并与 /etc/passwd 文件中对应帐号的加密口令进行比较,如果口令相匹配,说明用户的身份属实并允许此用户访问系统。这种思想基于只有用户自己知道他的口令,所以输入的口令是正确的话,那么系统就认定他是所声称的那个人。
后来,还采用了许多其他的鉴别用户的方法,如用于网络环境的 Kerberos 以及基于智能卡的鉴别系统等。但是这些鉴别方案有一个通病:实现鉴别功能的代码通常作为应用程序的一部分而一起编译,这样问题就来了――如果发现所用算法存在某些缺陷或想采用另一种鉴别方法时,用户不得不重写(修改或替换)然后重新编译原程序。很明显,我们原先的鉴别方案缺乏灵活性,这里的牵一发而动全身的情形很是让人恼火。
鉴于以上原因,人们开始寻找一种更佳的替代方案:一方面,将鉴别功能从应用中独立出来,单独进行模块化设计,实现和维护;另一方面,为这些鉴别模块建立标准 API,以便各应用程序能方便的使用它们提供的各种功能;同时,鉴别机制对其上层用户(包括应用程序和最终用户)是透明的。
直到 1995 年,SUN 的研究人员提出了一种满足以上需求的方案�C插件式鉴别模块(PAM)机制并首次在其操作系统 Solaris 2.3 上部分实现。插件式鉴别模块(PAM)机制采用模块化设计和插件功能,使得我们可以轻易地在应用程序中插入新的鉴别模块或替换原先的组件,而不必对应用程序做任何修改,从而使软件的定制、维持和升级更加轻松�C因为鉴别机制与应用程序之间相对独立。应用程序可以通过 PAM API 方便的使用 PAM 提供的各种鉴别功能,而不必了解太多的底层细节。此外,PAM的易用性也较强,主要表现在它对上层屏蔽了鉴别的具体细节,所以用户不必被迫学习各种各样的鉴别方式,也不必记住多个口令;又由于它实现了多鉴别机制的集成问题,所以单个程序可以轻易集成多种鉴别机制如 Kerberos 鉴别机制和 Diffie �C Hellman 鉴别机制等,但用户仍可以用同一个口令登录而感觉不到采取了各种不同鉴别方法。
PAM 提供了一组所有应用程序开发人员都可以使用的通用身份验证 API,以及管理员配置的后端,允许多种“可插入”身份验证方案。通过使用 PAM API 进行身份验证以及使用 Name Server Switch (NSS) API 来查询用户信息,Linux 应用程序开发人员可以少编写一些代码,并且 Linux 管理员可从同一个地方配置和管理身份验证过程。 大多数 Linux 发布版本都会随附多个 PAM 身份验证模块,其中包括支持对 LDAP 目录进行身份验证和使用 Kerberos 进行身份验证的模块。您可以使用这些模块对 Active Directory 进行身份验证,但这其中存在一些明显的限制。
PAM 为了实现其插件功能和易用性,它采取了分层设计思想:让各鉴别模块从应用程序中独立出来,然后通过PAM API作为两者联系的纽带,这样应用程序就可以根据需要灵活地在其中”插入”所需鉴别功能模块,从而真正实现了”鉴别功能,随需应变”。实际上,这一思路非常符合软件设计中的”高内聚,低耦合”这一重要思想。 PAM API 起着承上启下的作用,它是应用程序和鉴别模块之间联系的纽带:当应用程序调用 PAM API 时,应用接口层按照配置文件 pam.conf 的规定,加载相应的鉴别模块。然后把请求(即从应用程序那里得到的参数)传递给底层的鉴别模块,这时鉴别模块就可以根据要求执行具体的鉴别操作了。当鉴别模块执行完相应操作后,将结果返回给应用接口层,然后由接口层根据配置的具体情况将来自鉴别模块的应答返回给应用程序。 更详细的可以参考The Linux-PAM System Administrators’ Guide。
解析诸如用户和组帐号之类的资源。例如,在运行命令 ls -l
时,如果某个文件 inode 给出文件的所有者是 “user 501”,那么命名服务就需要将 “uid 501” 解析成用户名,并在 ls
命令输出结果中输出。通常来说,这是通过查找 /etc/passwd 文件中的所有用户帐号实现的,还可以用来解析主机名,服务名等。 NSS查询不同的数据库如DNS, LDAP, NIS, local files来实现命名,一般来说配置文件时/etc/nsswitch.conf。
Samba is an open source implementation of the Server Message Block (SMB) protocol. It allows the networking of Microsoft Windows, Linux, UNIX, and other operating systems together, enabling access to Windows-based file and printer shares. Samba’s use of SMB allows it to appear as aWindows server to Windows clients. 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。 对于Redhat 来说,Winbind 提供了以下三个功能: Authentication of user credentials (via PAM). ID Tracking/Name Resolution via nsswitch (NSS). The nsswitch service allows user and system information to be obtained from different database services such as LDAP or NIS. ID Tracking/Name Resolution is responsible for determining “Where” user identities are found. ID Mapping represents the mapping between Red Hat Enterprise Linux user (UID), group (GID), and Windows security (SID) IDs. ID Mappings are handled through an idmap “backend” that is responsible for tracking “What” ID’s users are known by in both operating system environments.
LDAP 的设计目的是提供一种有效的方法来查找和管理信息。 LDAP 信息被组织成属性和值的组合,称为 条目(entry)。条目可能会具有必须的属性或可选属性。一个条目的属性必须要遵循 /etc/openldap/schema/ 模式文件中定义的规则。规则包含在条目的objectclass 属性中。看一下下面的关系,我们可以看出posixAccount
objectclass 中包含了密码文件条目的信息(posixAccount userPassword
是文件条目的 base64 编码)。
Developed at the Massachusetts Institute of Technology (MIT), Kerberos is a network authentication protocol that uses symmetric key cryptography to provide highly secure authentication between client and server applications. Kerberos operates on the basis of “tickets” that are granted by a trusted third-party called a key distribution center (KDC). The KDC maintains a secure database of secret keys that are known only to the KDC itself and the client requesting a ticket. Tickets have a configurable expiration date and must be refreshed by the client on a regular basis. Kerberos authentication is significantly safer than normal password-based authentication because passwords are never sent over the network �C even when services are accessed on other machines.
NIS是Sun Microsystem于1985年发布的一项目录服务技术(Diretory Service),用来集中控制几个系统管理数据库的网络用品。NIS简化了UNIX和LINUX桌面客户的管理工作,客户端利用它可以使用中心服务器的管理文件。桌面系统的用户无需建立他们自己的/etc/passwd,他们只简单的使用维护在NIS服务器的文件即可。
当一个用户登录Linux时,首先得表明我是谁,然后证明我是谁,通过身份验证之后,再由访问控制模块去决定这个用户能访问什么资源。在身份验证时,我们需要在系统中保存用户的信息。这个信息可以存在本地数据系统,比如/etc/passwd,NIS,LDAP,当然也可以查询远端的数据系统,NIS,LDAP都可以。至于怎么经过远程系统验证,可以通过标准方式即用户名和密码验证,也可以通过Kerberos。 因此我们可以有很多不同的组合方式来实现身份验证。先不谈/etc/passwd,NIS,光使用Windows Active Directory的LDAP数据库来验证都有很多种方式。 另外,如果环境中既有Linux又有Windows,还有考虑两个系统需不需要共享文件,如果共享的话还要考虑2个系统中用户怎么映射。这里可以参考一下RedHat的文档《Integrating Red Hat Enterprise Linux 6 with Active Directory》。我稍后会详细介绍。
Integrating Red Hat Enterprise Linux 6 systems into an Active Directory domain
假设 Linux 计算机上提供了 LDAP、Kerberos 和 Winbind 三种身份验证,我们可以采用三种不同的实现策略允许 Linux 计算机使用 Active Directory 来进行身份验证。
这里可以参考CentOS (RedHat) 6.2 使用 OpenLDAP。 使用 LDAP 身份验证使用 Active Directory 进行身份验证的最简单但成效最低的方法是,将 PAM 配置为使用 LDAP 身份验证。虽然 Active Directory 属于 LDAPv3 服务,但 Windows 客户端使用 Kerberos(回退到 NTLM)而不是 LDAP 进行身份验证。 LDAP 身份验证(称为 LDAP 绑定)通过网络以明文形式传递用户名和密码。对于大多数用途来说,这不仅不安全,而且也是无法接受的。降低以明文形式传递凭据的风险的唯一方法是使用类似于 SSL 的协议加密客户端与 Active Directory 进行通信所使用的通道。这绝对可行,但会增加在 DC 和 Linux 计算机上管理 SSL 证书的负担。此外,使用 PAM LDAP 模块并不支持更改已重置的或过期的密码。
将 PAM 配置为使用 Kerberos 身份验证,以及将 NSS 配置为使用 LDAP 查找用户和组信息。此方案的优点是,它相对来说比较安全,而且它利用的是 Linux 的“内置”功能。但是它不利用 Active Directory DC 发布的 DNS 服务位置 (SRV) 记录,所以您会被迫挑选一组特定的 DC 来进行身份验证。对于管理即将过期的 Active Directory 密码或是直至最近的适当组成员身份查询,它提供的方法也不是很直观。
使用 Winbind 使用 Active Directory 进行 Linux 身份验证的第三种方法是,将 PAM 和 NSS 配置为调用 Winbind 后台程序。Winbind 将使用 LDAP、Kerberos 或 RPC(使用其中最合适的一个),将不同的 PAM 和 NSS 请求转换为相应的 Active Directory 调用。
使用 Active Directory 对 Linux 计算机进行身份验证显然是件好事,但使用 Samba Winbind 推出您自己的解决方案,即使不把您累死,也会让您感到枯燥无味。有不少商用软件供应商已经开发了易于安装和使用的相应版本。它们几乎为每个受欢迎的 Linux、UNIX 和 Apple Macintoshes 版本都提供了代码和迁移工具,另外也支持使用组策略管理 Linux 计算机。
比如 Centrify、Likewise Software、Quest Software 、 Symark。FOXT的BoKS也相当不错。参见《Linux/Unix权限管理 �C FoxT BoKS》。这些供应商都提供了相似的功能。 有了可用的商用产品后,还有必要使用 Samba 和 Winbind 来构建自己的身份验证系统吗?如果花钱购买集成软件不在预算之内,则可以利用免费的 Samba 开放源代码路由。您还可以获得所有的源代码,这样的好处真是令人难以抗拒。但是,迁移现有的 Linux 计算机及其现有的 UID 是非常棘手的问题。 另一方面,假如您想要省下安装和实现的时间、需要迁移现有的 Linux 计算机,或是希望有人对您的问题提供权威性的解答,那么寻求其中的一种商用解决方案比较划算。另外,如果您需要使用组策略管理功能,那么商用产品是您唯一的选择。 但是,无论您采取哪种方式,将 Linux 身份验证与 Active Directory 集成都可以减少您为管理多用户帐户投入的精力、增强系统安全性,并为您提供单一的标识存储来进行管理和审核,而这些全都是相当吸引人的理由,值得试一试。
使用 Active Directory 对 Linux 客户端进行身份验证
CentOS(RedHat) 6.2下Samba配置
CentOS (RedHat) 6.2 使用 OpenLDAP
了解和配置 PAM
深入 Linux PAM 体系结构