使用 pam_tally2 锁定帐户

pam_tally2 是一个登录计数器(tallying)模块。
该模块维护尝试访问的计数,可以重置成功计数,如果尝试失败次数过多,则可以拒绝访问。

必须修改下面两个配置文件才能执行所有帐户锁定或者解锁相关的更改

/etc/pam.d/system-auth
/etc/pam.d/password-auth

默认情况下,这些登录尝试相关信息存储在“/var/log/tallylog”下,但可以根据要求使用 pam.d 文件中的“file=/path/to/counter”进行更改。

更多可用于附加限制/修改的变量:

onerr=[fail|succeed]
如果发生了奇怪的事情(比如无法打开文件),如果给出onerr=SUCCESS,则返回PAM_SUCCESS,否则返回相应的PAM错误代码。

deny=n
如果此用户的计数超过n,则拒绝访问。

lock_time=n
设置锁定时间,尝试失败后,始终拒绝n秒。

unlock_time=n
设置解锁时间,尝试失败后n秒后允许访问。如果使用此选项,用户将在超过其最大允许尝试次数后被锁定指定的时间。否则,帐户将被锁定,直到系统管理员手动干预解除锁定。

file=/path/to/counter
指定用于保存计数的文件。默认值为/var/log/tallylog。

使用的语法

pam_tally2.so [file=/path/to/counter] [onerr=[fail|succeed]] [even_deny_root] [deny=n] [lock_time=n] [unlock_time=n] [root_unlock_time=n] [audit] [silent]

使用faillock解锁 root 用户帐户

为了证明我已经尝试使用“root”用户登录失败

因此,在几次登录失败后,我看到 faillock 现在向我显示所有尝试

# faillock
jack:
When                Type  Source                                           Valid
root:
When                Type  Source                                           Valid
2015-08-03 11:54:01 RHOST 10.43.138.3                                          V
2015-08-03 11:54:07 RHOST 10.43.138.3                                          V
2015-08-03 11:54:11 RHOST 10.43.138.3                                          V
2015-08-03 11:54:15 RHOST 10.43.138.3                                          V
2015-08-03 11:54:19 RHOST 10.43.138.3                                          V
2015-08-03 11:54:21 RHOST 10.43.138.3                                          V

从 /var/log/secure 我们看到用户“root”被锁定

Aug  2 22:36:44 openstack sshd[8486]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.43.138.3  user=root
Aug  2 22:36:44 openstack sshd[8486]: pam_faillock(sshd:auth): Consecutive login failures for user root account temporarily locked

解锁“root”用户

# faillock --user root --reset

重要说明:我建议仅使用“unlock_time”锁定“root”用户,否则我们最终可能会遇到没有任何活动会话并且无法解锁“root”用户的情况。

使用 pam_tally2 解锁非 root(普通)用户帐户

成功完成上述更改后,尝试使用不正确的密码以普通用户登录服务器超过 3 次。

例如,我为来自“10.43.138.2”的用户“jack”做了一些失败的登录尝试

检查现有状态

# pam_tally2
Login           Failures Latest failure     From
jack              3    08/03/18 11:20:18  10.43.138.3

现在尝试登录 3 次失败后,我在尝试执行 ssh 时收到以下消息

# ssh jack@10.43.138.4
Password:
Account locked due to 3 failed logins
Password:

因此,正如预期的那样,我们的帐户被锁定了。

要解锁用户,请使用以下命令

# pam_tally2 --user jack --reset
Login           Failures Latest failure     From
jack              3    07/28/18 22:35:51  10.43.138.2

接下来再次检查状态

# pam_tally2 --user jack
Login           Failures Latest failure     From
jack              0

因此,失败的登录尝试已被清除。

锁定尝试登录失败的“root”用户

这里我们添加了如下所示的“even_deny_root”,以确保“root”用户在使用错误密码3次时也会被阻止

auth        required      pam_tally2.so deny=3 even_deny_root onerr=fail
account     required      pam_tally2.so

我的system-auth 和 password-auth 文件示例

auth        required      pam_env.so
auth        required      pam_tally2.so deny=3 even_deny_root onerr=fail
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so
account     required      pam_tally2.so
account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so
password    requisite     pam_cracklib.so try_first_pass retry=3 type=
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_oddjob_mkhomedir.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

