了解 PAM 和 NSS

Col*_*RiX 23 ldap authentication pam nss

在过去的几天里,我设置了一些带有 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 。

所以我进行了一些试验,我首先尝试从nsswitch.conf(并且身份验证停止工作,好像只有 pam_ldap 不足以完成这项工作)中删除 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?

And*_*w B 28

它有助于在你的脑海中分解这样的事情:

  • NSS - 基于模块的系统,用于控制如何在内存中组装各种操作系统级数据库。这包括(但不限于)passwdgroupshadow(这一点很重要要注意)和hosts。UID 查找使用passwd数据库,GID 查找使用group数据库。

  • PAM - 基于模块的系统,用于允许基于服务的身份验证和记帐。与 NSS 不同,您不是扩展现有数据库;PAM 模块可以使用他们喜欢的任何逻辑,尽管 shell 登录仍然依赖于NSSpasswdgroup数据库。(你总是需要 UID/GID 查找)

重要的区别在于 PAM 本身什么都不做。如果应用程序不链接到 PAM 库并调用它,则永远不会使用 PAM。NSS 是操作系统的核心,数据库对于操作系统的正常运行来说是无处不在的。

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

  • 如果shadow指向 内的 ldap 服务/etc/nsswitch.conf,如果这些影子字段映射(特别是加密的密码字段)的属性存在于 LDAP 中并且允许登录,则针对影子数据库运行的任何身份验证都将成功。
    • This in turn means that pam_unix.so can potentially result in authentication against LDAP, as it authenticates against the shadow database. (which is managed by NSS, and may be pointing at LDAP)
  • If a PAM module performs calls against a daemon that in turn queries the LDAP database (say, pam_sss.so, which hooks sssd), it's possible that LDAP will be referenced.

  • 验证是的,但除非您有其他方法来获取用户信息(本地 /etc/passwd 或其他),否则您仍然需要一种方法来找出组成员身份、主目录等。您仍然在混淆验证和授权/属性枚举。 (6认同)
  • 这里有一种方法可以帮助您理解:在“/etc/nsswitch.conf”中为两个数据库启用 LDAP 运行“getent passwd”和“getent group”。然后在该文件中禁用 LDAP,并再次运行这两个命令。`getent` 是一个用于转储 NSS 数据库的命令。 (3认同)