了解PAM和NSS


21

在最近的日子里,我已经建立了一些具有LDAP身份验证的Linux系统,并且一切正常,但是经过大量研究,对于NSS和PAM还是有些我不了解的地方。

引用:

NSS允许管理员指定来源列表,在这些来源中将存储和搜索身份验证文件,主机名和其他信息

PAM是一组库,它们为应用程序和基础操作系统提供可配置的身份验证平台。

我不了解的是PAM和NSS是如何工作并相互作用的。在这本书的架构是解释得很好:我PAM配置为使用pam_ldapLDAP的帐户和pam_unix本地帐户,然后我配置nsswitch.conf来从本地文件和LDAP信息。

如果我正确理解,则使用LDAP两次:首先pam_ldap由NSS 使用,然后由NSS使用,后者本身是从调用的pam_unix。那正确吗?LDAP是否真的使用过两次?但是,为什么我需要同时配置NSS和PAM?我的解释是,PAM执行与NSS不同的任务,并且被其他程序使用。但是,正如我在本页中所读到的那样,那么应该仅可以使用NSS或仅使用PAM 。

因此,我做了一些实验,首先尝试从中删除LDAP nsswitch.conf(并且身份验证停止工作,好像只有pam_ldap不足以完成这项工作)。然后,我在NSS中重新启用了LDAP,并从PAM配置中将其删除(这次一切正常,好像pam_ldap没用,NSS足以验证用户身份)。

有谁可以帮助我澄清这一点?提前谢谢了。

更新

我刚刚尝试过一些东西。我再次删除了所有pam_ldappam配置字段中的所有条目,并且也从中删除shadow: ldapnsswitch.conf。像现在一样,所有系统中只有行:passwd: ldap filesgroup: ldap filesnsswitch.conf。好吧...用LDAP用户登录非常有效,这两行(加号/etc/ldap.conf)足以配置LDAP身份验证。

据我了解,PAM独立于NSS,但我的测试表明事实并非如此。所以我问自己,是否可以完全禁用NSS而仅使用PAM?


我没有看到您的更新。请运行以下命令并报告您的发现,将LDAPUSER替换为您认为仅在LDAP中配置的用户。getent shadow | grep LDAPUSER grep LDAPUSER /etc/shadow
安德鲁B

Answers:


25

它有助于分解这样的东西:

  • NSS-基于模块的系统,用于控制各种OS级数据库在内存中的组装方式。这包括(但不限于)passwdgroupshadow(这是需要注意的重要的),和hosts。UID查找使用passwd数据库,而GID查找使用group数据库。

  • PAM-一种基于模块的系统,用于允许基于服务的身份验证和计费。与NSS不同,您不扩展现有数据库;尽管shell登录仍然取决于NSS passwdgroup数据库,但PAM模块可以使用其喜欢的任何逻辑。(您始终需要UID / GID查找)

重要的区别在于,PAM本身不会执行任何操作。如果应用程序未链接到PAM库并对其进行调用,则PAM将永远不会被使用。NSS是操作系统的核心,数据库对于OS的正常运行是相当普遍的。

现在我们已经解决了这个问题,这是曲线球:尽管pam_ldap是针对LDAP进行身份验证的流行方法,但它并不是唯一的方法。

  • 如果shadow指向其中的ldap服务/etc/nsswitch.conf,并且在LDAP中存在那些影子字段映射(特别是加密的密码字段)的属性,则针对影子数据库运行的任何身份验证都将成功。
    • 反过来,这意味着pam_unix.so在对影子数据库进行身份验证时,可能会导致针对LDAP进行身份验证。(由NSS管理,并且可能指向LDAP)
  • 如果PAM模块对守护程序执行调用,而该守护程序又查询LDAP数据库(例如pam_sss.so,该钩子sssd),则可能会引用LDAP。

非常感谢,我知道nsswitch.conf + pam_unix可以自己完成所有工作。但是PAM也应该能够做到这一点,因为它是独立的,就像您写的一样。我的理解是,模块pam_ldap应该足以根据ldap服务器对用户进行身份验证。是不是
ColOfAbRiX

6
可以进行身份​​验证,但是除非您有另一种获取用户信息的方法(本地/ etc / passwd或其他方式),否则您仍然需要一种方法来查找组成员身份,主目录等。您仍然会使身份验证和授权/属性枚举感到困惑。
TheFiddlerWins

1
@ColOfAbRiX TheFIddlerWins是正确的。身份验证就足够了,但是正如我所指出的,您仍然需要一种方法来查找UID + GID成员身份。这些是从passwdgroup数据库(NSS)获得的,这意味着它们必须在本地系统(/etc/passwd+ /etc/group)上,或者通过ldapNSS模块获得。
安德鲁B

3
这是帮助您理解的一种方法:在中运行getent passwdgetent group启用LDAP的两个数据库/etc/nsswitch.conf。然后在该文件中禁用LDAP,然后再次运行两个命令。getent是用于转储NSS数据库的命令。
安德鲁B

最后,我可以通过更多的工作来理解所有内容。感谢大伙们!
ColOfAbRiX

1

NSS可以枚举有关服务/用户的信息(您属于哪个组,主目录在哪里等)。PAM决定如何处理该信息。

如果要使用LDAP进行身份验证,则需要 pam_ldap。如果您使用其他内容(本地帐户,Kerberos等),则可能不会。

所以他们做不同的事情。NSS获取信息,一旦获得该信息,PAM便确定允许谁执行该操作。


谢谢,但是问题在于它至少不能在我的系统中以这种方式起作用:)在开始的时候,我理解的还是一样,但是后来我尝试删除了PAM中的所有pam_ldap条目,并且LDAP身份验证仍然有效(并且禁用缓存)。这加剧了我的困惑:)
ColOfAbRiX 2013年

删除pam_ldap后,您如何验证自己正在认证?请发布您的common-auth的内容。我不确定SUSE中的路径,但是要回答第三个问题的第一部分,即使使用pam_ldap,您也需要某种方式让系统知道您的身份-这是NSS提供的
TheFiddlerWins 2013年

抱歉,我的意思是删除了pam_ldap之后,LDAP auth在没有它的情况下仍然有效,我想它是通过NSS起作用的。该文件common-auth仅包含pam_env,pam_unix和pam_deny。
ColOfAbRiX

那没有道理,您如何确认LDAP身份验证有效?
TheFiddlerWins

使用LDAP帐户登录并监视ldap服务器的日志。nscd(缓存)已禁用
ColOfAbRiX
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.