![如何有目的地延迟“帐户”PAM阶段?](https://linux22.com/image/203150/%E5%A6%82%E4%BD%95%E6%9C%89%E7%9B%AE%E7%9A%84%E5%9C%B0%E5%BB%B6%E8%BF%9F%E2%80%9C%E5%B8%90%E6%88%B7%E2%80%9DPAM%E9%98%B6%E6%AE%B5%EF%BC%9F.png)
我的 OpenSSH 服务器受到对用户名的字典攻击的轰炸,而不是使用pam_tally2
,fail2ban
或类似的(或者坦率地说只是丑陋的“更改端口”建议,不断在各种论坛上抛出)来简单地摆脱它们,我想要扰乱攻击者并浪费他们的时间(即使这只是他们的脚本的时间,至少意味着一些浪费了 CPU 和端口分配,他们不能用来攻击其他人)。
因此我的想法是在 PAMaccount
阶段引入某种延迟(希望在 OpenSSHd 之前引入延迟)能甚至回复“该用户不存在”),但pam_faildelay
遗憾的是该模块的直观选择仅支持auth
,这是从未达到的,因为统计上几乎所有被攻击的“帐户”实际上并不存在。
另外,我实际上不确定我是否想要失败延迟,我认为是无条件延迟前甚至在这里检查帐户会更好,以便泄漏尽可能少的信息。
鉴于这pam_just_delay_right_here
是一个显而易见的事情,听起来很容易实现(尽管我对 PAM 内部结构一无所知),而且我找不到任何东西,我确信我一定是在寻找错误的东西的事情,并且很高兴获得有关如何配置/实现此功能的任何帮助。
编辑:
在实施pam_exec /bin/sleep
下面@roaima建议的解决方案并进一步测试后,实际上我原来的“account
而不是auth
”想法似乎是错误的:我实际上做需要auth
,因为显然这发生在 之前account
。当我尝试使用它时,不知何故faildelay
从未被触发。我的猜测是要么 sshd 尽早检测到“错误的用户”,要么我在某种程度上误解了模块堆栈,因为它只适用于“正确的用户+错误的密码”。然而pam_exec sleep
,在整个堆栈之前添加一个无条件auth
确实可以正常工作(对于PID浪费值“fine”,但每次登录尝试都会产生3个sshd进程,所以我不在乎那就像相信自己能够编写一个安全的 PAM 模块一样)