我已按照 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 请求的密码,这是私钥的密码。私钥验证失败不会导致服务器验证失败。