Linux下SSH用户登录失败后的锁定与解锁
2024-10-23 15:46:34 阿炯

在设置服务器时,SSH安全性是最优先考虑的问题。默认的SSH设置通常不足以保护服务器免受外部攻击;因此需要进行额外的调整,以提供相当数量的安全性,防止暴力攻击。其中之一是实现fail2ban,在进行了一定次数的错误日志尝试后阻止未经授权的用户。类似地可以利用pam_faillock模块来实现帐户锁定策略。PAM模块是所有Linux发行版的一部分,提供的配置应该适用于所有Linux发行版。

本指南将展示在基于RedHat的发行版中,当SSH登录尝试失败的次数达到指定次数后,如何锁定系统用户的帐户。在基于Debian系的发行版上需要使用pam_tally2模块来锁定失败的SSH登录。这里的重点是通过在连续多次SSH身份验证失败后锁定用户的帐户来强制执行简单的服务器安全性。

目录表

1.什么是pam_faillock模块?
2.SSH登录失败后如何锁定用户
3.SSH登录失败后如何锁定root用户
4.如何测试SSH用户登录失败
5.如何查看SSH登录失败信息
6.SSH登录失败后如何解锁用户
7.禁用SSH登录失败锁定用户功能
8.如何禁用Faillock模块
9.关于pam_tally2

1.什么是pam_faillock模块
pam_faillock模块是Linux PAM(Pluggable Authentication Modules)的一部分,这是一个由共享库组成的实用程序,它将应用程序与标准身份验证方法分离开来。它接受来自诸如sshd、gdm、login等程序的身份验证检查,并对Linux系统中那些服务或应用程序的用户进行身份验证。可通过配置PAM来审计用户登录shell活动。

模块记录每个用户的认证失败次数,当认证失败次数超过一定限制时,模块会暂时锁定用户。失败的登录尝试存储在计数目录下的每个用户文件中,默认为/var/run/faillock/。

pam_faillock模块取代了在RHEL 7-8中已弃用的pam_tally和pam_tally2模块。它提供了比这两个模块更多的灵活性和选项。

2.SSH登录失败后如何锁定用户
可以在/etc/pam.d目录下的文件中配置上述功能,/etc/pam.d/system-auth 与 /etc/pam.d/password-auth文件,通过将以下条目添加到其auth部分行。

要在3次SSH尝试失败后锁定或拒绝用户访问系统,并在1200秒后解锁用户帐户,请在auth部分添加以下行。
auth   required      pam_faillock.so preauth silent audit deny=3 unlock_time=1200
auth   [default=die] pam_faillock.so authfail audit deny=3 unlock_time=600

说明:
audit - 启用用户审计。
deny - 用于定义尝试次数(在本例中为3次),超过该次数后应锁定用户帐户。
unlock_time - 设置帐号被锁定的时间(600秒 = 10分钟)。

请注意,这些行的顺序非常重要,错误的配置可能导致所有用户帐户被锁定。

两个文件中的auth部分的内容应按以下顺序排列:
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authselect is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so try_first_pass nullok
auth        required      pam_deny.so
auth        required      pam_faillock.so preauth silent audit deny=3 unlock_time=1200
auth        [default=die] pam_faillock.so authfail audit deny=3 unlock_time=600

接下来移步到account部分,并在上述两个文件中添加以下行。
account     required      pam_faillock.so

添加上述设置后,它应该如下所示。
#%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        sufficient    pam_unix.so nullok try_first_pass
auth        required      pam_deny.so
auth        required    pam_faillock.so preauth audit deny=5 unlock_time=1200
auth        required    pam_faillock.so authfail audit deny=3 unlock_time=600

account     required      pam_unix.so
account     required      pam_faillock.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    requisite    pam_cracklib.so dcredit=-1 ucredit=-1 lcredit=-1 ocredit=-1 minclass=2 minlen=8
password    required      pam_unix.so remember=5
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.SSH登录失败后如何锁定root用户
可以将even_deny_root参数添加到auth节中,以锁定特权和普通用户。在此例中,普通用户SSH登录失败3次后解锁时间为1200秒(20分钟),root用户将为3600秒(60分钟或1小时)。
auth    required       pam_faillock.so preauth silent audit deny=3 even_deny_root unlock_time=1200
auth    [default=die]  pam_faillock.so authfail  audit  deny=3 even_deny_root unlock_time=3600

一旦配置完成便可以重新启动远程访问服务,如sshd,以使上述策略生效,即如果用户将使用ssh连接到服务器。有必要将运行一个测试并检查配置是否有效。

4.如何测试SSH用户登录失败
根据上述设置,将系统配置为在3次身份验证失败后锁定用户的帐户。

在此场景中,用户zheng尝试切换到用户freeoa,但由于密码错误导致3次错误登录后,显示“Permission denied”消息,用户freeoa的帐户被锁定,第四次尝试时显示“authentication failure”消息。

系统还会在root用户登录时通知显示尝试失败的次数等情况。pam_faillock记录暂时锁定的root用户连续登录失败(不带even_deny_root选项):
1). pam_faillock/faillock.conf包含默认配置。例如even_deny_root和root_unlock_time都被注释掉了,不应该因登录失败而锁定root帐户。

