Linux系统pam_tally2.so登陆成功后失败计数不清零问题解决
问题描述
linux系统(影像版本包括centos6.x,centos7.x和ubuntu14.04、16.04、18.04等使用pam_tally2策略限制ssh登录失败次数的系统)手动升级openssh到8.0p1版本后,修改/etc/pam.d/sshd pam策略配置文件添加限制用户ssh登录失败锁定次数的策略:
auth required pam_tally2.so onerr=fail deny=10 unlock_time=1800 even_deny_root root_unlock_time=1800
即限制用户使用ssh登录时,密码输入错误10后锁定当前用户,1800秒后解锁,用户可以再次登录。
配置之后发现无论用户密码输入对错,使用pam_tally2 --user 用户名 命令查看当前的登录失败次数都会增加,即使登陆成功,该计数器也不会清零。导致用户登录10次之后,每次都要等30分钟才能再次登录。
以centos7.6为例,添加策略后的/etc/pam.d/sshd文件如下:
注意:是手动从源码安装openssh 8.0p1后才出现的该问题,手动编译安装时configure指定了–with-pam参数,且ssh服务配置/etc/ssh/sshd_config配置了 UsePAM yes。可能是openssh升级后版本和pam版本不匹配引起的。系统安装完自动的ssh没有发现该问题。
pam_tally2.so简介
pam_tally2.so是一个linux的用户登录计数器模块。他会维护用户尝试登录的次数,当登录成功时重置计数器,当尝试登录失败次数过多时阻止登录。
( This module maintains a count of attempted accesses, can reset count on success, can deny access if too many attempts fail.)。
它包括pam_tally2.so和pam_tally2两部分,前者是一个PAM 模块,后者是一个独立的程序用来查看计数和手动清除计数信息。
其他详细信息不再这里说明,有兴趣的朋友自行搜索……
问题关键
pam_tally2.so 模块每次在用户登录,进行pam策略检查被调用时首先会对该登录用户的计数加一,然后正常的话会在用户登录成功后的调用pam_setcert 重置计数。
(Authentication phase first increments attempted login counter and checks if user should be denied access. If the user is authenticated and the login process continues on call to pam_setcred(3) it resets the attempts counter.)
但是实际上在用户登录成功后,计数器未能被清零,导致用户每次登录计数器都会加1.
问题解决
目前我使用如下方法解决该问题:
再次修改/etc/pam.d/sshd 文件,在account 配置的首行添加如下配置:
account required pam_tally2.so
注意: 这个配置最好放在account 配置的第一行,插入的位置也会对策略产生影响。
这样在通过了auth的检查,用户登录成功后account的pam_tally2 配置会将用户当前的计数重置为0,不再产生累加问题。
用户登录成功后,当前用户登录计数器清零。
centos8.x
在centos8.x 系列系统中,pam策略不再使用pam_tally2.so,改为使用pam_faillock.so 模块,使用方法和前者类似,同样可以使用faillock命令查看用户登录失败的记录。
但是在限制用户进行ssh登录的配置时,修改的是/etc/pam.d/password-auth 和 /etc/pam.d/system-auth 文件。
可是参考以下修改脚本:
sed -i '4 iauth required pam_faillock.so deny=10 unlock_time=1800 even_deny_root root_unlock_time=1800' /etc/pam.d/password-auth
sed -i '/auth.*sufficient.*pam_unix.so.*/aauth [default=die] pam_faillock.so authfail audit deny=10 even_deny_root unlock_time=1800' /etc/pam.d/password-auth
sed -i '/account.*required.*pam_permit.so/aaccount required pam_faillock.so' /etc/pam.d/password-auth
sed -i '4 iauth required pam_faillock.so deny=10 unlock_time=1800 even_deny_root root_unlock_time=1800' /etc/pam.d/system-auth
sed -i '/auth.*sufficient.*pam_unix.so.*/aauth [default=die] pam_faillock.so authfail audit deny=10 even_deny_root unlock_time=1800' /etc/pam.d/system-auth
sed -i '/account.*required.*pam_permit.so/aaccount required pam_faillock.so' /etc/pam.d/system-auth
配置文件如下:
system-auth文件:
password-auth文件: