我目前正在为一个拥有 10000 多名用户的大型系统修改sshd_config
和/etc/security/access.d
。限制用户访问的方法有很多种,我有点头晕目眩,不知道该找哪种“最佳方法”。简而言之
- 我们可以使用 ACL 来限制访问
- 使用本地防火墙限制对负载均衡器的访问
- 使用 sshd_config 限制访问
- 使用我们的 PAM 配置限制访问
我们的 sshd 的 PAM 堆栈的一个非常精简的版本如下所示
auth requisite pam_faillock.so preauth deny=9 unlock_time=60
auth required pam_env.so
auth required pam_faildelay.so delay=2000000
auth [success=2 ignore=ignore default=bad] pam_ssh_user_auth.so
auth [success=1 ignore=ignore default=bad] pam_unix.so nullok
auth [default=die] pam_faillock.so authfail audit deny=9 unlock_time=60
auth requisite pam_access.so
auth sufficient pam_faillock.so authsucc audit deny=9 unlock_time=60
auth [success=1 ignore=ignore default=bad] pam_2fa.so
auth [default=die] pam_faillock.so authfail audit deny=9 unlock_time=60
auth sufficient pam_faillock.so authsucc audit deny=9 unlock_time=60
auth include postlogin
简而言之,这接受用户名+(密码或公钥)登录。由于 2fa 会 ping 用户手机,因此只有在接受第一个因素时才会询问此代码。
攻击者错误猜测用户名/密码的示例
~ ❯❯❯ ssh user@testmachine
(user@testmachine) Password:
(user@testmachine) Password:
(user@testmachine) Password:
user@testmachine: Permission denied (publickey,keyboard-interactive).
正确猜测无登录权限用户密码的示例
~ ❯❯❯ ssh user@testmachine
(user@machine) Password:
Connection closed by IP port 22
总结
- 如果对手输入了错误的密码,密码提示将会出现 3 次。
- 如果对手正确猜出了不允许登录的用户的密码,则密码提示会出现1次。
有没有什么办法可以不泄露用户是否被拒绝进入系统,以及用户是否输入了正确的密码?
这不有使用 PAM 来完成,以尽可能少的信息泄露。