PAM可插拔认证模块,助力Linux用户管理
需求场景
1) 用户登录失败后的重试次数,达到次数后锁定账户,隔一段时间后自动解锁
2) 用户登录失败有重试次数,达到次数后锁定账户,手工解锁
3) 限制某个ip网段访问
4) 密码不能和最近3次重复
5) 密码要定期更高
6) 强密码策略,至少多少长度,首字母字符类型,必须含有什么字符,不能连续多少字符,新密码中不能保护用户名等等。
7) 禁用root用户
8) 用户创建,修改,删除
9) 用户的密码修改
10) 限制用户访问的时间段
12) 限制用户对系统资源的使用率(最大登录数)
13) su切换到其它用户,都要输入密码
pam方案
PAM (Pluggable Authentication Modules)可插拔认证模块,一套适用于Linux的身份验证共享库系统,它为系统中的应用程序或服务提供动态身份验证模块支持。在Linux中,PAM是可动态配置的,本地系统管理员可以自由选择应用程序如何对用户进行身份验证。
设计的初衷是将不同的底层认证机制集中到一个高层次的API中,从而省去开发人员自己去设计和实现各种繁杂的认证机制的麻烦。 PAM机制最初由Sun公司提出,并在其Solaris系统上实现,后来各个版本的UNIX以及Linux也陆续增加了对它的支持。
为什么要使用PAM?如果没有 PAM认证功能只能写在各个应用程序中,一旦要修改某个认证方法,开发人员可能不得不重写程序,然后重新编译程序并安装;有了 PAM 认证的工作都交给 PAM ,程序主体便可以不再关注认证问题了“ PAM 允许你进来,那你就进来吧。”
如何使用PAM?当LINUX服务器中的某个应用程序或服务需要使用 PAM 来进行验证时,只要此应用程序或服务支持 PAM 验证功能,就可以通过修改其相应的 PAM 配置文件(所有验证功能都是通过一些库文件来提供的)来配置相应的验证方式,当重新启用些服务或应用程序时 PAM 模块就会通过其专用 API 来读取它的配置文件,根据配置文件中的内容来提供相应的验证功能。
/etc/pam.conf类型的格式如下:
服务名称 工作类别 控制模式 模块路径 模块参数
/etc/pam.d/中语法格式:
工作类别 控制模式 模块路径 模块参数
Type Control-flag Module-path Module-arguments
#%PAM-1.0
auth required pam_sepermit.so
session required pam_selinux.so open env_params
其中每行代表一个独立的验证方式每个配置文件可以由多种验证规则相互叠加而成。
PAM有4种认证类型(type)
√ auth - 认证模块接口,如验证用户身份、检查密码是否可以通过,并设置用户凭据
√ account - 账户模块接口,检查指定账户是否满足当前验证条件,如用户是否有权访问所请求的服务,检查账户是否到期
√ password - 密码模块接口,用于更改用户密码,以及强制使用强密码配置
√ session - 会话模块接口,用于管理和配置用户会话。会话在用户成功认证之后启动生效
控制标志位(Control-flag )
控制在验证过程中动作和返回结果的方式。定义各个认证模块在给出各种结果时PAM的行为,或者调用在别的配置文件中定义的认证流程栈;。
它有两种类型的表达方式:关键字模式 与 “用方括号 [] 包含的“返回值=行为”模式
required:验证失败时仍继续进行其它的验证,返回一个错误信息,导致用户不会知道是哪个规则项验证失败
requisite:只要某个规则项验证失败则立即结束整个验证并返回一个错误信息。可以防止一些通过暴力猜解密码的攻击,但是返回信息给用户则也有可能将系统的用户结构信息透露给攻击者。
sufficient:只要有一个规则项验证成功,将不再验证其它的账户规则。
常用模块说明
$ ls /usr/lib64/security/可以查到所有模块
1) pam_access|登陆访问限制模块
对访问进入管理,提供基于登录名、主机名或域名、公网 IP 地址或网络号,以及非网络登录时的 tty 名称的访问控制。
一般与account 验证(Type)类型一同使用,根据 /etc/security/access.conf 配置文件中的内容,来进行相应的验证工作的。
2) pam_cracklib|密码策略验证模块
与password一起使用,通过插入password堆栈为特殊的应用提供可插入式密码强度性检测,是PAM配置接口的基本模块。它的工作方式是先提示用户输入密码,然后使用一个系统字典和一套规则来检测输入的密码是否不能满足强壮性要求。
模块参数:
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’,默认情况下即使没有这个参数配置,一般大多数这样的密码都不会通过,除非序列只是密码的一小部分
maxclassrepeat=N 禁止超过N个相同类别连续字符的密码。默认值为0表示此检查已禁用。
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 maxrepeat=6 maxsequence=6
3) pam_limit|资源服务限制模块
与session一起使用,用来限制用户在会话过程中对系统资源的使用,即使 UID=0 的用户也受它的限制;
默认独立的配置文件: /etc/security/limits.conf
sudo:session required pam_limits.so
conf=/etc/custom_limits.conf
# <domain> <type> <item> <value>
- <domain> : 用户名、采用@group 语法的组名,通配符 * 来表示任何用户,以及使用 “%” 通配符来只限制 maxlogins ,并可以采用 %group 的语法格式。
- <type> :
- soft : 允许用户所使用的系统资源在设定的硬限制值的规定范围来上下浮动
- hard : 由超级用户设置,由系统内核来执行。
- "-" : 表示无限制系统资源;
- <item> <value> : 两者总是成对使用的
maxlogins # 用户可以登录到系统的最多次数, UID=0 的用户除外
nofile # 最大可以打开的文件数量
4) pam_unix|认证类型验证模块
与auth一起使用时,参数选项有debug、audit、use_first_pass、try_first_pass、nullok和nodelay ,主要是验证用户密码的有效性,默认情况下对密码为空的用户禁止提供服务。
与password一起使用时,参数选项有debug、audit、nullok、not_set_pass、use_authtok、try_first_pass、use_first_pass、md5、bigcrypt、shadow、nis、remember,主要让用户更改密码的任务。
部分参数介绍如下
remember=N 不能和最近N次的密码重复
sha512 当用户下一次更改密码时,使用SHA256算法进行加密
try_first_pass 修改密码前先输入当前密码,验证通过后再修改密码
shadow 用户保护密码
nullok 默认不允许空密码访问服务
6) pam_rootok|验证模块
允许/etc/pam.d/su中的用户不需要任何验证就可以登录系统。与pam_wheel验证模块一同使用,以保证root权限只允许在pam_wheel的限制中进行。
其它
1) 登录重试3次失败后10分钟自动解锁
pam_tally/pam_tally2模块参数:
onerr=[succeed|fail]
file=/path/to/log 失败登录日志文件,默认为/var/log/tallylog
audit 如果登录的用户没有找到,则将用户名信息记录到系统日志中
silent 不打印相关的信息
no_log_info 不通过syslog记录日志信息
AUTH选项
deny=n 登录失败超过n次后拒绝访问
lock_time=n 登录失败后锁定的时间(秒)
unlock_time=n 登录失败超限后自动解锁的时间
magic_root root用户(uid=0)调用该模块时,计数器不会递增(待确认是否锁定账号)
even_deny_root root用户失败登录次数超过deny=n次后拒绝访问
root_unlock_time=n 与even_deny_root相应选项,root用户在登录失败次数超限后锁定的时间
/etc/pam.d/system-auth-ac文件或者添加配置参数如下
auth required pam_tally2.so deny=3 unlock_time=600 onerr=succeed even_deny_root root_unlock_time=1200 file=/var/log/tallylog
2) 禁止root用户登录
在/etc/pam.d/password-auth-ac或者/etc/pam.d/sshd配置文件中添加以下配置(该配置禁止SSH的口令认证,但仍然可以使用SSH密钥登录)
auth required pam_securetty.so
3) 账号锁定如何手工解锁?
前提:有用户还在登录主机,否则只能自动解锁或者密钥方式登录后解锁
查看用户登录失败次数:
# pam_tally2 -u username
解锁指定用户(登录错误次数清零):
# pam_tally2 -u username -r --reset
pam_tally或pam_tally2都行。
faillog -a 查看登录失败次数
faillog -u -r 清除指定用户的登录错误次数