2). 但当root使用不正确的密码进行身份验证时,尽管帐户实际上没有被锁定,但在/var/log/secure中会记录登录的错误消息。

pam_faillock(su- 1:auth): root用户连续登录失败,暂时锁定;在“/var/log/secure”中记录此错误信息后,root用户可以使用正确的密码成功登录。

5.如何查看SSH登录失败信息
可以使用faillock实用程序查看所有失败的SSH身份验证日志,该实用程序用于显示和修改身份验证失败日志。
# faillock --user freeoa

可以查看特定用户失败的登录尝试,会显示日期时间(When),终端类型(Type:TTY 或 RHOST),来源(Source:pts/N 或 IP-Address),验证情况(Valid:V 或 I)。

要查看所有失败的登录尝试问题,在root用户下直接运行不带任何参数faillock命令即可。命令faillock管理pam_faillock模块,该模块在许多发行版上处理用户登录尝试和锁定问题。

除了在pam文件指定拒绝次数外,还可在其配置文件中指定:/etc/security/faillock.conf
# Deny access if the number of consecutive authentication failures
# for this user during the recent interval exceeds n tries. The default is 3.
deny = 3


6.SSH登录失败后如何解锁用户
当需要清除指定用户认证失败的记录时,使用此命令。
# faillock --user freeoa --reset

当然也可以删除faillock工作目录(/var/run/faillock)下的对应用户锁定文件,以同样达到解锁指定用户的目的。

7.禁用SSH登录失败锁定用户功能
如果要系统在多次失败的登录尝试后,不锁定用户的帐户,可添加以粗体突出显示的条目,该条目位于两个文件(/etc/pam.d)中auth部分下首次调用pam_faillock的位置上方(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 authselect is run.
auth        required      pam_env.so
auth        sufficient    pam_unix.so try_first_pass nullok
auth        required      pam_deny.so
auth   [success=1 default=ignore] pam_succeed_if.so user in zheng:freeoa
auth        required      pam_faillock.so preauth silent audit deny=3 unlock_time=1200
auth        [default=die] pam_faillock.so authfail audit deny=3 unlock_time=600

8.如何禁用Faillock模块
禁用pam_failock模块可使用如下指令:
# authconfig --disablefaillock --update

有关更多信息,请参阅pam_faillock和faillock手册页。

9.关于pam_tally2

尽管pam_tally2不适合用于faillock,但一些系统仍然使用它。虽然pam_tally2和faillock的行为相似,但也存在一些差异,通常认为pam_tally2是一个过时的工具。

pam_tally2模块用于在用户SSH登录失败一定次数后锁定用户,该模块保存尝试访问的计数和太多失败的尝试。它可分为两部分,一部分是pam_tally2.so,另一个是pam_tally2。它基于PAM模块,可用于检查和操作计数器文件,可以显示用户登录尝试计数,设置计数在个人的基础上,解锁所有用户计数。默认情况下,pam_tally2模块已经安装在大多数Linux发行版上,它由PAM包本身控制。

使用其对就的PAM配置文件'/etc/pam.d/password-auth'并配置登录次数访问。打开该文件,并在“auth”部分的开头添加以下auth配置行:
auth    required    pam_tally2.so  file=/var/log/tallylog onerr=fail deny=3 even_deny_root unlock_time=1200

接下来,将以下行添加到'account'部分。
account     required      pam_tally2.so

参数说明:
file=/var/log/tallylog -- Default log file is used to keep login counts.
deny=3 -- Deny access after 3 attempts and lock down user.
even_deny_root -- Policy is also apply to root user.
unlock_time=1200 -- Account will be locked till 20 Min. (remove this parameters if you want to lock down permanently till manually unlock.)

完成上述配置后,现在尝试使用任意用户名尝试3次失败的登录尝试。在进行了3次以上的尝试后,将收到用户被锁定的消息。

可先查看用户密码的修改情况
chage -l username

使用与faillock相同的语法来检查用户freeoa的状态:
# pam_tally2 --user freeoa
Login           Failures Latest failure     From
freeoa            3    06/23/22 18:32:39  pts/0

与faillock的不同之处在于pam_tally2只显示最近一次尝试的数据。

第一列显示登录尝试的目标用户名。第二列给出了失败尝试的当前计数,类似于faillock的Valid列。接下来在第三列中看到最近一次尝试的日期和时间。最后,From列类似于faillock的Source列。它显示了尝试的来源,通常是pts/0或IP地址。

使用pam_tally2解封用户的语法与faillock相似
# pam_tally2 --user freeoa --reset
Login           Failures Latest failure     From
freeoa            3    06/23/22 18:32:39  pts/0

pam_tally2在复位成功时报告复位前失败的日志。同样可以对其记录文件 /var/log/tallylog 来处理以达到解封用户的目的,但小有差别。

与faillock类似,可以删除pam_tally2存储重置用户的登录尝试的文件;但pam_tally2只对所有记录仅使用一个文件,因此不能通过删除该文件来只重置一个用户。默认情况下,该文件位于/var/log/tallylog。删除它将重置所有用户的登录尝试:
# rm -v /var/log/tallylog