系统是否有后门?Linux安全加固之PAM知多少

962dcc4028f34ed21eeb2b376eaf8025.png

前言

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系统中认证体系的PAMLinux pam源于被甲骨文收购的SUN公司的软件DCE-RFC的开源实现(参见githublinux-pam介绍),起初它是为Solaris操作系统开发的,后来很多操作系统都实现了对它的支持,Red hat 5.0后的发行版在默认基础安装包中都包括了PAM

PAM(Pluggable Authentication Modules)即可插拔式认证模块,它是一种高效而且灵活便利的用户级别的认证方式,它也是当前Linux服务器普遍使用的认证方式。当然,在不同版本的Linux统中部署PAM认证是有所不同的。它提供了对所有服务进行认证的中央机制,适用于passwdlogin、远程登录(telnet,rlogin,fsh,ftp,点对点协议PPP)、su等应用程序中。

PAM的认证机制

User访问一个Service或者Program,应用程序需要进行认证服务,会根据自身定义认证的PAM配置文件来调用PAM相关模块进行验证,最后将验证结果返回给应用程序,应用程序再产生相应的动作。

dc69c703ddab906790916445e97011db.png

如果一个应用程序 (例如 login) 想使用 PAM 提供的机制,那么需要链接到 libpam.so 库,否则就不支持 PAM 机制,可以通过如下命令查看:

a7e2e63ab92975379cb4c878e0505801.png

默认程序名与相关的 PAM 配置文件是相同的,当然,也允许通过配置文件进行配置,指定不同的配置文件名称。

验证时会按照顺序检查,也就是所谓的流程栈 (Stack) ,是认证时执行步骤、规则的堆叠,体现了自上而下的执行顺序,而且可以被引用。

PAM配置

PAM配置通过配置文件,默认是在/etc/pam.d/目录下,每一个服务都是以服务名命名的配置文件。其中比较常用的是passwdsystem-authsshd文件,如下所示:

58e5877e8db718e5bca99837067fb951.png

配置文件分为四列,第一列代表模块类型,第二列代表控制标记,第三列代表模块路径,第四列代表模块参数。

模块类型具体功能如下:

  1. 1.        auth模块认证管理。用来对用户的身份进行识别,如提示用户输入密码、判断用户是否为 root 等。

  2. 2.        account模块用户管理。是非认证式的对用户赋予/阻止使用一些系统资源。比如说,用户登录的时间限制,密码的期限等。

  3. 3.        session模块实现用户登录前的,及用户退出后所要进行的操作。比如登录连接信息,用户数据的打开与关闭,挂载文件系统等。

  4. 4.        password模块密码认证管理。是用来管理用户的密码认证标记(token)的。比如,用户密码的尝试次数等。

控制标记来处理和判断各个模块的返回值,控制分为六种:

  1. 1.        required 表示这一模块的认证是必须成功的,但如果失败,认证过程不会即刻终止,PAM将继续下一个同类型的模块认证。

  2. 2.        requisite required相似,但是如果这个模块返回失败则立刻向应用程序返回失败,表示此类型失败不再进行同类型后面的操作。

  3. 3.        sufficient 表示如果一个用户通过这个模块的验证,PAM结构就立刻返回验证成功信息,把控制权交回应用程序。其后相关模块的所有控制都将会比忽略。

  4. 4.        optional 表示这一模块认证是可选的,也不会对认证成功或失败产生影响。

  5. 5.        include 引入该项指定文件中的所有配置项。

  6. 6.        substack include类似,不同之处在于,对子堆中的完成和失败的行为的评估不会导致跳过整个模块堆栈的其余部分,而只会跳过子模块。

模块路径即要调用模块的位置。如果是64位系统,一般保存在/lib64/security,: pam_unix.so同一个模块,可以出现在不同的类型中。它在不同的类型中所执行的操作都不相同。这是由于每个模块,针对不同的模块类型,编制了不同的执行函数。常用模块有:

22f28a9685b2021ac09ee2de45376616.png

模块参数即传递给模块的参数。参数可以有多个,之间用空格分隔开如:

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后门:

926c69aea47772883920f6308033cf16.png

对于查找通过修改的原PAM模块,可以通过计算MD5值与原来进行diff

2908c02f2065ae9718b3805b58814f21.png

d539dcba0e3caaeb6dc18498f12975b3.png

总结

回到文章开头的修改密码的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

a3e330f18ed649665f9cab78765460d7.png

或者也可以如下处理:

将原来的为requisite或者required的行注释掉,然后添加下面的一行即可

password required pam_pwquality.so

这里要说明下,有的同学会发现有pam_cracklib.sopam_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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值