我有一个有效的 AD/Linux/LDAP/KRB5 目录和身份验证设置,但有一个小问题。当帐户被禁用时,SSH 公钥身份验证仍然允许用户登录。
很明显,kerberos 客户端可以识别已禁用的帐户,因为 kinit 和 kpasswd 返回“客户端凭据已被撤销”,无需进一步的密码/交互。
是否可以配置 PAM(在 sshd_config 中使用“UsePAM yes”)以禁止已禁用帐户登录,其中身份验证通过公钥进行?这似乎不起作用:
account [default=bad success=ok user_unknown=ignore] pam_krb5.so
请不要在您的回答中介绍 winbind - 我们不使用它。
答案1
我在其他地方看到有人要求“修复” SSH,以便无法通过 SSH 登录锁定的帐户。(请参阅 Debian 错误 219377)此请求作为补丁被拒绝,“因为它打破了某些用户的期望,这些用户习惯于使用 passwd -l 仅锁定密码。”(请参阅 Debian 错误 389183)例如,有些人希望能够锁定密码登录的帐户,但仍允许 SSH 密钥访问。
PAM 不会拒绝对刚刚被锁定的帐户进行 SSH 密钥验证(例如由于密码尝试无效,因为 SSH 密钥验证旨在不关注密码字段,而密码字段通常是帐户被锁定的地方。)
我理解密码哈希条目是在 pam_authenicate() 时间隐式检查的,而不是在 pam_acct_mgmt() 时间。pam_unix.so pam_sm_acct_mgmt() 根本不检查密码哈希,并且在公钥认证期间不会调用 pam_authenticate()。
如果您想要集中禁用帐户登录,还有其他可能的解决方法,包括:
更改登录 shell。
(重新)移动他们的authorized_keys文件。
拒绝访问的另一种选择可能是在 sshd_config 中使用 DenyGroups 或 AllowGroups。(然后将用户添加到“sshdeny”组,或将其从“sshlogin”组中删除以禁止他们登录。)(请阅读此处:https://help.ubuntu.com/8.04/serverguide/user-management.html)
从http://web.archiveorange.com/archive/v/67CtqEoe5MhDqkDmUMuL 我读到:“问题是 pam_unix 只检查影子条目的到期日期,而不是密码哈希字段的内容。”如果这是真的,那么即将到期帐户而不是锁定它做什么?
你的问题的答案可能是“是的,如果您正在密码字段之外的其他地方禁用它们”
答案2
做了更多功课,并回答了我自己的问题。
在 RedHat 的 pam_krb5 ( pam_krb5-2.3.14-1/src/acct.c
) 中,除非模块参与了身份验证阶段,否则 pam_sm_acct_mgmt() 函数将根据模块配置返回 PAM_IGNORE 或 PAM_USER_UNKNOWN。因此,需要更改 pam_krb5 代码才能执行我想要的操作。
JohnGH 的答案是一个很好的解决方法;使用“代理”属性来传达相同的含义,例如破坏外壳或添加到“禁用用户”组。
另一个解决方法(部分测试过)是设置过去的帐户到期日期,并使用 pam_unix 等模块使帐户检查失败。这使用 LDAP 而不是 KRB5,但针对相同的集中管理的用户目录进行查询。
答案3
基于 SSH 密钥的身份验证独立于 PAM。您有以下解决方案:
- 在 sshd_config 中禁用基于密钥的身份验证
- 更改并重新编译 sshd 并添加一个钩子,以便基于密钥的身份验证也可以通过 pam 检查该帐户是否有效。
如果您想通过 kerberos 使用无密码登录,您必须确保:
- 你没有使用 pam 进行 sshd
- 您已正确配置 Kerberos。例如,您可以执行
kinit -k host/server1.example.com@DOMAIN
您的 sshd 配置为使用 gssapi:
KerberosAuthentication 是 GSSAPIAuthentication 是 GSSAPICleanupCredentials 是 UsePAM 否
您使用基于 Kerberos 的 ssh 客户端,例如 PuTTY v0.61 或更新版本。