我正在 CentOS 7 上设置 FreeIPA 服务器,我想在密码过期时阻止通过 SSH 进行 RSA 身份验证。默认情况下,当我使用户密码过期并且他们登录时,他们会被强制更改密码。但是,如果同一个用户也使用 RSA 身份验证,服务器会让他们进入并且不会强制他们更改密码。我搜索了与 FreeIPA、PAM 和 SSH 相关的主题,但似乎找不到我想要的答案。
当用户密码过期时,有什么方法可以阻止通过 SSH 进行 RSA 密钥认证?
答案1
如果您已将客户端注册到 FreeIPA,则其 PAM 堆栈将配置为使用 SSSD 守护程序。有问题的 PAM 模块是 pam_sss,它与 SSSD 守护程序对话以执行检查。SSSD 了解 IPA 属性,并且应该在用户被锁定时正确拒绝会话。
# ipa user-disable abbra
-----------------------------
Disabled user account "abbra"
-----------------------------
# grep UsePAM /etc/ssh/sshd_config
UsePAM yes
# journalctl -u sshd -f
.....
Feb 29 17:21:23 a.example.com systemd[1]: Started OpenSSH server daemon.
Feb 29 17:21:33 a.example.com sshd[20209]: pam_sss(sshd:account): system info: [The user account is locked on the server]
Feb 29 17:21:33 a.example.com sshd[20209]: pam_sss(sshd:account): Access denied for user abbra: 6 (Permission denied)
Feb 29 17:21:33 a.example.com sshd[20209]: fatal: Access denied for user abbra by PAM account configuration [preauth]
对于已启用的用户,你将获得类似的内容:
# ipa user-enable abbra
----------------------------
Enabled user account "abbra"
----------------------------
# journalctl -u sshd -f
....
Feb 29 18:03:27 a.example.com sshd[22302]: Accepted publickey for abbra from X.Y.Z.W port 54540 ssh2: KEY...
当密码被标记为过期(由其他用户(即管理员)设置,或应用某种密码策略)时,SSSD 会忽略密码需要更改的事实,因为此时它只运行不检查密码的帐户阶段。
过去曾有许多人要求添加此类逻辑,反对的理由之一是,如果您使用一种类型的身份验证(公钥),那么为什么帐户状态应该基于另一种身份验证类型的状态。这其中有逻辑,但也许最好添加一个密码策略,允许逻辑将帐户状态与密码状态结合起来。
如果您有兴趣制定这样的密码策略,我建议您向 FreeIPA 开具一张票据进行请求,并说明您的使用案例。
答案2
您可能可以使用 chage 或 usermod 编写一个脚本,例如:usermod --expiredate ...如果必须的话,我会使用类似于以下伪代码的 shell 脚本:
if `chage -l user_account_you_want_expired_etc | awk '/expires/{print "relevant fields}'` >= expiration
then
usermod -s /sbin/nologin USERNAME
fi
类似这样的内容(请注意,这是不起作用的,但可以为您提供一个框架)。“如果到期时间(从 awk grep 得到的)大于或等于我想要/需要的值,则将 shell 更改为 nologin。”
答案3
如果您使用 PAM 为您的用户创建会话(usePAM yes
),它将不允许用户使用过期的密码登录。
它很好地描述了Unix(好吧,这是相反的问题,但可能会对你有帮助)。