需要帮助理解 PAM 指令

需要帮助理解 PAM 指令

我在 RHEL5 机器上的文件中有以下指令/etc/pam.d/sshd,但我有点困惑。这些指令是为了让 LDAP+RADIUS+OTP 工作。我试图告诉 pam 不要检查 UID < 499 的用户是否符合 LDAP+RADIUS+OTP 的要求,并且不要检查 UID = 30027 的用户。

此指令按预期工作。它检查 UID 是否 >= 499,如果是,则跳过 (auth adequate pam_unix.so nullok_secure)。

auth [success=1 default=ignore] pam_succeed_if.so uid >= 499 quiet

我有点困惑。由于成功率 = 1,这应该执行 LDAP+RADIUS+OTP,但不知何故它仍然有效。如果为真,它不应该跳过下一条规则吗?

auth [success=1 default=ignore] pam_succeed_if.so uid eq 30027 quiet
auth sufficient pam_unix.so nullok_secure
auth sufficient  pam_radius_auth.so
auth required /lib/security/pam_google_authenticator.so forward_pass

尽管我已经让事情按照我想要的方式进行,但我对其背后的逻辑感到困惑。


更新

好的,当我使用 uid 为 30327 的本地用户进行 ssh 时,在 /var/log/secure 中得到以下信息 -

Aug  8 08:21:30 journey sshd[9357]: Accepted keyboard-interactive/pam for sidd from 10.1.1.178 port 51242 ssh2
Aug  8 08:21:30 journey sshd[9357]: pam_unix(sshd:session): session opened for user sidd by (uid=0)

这是我使用 uid 为 0 (<499) 的 root 获取 ssh 的结果。

Aug  8 08:25:51 journey sshd[9402]: Accepted keyboard-interactive/pam for root from 10.1.1.178 port 51246 ssh2
Aug  8 08:25:51 journey sshd[9402]: pam_unix(sshd:session): session opened for user root by (uid=0)

这是我使用 LDAP 用户时得到的,只有 LDAP 密码,没有 OTP -

Aug  8 08:27:04 journey sshd[9447]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=journey  user=schoure
Aug  8 08:27:05 journey sshd(pam_google_authenticator)[9447]: Failed to read "/home/schoure/.google_authenticator"
Aug  8 08:27:07 journey sshd[9445]: error: PAM: Cannot make/remove an entry for the specified session for schoure from journey

这是我使用 LDAP + OTP 的 ldap 用户时得到的结果 -

Aug  8 08:28:13 journey sshd[9452]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=journey  user=schoure
Aug  8 08:28:13 journey sshd[9450]: Accepted keyboard-interactive/pam for schoure from 10.1.1.178 port 43068 ssh2
Aug  8 08:28:13 journey sshd[9450]: pam_unix(sshd:session): session opened for user schoure by (uid=0)

所以您说得对 - pam_unix 对 LDAP 用户来说确实会失败,但由于它被设置为“足够”,所以它不是终端。感谢您澄清这一点。

至于你的另一点——

auth [success=1 default=ignore] pam_succeed_if.so uid eq 30027 quiet

没有被评估,我看到它正在被评估。如果我注释掉该指令,我得到

Aug  8 08:34:39 journey sshd(pam_google_authenticator)[9537]: Failed to read "/home/sidd/.google_authenticator"
Aug  8 08:34:42 journey sshd[9535]: error: PAM: Cannot make/remove an entry for the specified session for sidd from journey

所以我仍然不明白这是如何工作的,因为显然 30327 > 499,因此它应该跳过第二行。我认为它能工作的唯一原因是 PAM 以某种方式在前两行之间添加了一个隐式 OR。

更新2

啊,我明白发生了什么。实际上那行只是一个占位符。我把那个 UID 改成了某个不存在的随机 UID,它仍然有效。所以我理解其中的逻辑 -

  1. 第 1 行检查 UID。如果 UID 大于 499,则跳至第 3 行,在本地进行检查。由于 UID > 499 不是本地的,因此该条件不成立,但作为非终端指令,它会继续检查 LDAP + RADIUS + OTP。
  2. 如果我注释掉具有特定 UID 集的第 2 行,则由于 success=1,PAM 会完全跳过本地身份验证。

所以实际上,我做错了一些事情却让它成功了。我得到了我需要做的事情,它对我有用。

我不希望本地用户通过 LDAP + RADIUS + OTP 进行身份验证,因此这三行代码应该可以满足我的需求。它们可以正常工作,但我只想确认它们是否正确 -

auth sufficient pam_unix.so nullok_secure
auth sufficient  pam_radius_auth.so
auth required /lib/security/pam_google_authenticator.so forward_pass

答案1

你真的确定它跳过了吗pam_unix.so

sufficient是失败时的“非终端”行为。即使 pam_unix.so 检查失败,身份验证仍将继续尝试 pam_radius_auth.so。

我的解释是:

  • 检查uid eq 30027永远不会返回 true。仅当 uid <499 时,测试才会运行,这使得条件不可能为uid eq 30027真。
  • pam_unix.so将会尝试全部场景,如果失败,pam_radius_auth.so将会尝试。
  • pam_google_authenticator.so如果两者都失败了,就会尝试。

再次检查您的日志。radius 登录可能没有失败,但pam_unix.so检查可能记录失败。它只是不会阻止您登录。


此答案准确涵盖了原始问题的范围。通过更新或评论提出的任何其他问题均不包含在内。

相关内容