如何使用 PAM 管理 ssh 公钥认证方法的锁定策略

如何使用 PAM 管理 ssh 公钥认证方法的锁定策略

我已按照 redhat 上关于如何在 linux 服务器上强化身份验证的说明进行操作,但我们仅使用带有公钥身份验证的 SSH。根据这些说明: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/chap-hardening_your_system_with_tools_and_services

这是我的 /etc/pam.d/system-auth 和 /etc/pam.d/password-auth 文件,它们实际上是相同的:

#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        required      pam_faillock.so preauth silent audit deny=3 even_deny_root unlock_time=60
auth        sufficient    pam_unix.so nullok try_first_pass
auth        [default=die] pam_faillock.so authfail audit deny=3 even_deny_root unlock_time=60
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_faillock.so
account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

通过此配置,我希望在用户尝试使用错误密钥进行身份验证(例如,3 次尝试后)时实现某种锁定消息。但没有弹出有关锁定的消息,我无法判断锁定策略是否有效。还有 pam_tally2 模块,但我看不出它与 pam_faillock 模块有什么区别。

除了 root 权限被拒绝之外,日志没有显示任何内容:

[some_user@ip-10-10-2-53 ~]$ cat /var/run/faillock/some_user
[some_user@ip-10-10-2-53 ~]$ cat /var/run/faillock/root 
cat: /var/run/faillock/root: Permission denied

我曾尝试使用错误的密钥进行 ssh some_user,但似乎并没有将我锁定,因为我在故障锁定日志或我尝试 ssh 的任何 ssh 消息中都看不到任何内容。

答案1

问题在于您正尝试在身份验证堆栈内强制执行这些策略。

auth        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        required      pam_faillock.so preauth silent audit deny=3 even_deny_root unlock_time=60
auth        sufficient    pam_unix.so nullok try_first_pass
auth        [default=die] pam_faillock.so authfail audit deny=3 even_deny_root unlock_time=60
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_faillock.so
account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

SSH 守护进程本身内实现的公钥身份验证会绕过身份验证堆栈。(没有调用 PAM 身份验证模块来验证提交的密钥,因此必须以这种方式工作)唯一的例外是当您运行自定义配置时,该配置也需要在键盘交互中成功。由于这不是默认设置,因此在这些身份验证过程中,您的身份验证堆栈几乎肯定会被忽略。

虽然account堆栈通常您对仅使用公钥登录设置了限制,但我认为这在这里不起作用,因为您必须先成功通过身份验证才能调用 PAM 模块。如果您的 PAM 模块未被调用,则它无法在每次登录失败时增加计数。

我认为唯一可行的方法是调整 sshd 配置以要求键盘交互式身份验证此外公钥认证。(你可以使用此问答作为起点)话虽如此,正如 JohnA 指出的那样,这是否真正提供任何价值仍值得商榷。

答案2

我非常肯定您无法以这种身份使用 PAM。如果用户没有与服务器上的 ssh 公钥相对应的 ssh 私钥,那么他们将无法进行身份验证。

密码失败锁定的目的是防止暴力破解用户帐户的密码。如果强制使用 ssh 密钥身份验证,则无需考虑用户帐户密码。

对于 ssh key auth 请求的密码,这是私钥的密码。私钥验证失败不会导致服务器验证失败。

相关内容