注意:上述更改不需要重启或者任何服务重启来使更改生效

使用faillock解锁普通用户帐户(非 root)

默认情况下,如果没有失败的登录尝试,则“faillock”的输出将为空白,如下所示

# faillock
jack:
When                Type  Source                                           Valid
root:
When                Type  Source                                           Valid

一旦我在尝试 ssh 时故意提供错误的密码,faillock值将自动添加

# faillock
jack:
When                Type  Source                                           Valid
2015-08-02 11:49:31 RHOST 10.43.138.2                                          V
2015-08-02 11:49:39 RHOST 10.43.138.2                                          V
2015-08-02 11:49:43 RHOST 10.43.138.2                                          V
root:
When                Type  Source                                           Valid

一旦尝试次数达到阈值,用户帐户将被锁定
在超过 3 次登录尝试失败后,可以在 /var/log/secure 中看到以下消息

Aug  2 11:49:43 openstack sshd[29038]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=10.43.138.2  user=jack
Aug  2 11:49:43 openstack sshd[29038]: pam_faillock(sshd:auth): Consecutive login failures for user jack account temporarily locked

解锁用户“jack”

# faillock --user jack --reset

接下来,如果我们检查当前状态,与用户“jack”相关的所有内容都应该是干净的

# faillock
jack:
When                Type  Source                                           Valid
root:
When                Type  Source                                           Valid

使用 pam_tally2 解锁“root”用户帐户

检查所有用户的状态

# pam_tally2
Login           Failures Latest failure     From
root                5    08/03/18 11:20:33  10.43.138.3

要解锁“root”用户,请使用以下命令

# pam_tally2 --user root --reset
Login           Failures Latest failure     From
root                7    08/03/18 11:52:55  10.43.138.3

重要说明:我建议仅使用“unlock_time”锁定“root”用户,否则我们最终可能会遇到没有任何活动会话并且无法解锁“root”用户的情况。

锁定登录尝试失败的非root用户(普通用户)

下面是最低配置。
在这里,如果尝试3 次使用错误的密码 ,我们将锁定一个普通用户帐户

在这两个配置文件中添加以下两行

auth        required      pam_tally2.so deny=3 onerr=fail
account     required      pam_tally2.so

我的system-auth 和 password-auth 文件示例

auth        required      pam_env.so
auth        required      pam_tally2.so deny=3 onerr=fail
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so
account     required      pam_tally2.so
account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so
password    requisite     pam_cracklib.so try_first_pass retry=3 type=
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_oddjob_mkhomedir.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

使用 pam_faillock 锁定尝试3 次登录失败的“root”用户

要为“root”用户应用帐户锁定,请将 even_deny_root 选项添加到 pam_faillock 条目中,这两个配置文件均采用以下格式

auth        required      pam_faillock.so preauth silent audit deny=3 even_deny_root unlock_time=600
auth        [default=die] pam_faillock.so authfail audit deny=3 even_deny_root unlock_time=600
account     required      pam_faillock.so

system-auth 和 password-auth 文件示例

auth        required      pam_env.so
auth        required      pam_faillock.so preauth silent audit deny=3 even_deny_root unlock_time=600
auth        sufficient    pam_unix.so nullok try_first_pass
auth        required      pam_faillock.so authfail audit deny=3 fail_interval=900 unlock_time=600
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so
account     required      pam_faillock.so
account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so
password    requisite     pam_cracklib.so try_first_pass retry=3 type=
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_oddjob_mkhomedir.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

重要说明:如果 pam_faillock.so 未按预期工作,则可能必须对 SSHD 的配置进行以下更改:

# vi /etc/ssh/sshd_config
ChallengeResponseAuthentication yes
PasswordAuthentication no -> 确保密码输入始终通过此PAM对话

重新启动 sshd 服务以使更改生效

# systemctl restart sshd

使用 pam_faillock 锁定3 次尝试登录失败的非 root 用户

添加以下行以在 3 次登录尝试失败后将非 root 用户锁定 10 分钟

