本文主要是介绍海思3536平台上使用pam.d模块实现密码强度功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 前言
- 一、PAM模块介绍
- 二、工具交叉编译及实现
- 1.工具、模块交叉编译([打包的源码包下载地址](https://download.csdn.net/download/qq91551663/20217178))
- 1. cracklib库
- 2.pam模块
- 3.pwquality 密码策略模块
- 4.shadow命令包
- 2.编译后文件整理
- 三、运行时常见问题及解决
- 四、密码安全功能(举例)
- 1.密码多次错误后锁住登录一定时间,可以防暴力破解
- 2.去掉缺省密码,第一次登录强制修改密码
- 3.不能使用历史已用密码作为新密码
前言
海思sdk带的busybox,密码强度的功能非常简单(busybox-1.20.2、libbb/obscure.c文件),由于客户对密码强度、复杂度,密码修改的限制等有严格的要求,故加入pam.d模块,实现密码控制的需求。
一、PAM模块介绍
PAM(Pluggable Authentication Modules )是由Sun提出的一种认证机制。它通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段。
PAM使用配置/etc/pam.d/下的文件,来管理对程序的认证方式,应用程序调用相应的配置文件,从而调用本地的认证模块,模块放置在/lib/security下,以加载动态库的形式进,像我们使用su命令时,系统会提示你输入root用户的密码.这就是su命令通过调用PAM模块实现的。
详细功能可参考 Linux下PAM模块学习总结
二、工具交叉编译及实现
1.工具、模块交叉编译(打包的源码包下载地址)
我的目录结构
1. cracklib库
Cracklib包 包含一个库,通过将用户选择的密码与所选单词列表中的单词进行比较,该库用于实施强密码。源码路径及安装、内容、命令解释~点这,这也是下载地址,
修改后交叉编译:
tar -zxf cracklib-2.9.7.tar.gz
cd cracklib-2.9.7/
./configure --host=arm-hisiv400-linux --prefix=$(pwd)/../../install CC=arm-hisiv400-linux-gcc AR=arm-hisiv400-linux-ar --disable-static --with-default-dict=/usr/share/cracklib
make ;make install
如果make的时候报man错,可以简单粗暴直接修改Makefile,去掉
SUBDIRS = po man(删掉) libmisc lib src
编译完成后,开始创建CrackLib字典(一些命令及路径需要root权限,我是在板子/home/上生成后再cp回服务器的编译目录),先下载cracklib-words-2.9.7.bz2(上文有下载地址)
1、mkdir -p /home/new_dict/dict/out/
2、cd /home/new_dict
3、install -v -m644 -D cracklib-words-2.9.7.bz2 dict/cracklib-words.bz2
4、cd dict/
5、bunzip2 -v cracklib-words.bz2 (可能有些系统不支持bunzip2命令,这个可以挂载服务器,然后在本地执行解压)
6、ln -v -sf cracklib-words words
7、echo $(hostname) >> cracklib-extra-words
8、install -v -m755 -d /lib/cracklib
9、将交叉编译生成的命令create-cracklib-dict、cracklib-packer、cracklib-format(这个是脚本,有些交叉编译的gzip命令不支持-d参数,需删除不然报错)、cracklib-check拷贝到板子/sbin目录(或者有执行权限的其它目录)
10、执行 create-cracklib-dict --output out/ cracklib-words cracklib-extra-words
11、在out目录生成字典文件pw_dict.hwm、pw_dict.pwd、pw_dict.pwi,拷贝回至服务器编译目录的(你自己rootfs路径)/usr/share/cracklib/下
2.pam模块
源码下载地址,编译也比较简单
tar -zxf Linux-PAM-1.3.1.tar.gz
cd Linux-PAM-1.3.1/
./configure --host=arm-hisiv400-linux --prefix=$(pwd)/../../install
make ;make install
编完之后,install/include 里面添加一个security目录,拷贝一份头文件到此处,后面用到。
3.pwquality 密码策略模块
Linux对应的密码策略模块有:pam_passwdqc 和 pam_pwquality 。其中pam_passwdqc模块对应的是/etc/login.defs,pam_pwquality对应的是/etc/security/pwquality.conf
模块的配置方法有两种:(配置文件解析可参考这里)
a、password required pam_pwquality.so dcredit=-1 ucredit=-1 ocredit=-1 lcredit=0
b、添加到/etc/security/pwquality.conf 中
这里我选择交叉编译生成pam_pwquality.so 来支持,密码复杂度功能,源码。
tar -zxf libpwquality-1.4.4.tar.gz
cd libpwquality-1.4.4/
./configure --host=arm-hisiv400-linux build=arm-hisiv400-linux --prefix=$(pwd)/../../install/ --enable-pam LIBS=-L$(pwd)/../../install/lib CFLAGS=-I$(pwd)/../../install/include/
make;make install
4.shadow命令包
源码及命令详解,主要包含了登录(login、su)、用户和组管理(chage、passwd、useradd、usermod、userdel、groupadd、groupdel)等等命令。
交叉编译的命令会与busybox自带的冲突,例如passwd,可以修改busybox的config文件,屏蔽passwd命令
# CONFIG_PASSWD is not set
# CONFIG_FEATURE_PASSWD_WEAK_CHECK is not set
tar -zxf shadow-4.8.tar.gz
cd shadow-4.8/
./configure --host=arm-hisiv400-linux --prefix=$(pwd)/../../install/ --with-libpam=yes --with-libcrack=yes LIBS=-L$(pwd)/../../install/lib/ LDFLAGS="-lpamc -lpam_misc -lpam" CFLAGS=-I$(pwd)/../../install/include
2.编译后文件整理
编完之后在install目录会生成执行文件、头文件、库、文档、配置文件等,我们需要用到的大概有下面这些,拷贝到编译的rootfs目录下(注意lib目录有软链接,拷贝时需要加-a,保存软链接)。
整个编译目录打包下载在这,包括我们自己修改的modify目录,顶层Makefile文件,可以按不同编译器偷懒地一起编译。
三、运行时常见问题及解决
1.执行passwd时,报 "pam_unix(passwd:chauthtok): authentication failure"
添加SetUID(或者 s 权限),当一个具有执行权限的文件设置SetUID权限后,用户执行这个文件时将以文件所有者的身份执行,chmod 755 /usr/bin/passwdchmod u+s /usr/bin/passwd 2.不符合密码验证机制的话就修改不成功,会有各种报错:
“BAD PASSWORD: it's WAY too short”,这是报密码太短,不符合/etc/login.defs的设置;
“BAD PASSWORD: it is based on your username”,这是密码与帐号不能同名,这是不符合/etc/pam.d/passwd的设置;
“BAD PASSWORD: it is too simplistic/systematic"太简单/连贯的字符
“BAD PASSWORD: it is based on a dictionary word”这是因为出现了字典里的字符串。人名、地名,或者我们常用的单词,那么会被提示 it is based on a dictionary word 也可以使用cracklib-check工具检测是否能用, root@hisi:#echo "Change_Me" | cracklib-checkChange_Me: it is based on a dictionary wordroot@hisi:#echo "wohenshuai123," | cracklib-checkwohenshuai123,: OK
3. 命令运行问题、登录问题可以通过查看日志文件定位出错位置(需要rsyslogd命令支持)
root@hisi:~# cat /var/log/secure
Jul 30 14:28:32 hisi login[1565]: pam_unix(login:session): session opened for user root by root(uid=0)
Jul 30 14:28:32 hisi login[3039]: ROOT LOGIN on '/dev/ttyS000'
Jul 30 14:49:07 hisi sshd[9195]: pam_unix(sshd:account): expired password for user admin (root enforced)
Jul 30 14:49:07 hisi sshd[9195]: pam_unix(sshd:session): session opened for user admin by (uid=0)
Jul 30 14:49:23 hisi passwd[9200]: pam_unix(passwd:chauthtok): password changed for admin
Jul 30 14:49:23 hisi sshd[9195]: pam_unix(sshd:session): session closed for user admin
Jul 30 14:49:25 hisi sshd[9291]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.1.104 user=admin
Jul 30 14:49:34 hisi sshd[9291]: pam_unix(sshd:session): session opened for user admin by (uid=0)4.其它问题后续再补充....
四、密码安全功能(举例)
1.密码多次错误后锁住登录一定时间,可以防暴力破解
ssh远程登录/etc/pam.d/sshd,在第一行后插入一行配置:#%PAM-1.0auth required pam_tally2.so even_deny_root deny=3 unlock_time=60串口/etc/pam.d/login ,在第一行下即#%PAM-1.0的下面添加: auth required pam_tally2.so even_deny_root deny=3 unlock_time=60 root_unlock_time=60当密码输入错误超过3次时,账户锁住,hisi login: rootAccount locked due to 4 failed logins可以用pam_tally2命令查看密码错误次数root@hisi:/#pam_tally2 --user adminLogin Failures Latest failure Fromadmin 5 03/10/21 20:02:07 192.168.1.104root用户下,可以用pam_tally2命令解锁锁住的用户root@hisi:/# pam_tally2 --user admin --resetLogin Failures Latest failure Fromadmin 5 03/10/21 20:02:07 192.168.1.104
2.去掉缺省密码,第一次登录强制修改密码
1). 判断如果是第一次登陆系统,则去掉密码,并强制密码过期usermod -L root;passwd -d root;chage -d 0 root;usermod -U root2). 修改完密码后,可设置用户密码有效期chage -m 0 -M 365 -I 0 -W 7 root
chage命令用法可参考这
usermod命令用法可参考这
3.不能使用历史已用密码作为新密码
修改/etc/pam.d/system-auth-local文件,加入下面一行,remember=5,即最近5次使用过的密码就不能再用作新密码password required pam_pwhistory.so use_authtok remember=5 enforce_for_root
其它需求功能可见这里
这篇关于海思3536平台上使用pam.d模块实现密码强度功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!