最近,在服务器上发现了异常的登录尝试。尽管您的团队已经采取了强密码策略和其他安全措施来加固服务器,但恶意程序仍然通过暴力破解的方式试图多次尝试猜测正确的凭据以获取访问权限。为了增强系统的安全性,特别是防止此类暴力破解攻击,本教程将向您展示如何配置 pam_faillock 模块。通过这项配置,一旦用户在 SSH 登录中连续失败3次,其账户将会被自动锁定10分钟,有效地阻止进一步的未授权访问尝试。

2024-08-12T22:02:38-cwemepgr.jpg

什么是pam_faillock

pam_faillock 是一个 PAM(Pluggable Authentication Modules,可插入认证模块)模块,用于在 Linux 系统中限制用户登录失败次数的功能。其作用主要有以下几点:

  1. 登录失败计数器管理pam_faillock能够跟踪用户登录失败的次数。当用户连续多次登录失败时,它会增加计数器,并根据设定的策略来处理这些失败尝试。
  2. 限制登录:一旦用户登录失败的次数达到预设的阈值,pam_faillock 可以执行一些动作,例如锁定用户账户,禁止用户继续登录一段时间,或者需要管理员介入才能解锁账户。
  3. 保护系统安全:通过限制登录失败次数,pam_faillock 能够减少恶意用户通过暴力破解或者字典攻击等方式尝试访问系统的可能性,从而增强系统的安全性。
  4. 配置灵活pam_faillock 的行为可以通过配置文件(如 /etc/security/faillock.conf)进行定制,管理员可以根据自己的安全需求调整失败锁定的策略和参数。

案例演示

环境准备

本案例中采用Rocky Linux,具体的版本如下:

[root@rocky ~]# cat /etc/redhat-release
Rocky Linux release 9.0 (Blue Onyx)
[root@rocky ~]#

默认情况下,系统已经安装好了pam_faillock模块。

[root@rocky ~]# rpm -qa | grep pam
pam-1.5.1-9.el9_0.1.x86_64
systemd-pam-250-6.el9_0.1.x86_64
[root@rocky ~]#

配置PAM 配置文件以启用 pam_faillock

  1. 打开/etc/pam.d/password-auth 的 PAM 配置文件:
 vim  /etc/pam.d/password-auth
  1. 在文件中找到或添加以下行(确保在适当的位置添加):


具体的代码如下:

auth        required      pam_faillock.so preauth silent audit deny=3 unlock_time=600
auth        [default=die] pam_faillock.so authfail audit deny=3
account     required      pam_faillock.so
  • 解释一下这些参数:
    • deny=3:允许的最大失败次数。在这里,设置为3次。
    • unlock_time=600:账户被锁定的时间(以秒为单位)。在这里,设置为10分钟(600秒)。
    • preauthauthfail 分别用于预认证和认证失败时调用 pam_faillock
  1. 保存并关闭文件。
  2. 默认情况,锁定机制对root用户不生效的,然后,将该文件的内容复制到system-auth文件中,执行如下命令
cat /etc/pam.d/password-auth > /etc/pam.d/system-auth

重启 SSH 服务以应用更改

  1. 根据您的 Linux 发行版,使用以下命令重启 SSH 服务:
systemctl restart sshd
  1. 检查ssh的服务器是否正常,通过如下命令查看:

测试配置是否生效

  1. 新建测试用户,并修改密码
[didiplus@rocky ~]$ useradd didiplus
[didiplus@rocky ~]$ passwd didiplus #为didiplus用户修改密码
  1. 使用 SSH 连接到您的 Linux 服务器,故意输入错误密码三次。

  1. 第三次失败后,尝试使用正确的密码登录。如果一切设置正确,您将会被提示账户已被锁定,并显示锁定时间。
  • 通过faillock 可以查看被锁定的时间,从那个台服务器登录的。如下图:

  • 也可以通过日志文件查看,如下图:

通过这些步骤,您已经成功地配置了 pam_faillock,使得在 SSH 登录失败3次后自动锁定用户账户10分钟,从而增强了系统的安全性。

如果需要手动解锁账户,可以使用 faillock 命令:

faillock --user <username> --reset