auth        required      pam_faillock.so preauth silent deny=3 fail_interval=900 unlock_time=600
auth        required      pam_faillock.so authfail deny=3 fail_interval=900 unlock_time=600
account     required      pam_faillock.so

system-auth 和 password-auth 文件示例

auth        required      pam_env.so
auth        required      pam_faillock.so preauth silent audit deny=3 unlock_time=600
auth        sufficient    pam_unix.so nullok try_first_pass
auth        required      pam_faillock.so authfail audit deny=3 fail_interval=900 unlock_time=600
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_faillock.so
account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 500 quiet
account     required      pam_permit.so

password    requisite     pam_cracklib.so try_first_pass retry=3 type=
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_oddjob_mkhomedir.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

使用 pam_faillock 锁定尝试登录失败的帐户

pam_faillock 是在指定时间间隔内计算身份验证失败的模块

在 Red Hat Enterprise Linux 7 中,pam_faillock PAM 模块允许系统管理员在指定次数的失败尝试后锁定用户帐户。
限制用户登录尝试主要用作一种安全措施,旨在防止可能以获取用户帐户密码为目标的暴力攻击。

使用 pam_faillock 模块,失败的登录尝试存储在 /var/run/faillock 目录中每个用户的单独文件中。

必须修改下面两个配置文件才能实现

/etc/pam.d/system-auth
/etc/pam.d/password-auth

下面是一些可配置的选项

{preauth|authfail|authsucc}
必须根据此模块实例在PAM堆栈中的位置相应地设置此参数。
在调用用户凭据之前,必须先询问用户凭据的密码参数,如模块。该模块只检查如果最近出现异常数量的连续身份验证失败尝试,是否应阻止用户访问服务。如果使用authsucc,则此调用是可选的。
在确定身份验证结果的模块失败后调用模块时,必须使用authfail参数。除非用户由于以前的身份验证失败而被阻止,否则模块会将失败记录到相应的用户记录文件中。
在确定身份验证结果的模块成功后调用模块时,必须使用authsucc参数。除非该用户由于之前的身份验证失败而被阻止,否则该模块将清除相应用户记录文件中的失败记录。否则它将返回身份验证错误。如果未完成此调用,pam_faillock将不会区分连续和非连续失败的身份验证尝试。在这种情况下必须使用预授权调用。由于PAM堆栈的配置方式比较复杂,因此也可以将PAM_faillock作为帐户模块调用。在这种配置中,还必须在预授权阶段调用模块。

fail_interval=n
用户帐户锁定必须发生连续身份验证失败的间隔长度为n秒。默认值为900(15分钟)。

unlock_time=n
锁定n秒后,将重新启用访问。默认值为600(10分钟)。
如果n设置为“从不”或者“0”,则在管理员使用faillock命令显式重新启用访问之前,将不会重新启用访问。请注意,pam_faillock使用的默认目录通常在系统引导时被清除,因此在系统重新引导后也将重新启用访问。如果不需要,则必须使用dir选项设置不同的计数目录。
还请注意,通常不希望永久锁定用户,因为他们很容易成为拒绝服务攻击的目标,除非用户名是随机的,并且对潜在攻击者保密。

even_deny_root
根帐户和常规帐户一样可以被锁定。

root_unlock_time=n
此选项表示偶数拒绝根选项。在帐户锁定后,允许在n秒后访问根帐户。如果未指定该选项,则该值与解锁时间选项的值相同。

audit
如果找不到用户,将把用户名记录到系统日志中。

silent
不要打印信息性消息。此选项在authfail和authsuch函数中是隐式的。

使用的语法

auth ... pam_faillock.so {preauth|authfail|authsucc} [dir=/path/to/tally-directory] [even_deny_root] [deny=n] [fail_interval=n] [unlock_time=n] [root_unlock_time=n] [admin_group=name] [audit] [silent] [no_log_info]
account ... pam_faillock.so [dir=/path/to/tally-directory] [no_log_info]
Linux如何锁定多次登录失败的用户?

在 Linux 中尝试登录失败一定次数后,如何使用 pam_tally2 和 pam_faillock 锁定或者解锁 root 和普通用户帐户

日期:2020-06-02 22:17:07 来源:oir作者:oir