但行好事
莫论前程❤

Linux用户认证–Pam_Tally2用户锁定/解锁

在Linux系统中,用户多次登录失败会被锁定,一段时间内将不能再登录系统,这是一般会用到Pam_Tally2进行账户解锁。

了解PAM

Linux-PAM (Pluggable Authentication Modules for Linux)可插拔认证模块。Linux-PAM是一套适用于Linux的身份验证共享库系统,它为系统中的应用程序或服务提供动态身份验证模块支持。在Linux中,PAM是可动态配置的,本地系统管理员可以自由选择应用程序如何对用户进行身份验证。PAM应用在许多程序与服务上,比如登录程序(login、su)的PAM身份验证(口令认证、限制登录),passwd强制密码,用户进程实时管理,向用户分配系统资源等。

​ PAM的主要特征是认证的性质是可动态配置的。PAM的核心部分是库(libpam)和PAM模块的集合,它们是位于文件夹/lib/security/中的动态链接库(.so)文件,以及位于/etc/pam.d/目录中(或者是/etc/pam.conf配置文件)的各个PAM模块配置文件。/etc/pam.d/目录中定义了各种程序和服务的PAM配置文件,其中system-auth文件是PAM模块的重要配置文件,它主要负责用户登录系统的身份认证工作,不仅如此,其他的应用程序或服务可以通过include接口来调用它(该文件是system-auth-ac的软链接)。此外password-auth配置文件也是与身份验证相关的重要配置文件,比如用户的远程登录验证(SSH登录)就通过它调用。而在Ubuntu、SUSE Linux等发行版中,PAM主要配置文件是common-authcommon-accountcommon-passwordcommon-session这四个文件,所有的应用程序和服务的主要PAM配置都可以通过它们来调用。

使用如下命令判断程序是否使用了PAM:

root@test~ # ldd /usr/bin/passwd | grep libpam

libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007fb74f748000)
libpam.so.0 => /lib64/libpam.so.0 (0x00007fb74eb45000)

如看到有类似的输出,说明该程序使用了PAM,没有输出,则没有使用。

pam_tally2模块用于某些数对系统进行失败的ssh登录尝试后锁定用户帐户。 此模块保留已尝试访问的计数和过多的失败尝试。

pam_tally2模块有两个部分,一个是pam_tally2.so,另一个是pam_tally2。 它是基于PAM模块上,并且可以被用于检查和调节计数器文件。 它可以显示用户登录尝试次数,单独设置计数,解锁所有用户计数。

手动解除锁定(root权限):

  • 查看hadoop用户的错误登陆次数:
pam_tally --user hadoop
  • 清空 hadoop 用户的错误登陆次数,
pam_tally --user hadoop –-reset
  • 如果使用pam_tally没生效的话,也可以使用pam_tally2命令:
pam_tally2 --user tom --reset  #  将用户的计数器重置清零(SLES 11.2和12版本下用此命令才重置成功)
pam_tally2 -u tom -r   # suse系统实践验证可行
  • 查看错误登录次数:
pam_tally2 -u tom
  • 清空所有用户错误登录次数, 在服务器端以root用户登录, 执行命令:
 faillog –a             # 查看用户登录错误次数
 faillog -u user –r     # 清空指定用户user的错误登录次数

注:

1. pam_tally2与pam_tally模块的区别是前者增加了自动解锁时间的功能,后者没有。所以在老的发行版中,如果使用了pam_tally模块时,可以使用pam_tally 、faillog配合crontab 进行自动解锁。

2. 如果超过三次的话,用户不能登录并且此后登录用户错误登录次数还是会增加。

3. 在登录错误次数不满三次时,登录成功后,则这个用户登录错误值将清零,退出后重新telnet登录将采用新的计数。

PAM身份验证配置文件

针对不同服务来限制不同登陆方式:

  • 只在本地文本终端上做限制,可以编辑如下文件,添加的内容和上方一样。
vi /etc/pam.d/login           # 终端登录修改该文件
  • 只在kde图形化登陆界面上做限制,可以编辑如下文件,添加的内容和上方也一样。
vi /etc/pam.d/kde
  • 只在远程telnet、ssh登陆上做限制,可以编辑如下文件,添加的内容和上方也一样。
vi /etc/pam.d/remote
vi /etc/pam.d/sshd        # 通过ssh连接时做限制
如果想在所有登陆方式上,限制所有用户,可以在 /etc/pam.d/system-auth 中增加2行

及在system-auth中配置后 , 凡是调用system-auth文件的服务,都会生效

添加的内容如下:

auth  required     pam_tally.so   onerr=fail  no_magic_root
account  required  pam_tally.so   deny=3  no_magic_root  even_deny_root_account  per_user  reset

PAM配置文件语法格式

