PAM 身份验证由于 DNS 设置不正确而挂起,但是谁触发了此查找?

PAM 身份验证由于 DNS 设置不正确而挂起,但是谁触发了此查找?

最近我遇到了一个问题,执行 PAM 身份验证的应用程序挂起长达 20 秒,然后才报告 PAM 身份验证是否成功。通过完全相同的 PAM 模块集(相同的文件/etc/pam.d!)执行 PAM 身份验证的其他应用程序没有这样的问题。

经过一番调查,我发现差异在于这个应用程序PAM_RHOST在执行身份验证之前设置了一个值,而其他应用程序则没有。我还发现,如果机器没有连接到任何网络,就不会发生这个问题。最后,一切都归结为机器上的 DNS 设置不正确。显然,一些 DNS 查找挂起了,修复 DNS 设置也使问题消失。

我不太明白的是,到底是谁触发了 DNS 查询?我使用的所有 PAM 模块都不会触发 DNS 查询,PAM 本身的代码似乎也不会触发 DNS 查询。不知道查询从何而来,这让我很抓狂!

答案1

好吧,经过对大量源代码的广泛搜索后,我终于找到了这次查找的原因。

如果您查看 PAM 的源代码,尤其是文件pam_audit.c,那么其中有一个名为的函数_pam_audit_writelog(...),并且在此函数内部进行了以下调用:

  rc = audit_log_acct_message (audit_fd, type, NULL, buf,
       (retval != PAM_USER_UNKNOWN && pamh->user) ? pamh->user : "?",
    -1, pamh->rhost, NULL, pamh->tty, retval == PAM_SUCCESS );

pamh->rhost是项目的存储PAM_RHOST。重要的是,后面的下一个参数pamh->rhost实际上是NULL

这是Linux审计框架的一个功能,所讨论函数的功能签名是:

int audit_log_acct_message(int audit_fd, int type, const char *pgname,
    const char *op, const char *name, unsigned int id, 
    const char *host, const char *addr, const char *tty, int result)

如您所见,host函数被赋予了 a,但是addrNULL在这种情况下,此函数将尝试host通过 DNS 解析来获取丢失的地址。

因此,如果某个程序正在使用 PAM 并且该程序正在设置该项PAM_RHOST,PAM 将通过审计框架间接触发 DNS 查找。由于这一切都是同步发生的,配置错误的 DNS 设置(例如多个无法访问的 DNS 服务器和/或许多搜索域)可能会导致 PAM 身份验证挂起一段时间,然后 DNS 查找最终会因错误而失败,但该错误会被忽略(查找只是尽力而为),并且登录信息会存储而没有地址;因此查找失败也不会影响 PAM 身份验证。

相关内容