赞
踩
前言
Linux在新装的系统中,更改用户的密码时可能会遇到以下报错:
BAD PASSWORD: The password fails the dictionary check - it is based on a dictionary word
这是由于系统会对新密码进行检查,如果系统觉得新密码过于简单或不安全,系统就会报错。如果想继续使用简单的密码,通常可以通过更改/etc/pam.d/sysystem-auth文件配置来实现。
一般我们在常规的安全加固里也有对密码强度的配置,比如pam_pwquality.so模块的行,将原有行注释并修改为如下的新配置,密码长度最少12位,至少包含一个大写字母,一个小写字母,一个数字,一个特殊符号。
password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type= minlen=12 lcredit=-1 ucredit=-1 dcredit=-1 ocredit=-1 enforce_for_root
参数说明
minlen=12 密码最小长度为12个字符。
lcredit=-1 密码应包含的小写字母的至少一个
ucredit=-1 密码应包含的大写字母至少一个
dcredit=-1 将密码包含的数字至少为一个
ocredit=-1 设置其他符号的最小数量,例如@,#、! $%等,至少要有一个
enforce_for_root 确保即使是root用户设置密码,也应强制执行复杂性策略。
try_first_pass模块使用前 1 个模块从用户那里得到的密码
local_users_only只作用于本地用户
pam的简介
讲到安全加固就不得不提到在linux系统中认证体系的PAM。Linux pam源于被甲骨文收购的SUN公司的软件DCE-RFC的开源实现(参见github上linux-pam介绍),起初它是为Solaris操作系统开发的,后来很多操作系统都实现了对它的支持,Red hat 5.0后的发行版在默认基础安装包中都包括了PAM。
PAM(Pluggable Authentication Modules)即可插拔式认证模块,它是一种高效而且灵活便利的用户级别的认证方式,它也是当前Linux服务器普遍使用的认证方式。当然,在不同版本的Linux统中部署PAM认证是有所不同的。它提供了对所有服务进行认证的中央机制,适用于passwd、login、远程登录(telnet,rlogin,fsh,ftp,点对点协议PPP)、su等应用程序中。
PAM的认证机制
当User访问一个Service或者Program,应用程序需要进行认证服务,会根据自身定义认证的PAM配置文件来调用PAM相关模块进行验证,最后将验证结果返回给应用程序,应用程序再产生相应的动作。
如果一个应用程序 (例如 login) 想使用 PAM 提供的机制,那么需要链接到 libpam.so 库,否则就不支持 PAM 机制,可以通过如下命令查看:
默认程序名与相关的 PAM 配置文件是相同的,当然,也允许通过配置文件进行配置,指定不同的配置文件名称。
验证时会按照顺序检查,也就是所谓的流程栈 (Stack) ,是认证时执行步骤、规则的堆叠,体现了自上而下的执行顺序,而且可以被引用。
PAM配置
PAM配置通过配置文件,默认是在/etc/pam.d/目录下,每一个服务都是以服务名命名的配置文件。其中比较常用的是passwd、system-auth、sshd文件,如下所示:
配置文件分为四列,第一列代表模块类型,第二列代表控制标记,第三列代表模块路径,第四列代表模块参数。
模块类型具体功能如下:
1. auth模块认证管理。用来对用户的身份进行识别,如提示用户输入密码、判断用户是否为 root 等。
2. account模块用户管理。是非认证式的对用户赋予/阻止使用一些系统资源。比如说,用户登录的时间限制,密码的期限等。
3. session模块实现用户登录前的,及用户退出后所要进行的操作。比如登录连接信息,用户数据的打开与关闭,挂载文件系统等。
4. password模块密码认证管理。是用来管理用户的密码认证标记(token)的。比如,用户密码的尝试次数等。
控制标记来处理和判断各个模块的返回值,控制分为六种:
1. required 表示这一模块的认证是必须成功的,但如果失败,认证过程不会即刻终止,PAM将继续下一个同类型的模块认证。
2. requisite 和required相似,但是如果这个模块返回失败则立刻向应用程序返回失败,表示此类型失败不再进行同类型后面的操作。
3. sufficient 表示如果一个用户通过这个模块的验证,PAM结构就立刻返回验证成功信息,把控制权交回应用程序。其后相关模块的所有控制都将会比忽略。
4. optional 表示这一模块认证是可选的,也不会对认证成功或失败产生影响。
5. include 引入该项指定文件中的所有配置项。
6. substack 和include类似,不同之处在于,对子堆中的完成和失败的行为的评估不会导致跳过整个模块堆栈的其余部分,而只会跳过子模块。
模块路径即要调用模块的位置。如果是64位系统,一般保存在/lib64/security,如: pam_unix.so同一个模块,可以出现在不同的类型中。它在不同的类型中所执行的操作都不相同。这是由于每个模块,针对不同的模块类型,编制了不同的执行函数。常用模块有:
模块参数即传递给模块的参数。参数可以有多个,之间用空格分隔开如:
passwordrequired pam_unix.so nullok obscure min=4 max=8 md5
PAM后门
了解的linux pam的机制就会发现安全加固的必要性!对于网上随意下载开源操作系统的镜像我们就要慎重了,因为有些系统可能留了绕过登录的后门,通过在pam_unix下的pam_unix_auth.c源码中添加判断条件,使得_unix_verify_password返回值为PAM_SUCCESS,只需在模块路径下替换编译后的pam_unix.do这样就可以在用系统存在的任意用户名与设置的后门密码进行登录,使黑客攻击很容易。
关于PAM后门的排查:
如果添加的是自定义的PAM模块,那么只要查询模块所属的包就可以发现PAM后门:
对于查找通过修改的原PAM模块,可以通过计算MD5值与原来进行diff
总结
回到文章开头的修改密码的The password fails the dictionary check的报错,通过pam的梳理我们可以梳理这个改密过程了,修改密码用到了passwd命令,它使用了pam认证服务,在/etc/pam.d配置文件下找到了/etc/pam.d/passwd会发现引用了/etc/pam.d/system-auth配置,但是新装系统没有密码加固,怎么处理呢?直接将密码强度校验规则去掉就可以了:
#备份文件
cp /etc/pam.d/system-auth /etc/pam.d/system-auth.`date +%Y%m%d.%H%M%S`
vim /etc/pam.d/system-auth
#注释掉以下行
#password requisite pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
#注释掉下行中的参数use_authok
passwordsufficient pam_unix.so sha512 shadow nullok try_first_pass #use_authtok
或者也可以如下处理:
将原来的为requisite或者required的行注释掉,然后添加下面的一行即可
password required pam_pwquality.so
这里要说明下,有的同学会发现有pam_cracklib.so和pam_pwquality.so两种情况,这是因为最早在linux 7之前其实使用得是pam_cracklib.so模块,后来改成pam_pwquality.so这个模块,但此模块完全兼容于pam_cracklib.so,同时linux 7提供了/etc/security/pwquality.conf这个文件可以额外指定默认值,比较容易处理修改。相关参数说明如下:
retry=N:定义登录/修改密码失败时,可以重试得次数
minlen=N:新密码得蕞小长度
dcredit=N:当N>0时表示新密码中数字出现得蕞多次数;当N<0时表示新密码中数字出现蕞少次数;
ucredit=N: 当N>0时表示新密码中大写字母出现得蕞多次数;当N<0时表示新密码中大写字母出现蕞少次数;
lcredit=N: 当N>0时表示新密码中小写字母出现得蕞多次数;当N<0时表示新密码中小写字母出现蕞少次数;
ocredit=N:当N>0时表示新密码中特殊字符出现得蕞多次数;当N<0时表示新密码中特殊字符出现蕞少次数;
maxrepeat=N:拒绝包含多于N个相同连续字符得密码。 默认值为0表示禁用此检查
maxsequence=N:拒绝包含长于N得单调字符序列得密码。默认值为0表示禁用此检查。实例是’12345’或’fedcb’。除非序列只是密码得一小部分,否则大多数此类密码都不会通过简单检查。
enforce_for_root: 如果用户更改密码是root,则模块将在失败检查时返回错误。默认情况下,此选项处于关闭状态,只打印有关失败检查得消息,但root仍可以更改密码。不要求root用户输入旧密码,因此不会执行比较旧密码和新密码得检查
use_authtok:当用户修改时,使用此选项强制用户使用前面堆叠验证模块提供的密码,例如由pam_ pwquality验证模块提供的新密码。当pam_unix验证模块与password验证类型一起使用时有效。(引言中因为密码校验都去掉了,所以这个参数也就需要一起去掉)
sha512:当用户下一次更改密码时,使用SHA256算法进行加密
try_first_pass:在提示用户输入密码之前,模块首先尝试先前的密码,以测试是否满足该模块的需求。
use_first_pass:该模块强制使用先前的密码(不允许用户修改密码),如果密码为空或者密码不对,用户将被拒绝访问
nullok: 默认不允许空密码访问服务
更多PAM参考官方文档《The Linux-PAM System Administrators’ Guide》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。