每个PAM配置文件都包含一组指令,用于定义模块以及控制标志和参数。每条指令都有一个简单的语法,用于标识模块的目的(接口)和模块的配置设置,语法格式如下:

module_interface      control_flag      module_name  module_arguments

如在/etc/pam.d/password-auth-ac配置文件中(CentOS),其中一行PAM模块接口定义如下

img

PAM模块接口(模块管理组)

PAM为认证任务提供四种类型可用的模块接口,它们分别提供不同的认证服务:

auth– 认证模块接口,如验证用户身份、检查密码是否可以通过,并设置用户凭据
account– 账户模块接口,检查指定账户是否满足当前验证条件,如用户是否有权访问所请求的服务,检查账户是否到期
password– 密码模块接口,用于更改用户密码,以及强制使用强密码配置
session– 会话模块接口,用于管理和配置用户会话。会话在用户成功认证之后启动生效

单个PAM库模块可以提供给任何或所有模块接口使用。例如,pam_unix.so提供给四个模块接口使用。

PAM控制标志

所有的PAM模块被调用时都会返回成功或者失败的结果,每个PAM模块中由多个对应的控制标志决定结果是否通过或失败。每一个控制标志对应一个处理结果,PAM库将这些通过/失败的结果整合为一个整体的通过/失败结果,然后将结果返回给应用程序。模块可以按特定的顺序堆叠。控制标志是实现用户在对某一个特定的应用程序或服务身份验证的具体实现细节。该控制标志是PAM配置文件中的第二个字段,PAM控制标志如下:

> required– 模块结果必须成功才能继续认证,如果在此处测试失败,则继续测试引用在该模块接口的下一个模块,直到所有的模块测试完成,才将结果通知给用户。
> requisite– 模块结果必须成功才能继续认证,如果在此处测试失败,则会立即将失败结果通知给用户。
> sufficient– 模块结果如果测试失败,将被忽略。如果sufficient模块测试成功,并且之前的required模块没有发生故障,PAM会向应用程序返回通过的结果,不会再调用堆栈中其他模块。
> optional– 该模块返回的通过/失败结果被忽略。当没有其他模块被引用时,标记为optional模块并且成功验证时该模块才是必须的。该模块被调用来执行一些操作,并不影响模块堆栈的结果。
> include– 与其他控制标志不同,include与模块结果的处理方式无关。该标志用于直接引用其他PAM模块的配置参数

PAM配置方法

所有的PAM配置方法都在man手册中有说明,比如要查找某个程序支持PAM模块的配置,可以使用man 加模块名(去掉.so)查找说明,如#man pam_unix。(模块名可以在目录/lib/security//lib64/security/中找到。)

参数详解

应用场景:设置Linux用户连续N次输入错误密码进行登陆时,自动锁定X分钟或永久锁定(这里的永久锁定指除非进行手工解锁,否则会一直锁定)。

配置格式:

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

1、全局参数

file        # 用于指定统计次数存放的位置,默认保存在/var/log/tallylog文件中;
onerr       # 当意外发生时,返加PAM_SUCCESS或pam错误代码,一般该项不进行配置;
audit       # 如果登录的用户不存在,则将访问信息写入系统日志;
silent      # 静默模式,不输出任何日志信息;
no_log_info # 不打印日志信息通过syslog

上面的五项全局参数,一般在使用中都不需要单独配置。

2、认证选项

deny             # 指定最大几次认证错误,如果超出此错误,将执行后面的策略。如锁定N秒,如果后面没有其他策略指定时,默认永远锁定,除非手动解锁。
lock_time         # 锁定多长时间,按秒为单位;
unlock_time       # 指定认证被锁后,多长时间自动解锁用户;
magic_root        # 如果用户uid=0(即root账户或相当于root的帐户)在帐户认证时调用该模块发现失败时,不计入统计;
no_magic_root     # 连root用户也在限制范围,不给root特殊权限。
no_lock_time      # 不使用.fail_locktime项在/var/log/faillog 中记录用户 ---按英文直译不太明白,个人理解即不进行用户锁定;
even_deny_root    # root用户在认证出错时,一样被锁定(该功能慎用,搞不好就要单用户时解锁了)
root_unlock_time  # root用户在失败时,锁定多长时间。该选项一般是配合even_deny_root 一起使用的。

PAM身份验证安全配置实例

一、强制使用强密码(用户密码安全配置)

PAM配置文件:/etc/pam.d/system-auth-ac

模块名称:pam_cracklib(仅适用于password模块接口)

模块参数:

minlen=12           # 密码字符长度不少于12位(默认为9)
lcredit=-1          # 至少包含1个小写字母
ucredit=-1          # 至少包含1个大写字母
dcredit=-1          # 至少包含1个数字
ocredit=-1          # 至少包含1个特殊字符
retry=3             # 配置密码时,提示3次用户密码错误输入
difok=6             # 配置密码时,新密码中至少6个字符与旧密码不同(默认为5)

