![避免泄露信息,无论用户是否被拒绝访问或输入了错误的密码](https://linux22.com/image/788572/%E9%81%BF%E5%85%8D%E6%B3%84%E9%9C%B2%E4%BF%A1%E6%81%AF%EF%BC%8C%E6%97%A0%E8%AE%BA%E7%94%A8%E6%88%B7%E6%98%AF%E5%90%A6%E8%A2%AB%E6%8B%92%E7%BB%9D%E8%AE%BF%E9%97%AE%E6%88%96%E8%BE%93%E5%85%A5%E4%BA%86%E9%94%99%E8%AF%AF%E7%9A%84%E5%AF%86%E7%A0%81.png)
我目前正在为一个拥有 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 来完成,以尽可能少的信息泄露。