其他常用参数:

reject_username     # 新密码中不能包含与用户名称相同的字段
maxrepeat=N         # 拒绝包含超过N个连续字符的密码,默认值为0表示此检查已禁用
maxsequence=N       # 拒绝包含大于N的单调字符序列的密码,例如’1234’或’fedcb’,默认情况下即使没有这个参数配置,一般大多数这样的密码都不会通过,除非序列只是密码的一小部分
maxcla***epeat=N    # 拒绝包含相同类别的N个以上连续字符的密码。默认值为0表示此检查已禁用。
use_authtok         # 强制使用先前的密码,不提示用户输入新密码(不允许用户修改密码)

模块名称:pam_unix (适用于account,auth, password和session模块接口)

模块参数:

remember=N      # 保存每个用户使用过的N个密码,强制密码不能跟历史密码重复

其他常见参数:

sha512         #  当用户下一次更改密码时,使用SHA256算法进行加密
md5            #  当用户更改密码时,使用MD5算法对其进行加密。
try_first_pass #  在提示用户输入密码之前,模块首先尝试先前的密码,以测试是否满足该模块的需求。
use_first_pass #  该模块强制使用先前的密码(不允许用户修改密码),如果密码为空或者密码不对,用户将被拒绝访问
shadow         #  用户保护密码
nullok         #  默认不允许空密码访问服务
use_authtok    #  强制使用先前的密码,不提示用户输入新密码(不允许用户修改密码)

修改配置/etc/pam.d/system-auth-ac文件,在password模块接口行修改或添加配置参数如下:

password requisite pam_cracklib.so try_first_pass retry=3 type= reject_username minlen=12 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 difok=6

img

需要注意的是,我在这里展示的是在RHEL/CentOS下的配置,passwd程序的PAM配置文件涉及主配置文件/etc/pam.d/passwd/etc/pam.d/system-auth-ac(也可以是/etc/pam.d/password-auth-ac),其中/etc/pam.d/passwd配置文件默认只包含了/etc/pam.d/system-auth-ac配置文件,因此对于以上PAM身份验证密码模块配置,只修改/配置该文件即可。或者在Ubuntu中,配置文件包括:/etc/pam.d/common-password、/etc/pam.d/common-account、/etc/pam.d/common-auth、/etc/pam.d/common-session

其他例子:

Pam_tally2锁定SSH登录

默认情况下,pam_tally2模块已经安装在大多数Linux发行版,它是由PAM包本身的控制。 本文演示如何锁定和深远的登录尝试的失败一定次数后解锁SSH帐户。

如何锁定和解锁用户帐户

使用“/etc/pam.d/password-auth”配置文件来配置的登录尝试的访问。 打开此文件并以下AUTH配置行举行的“ 身份验证 ”部分的开头添加到它。

auth required pam_tally2.so file=/var/log/tallylog deny=3  even_deny_root unlock_time=1200

接下来,添加以下行“ 账户 ”部分。

account required pam_tally2.so
参数 文件= /无功/日志/ tallylog             # 默认的日志文件是用来保持登录计数。 
deny = 3                                 # 拒绝后,3次尝试访问和锁定用户。
even_deny_root                            # 政策也适用于root用户。 
unlock_time = 1200                        # 帐户将被锁定,直到20分钟 (如果要永久锁定,直到手动解锁,请删除此参数) 一旦你使用上面的配置完成,现在尽量尝试使用任何“ 用户名 ”3失败的登录尝试到服务器。当你取得了超过3次,你会收到以下消息。 
[root@test01 ~]# ssh test01@172.16.25.126

test01@172.16.25.126's password:
Permission denied, please try again.
test01@172.16.25.126's password:
Permission denied, please try again.
test01@172.16.25.126's password:
Account locked due to 4 failed logins
Account locked due to 5 failed logins
Last login: Mon Apr 22 21:21:06 2017 from 172.16.16.52

现在,使用以下命令验证或检查用户尝试的计数器。

[root@test01 ~]# pam_tally2 --user test01

Login Failures Latest failure From
test01 15 04/22/17 21:22:37 172.16.16.52

如何重置或解锁用户帐户以再次启用访问。

[root@test01 pam.d]# pam_tally2 --user=test01 --reset

Login Failures Latest failure From
test01 15 04/22/13 17:10:42 172.16.16.52

验证登录尝试已重置或解锁

[root@test01 pam.d]# pam_tally2 --user=test01

Login Failures Latest failure From
test01 0

二:手动锁定

用户禁止使用

​ 可以用usermod命令来锁定用户密码,使密码无效,该用户名将不能使用。

如: usermod -L 用户名

解锁命令:usermod -U 用户名

赞(2) 打赏
未经允许不得转载:刘鹏博客 » Linux用户认证–Pam_Tally2用户锁定/解锁
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