红联Linux门户
Linux帮助

基于Linux安全验证添加自定义PAM模块

发布时间:2017-05-09 09:40:11来源:linux网站作者:_Hebrew
环境: Ubuntu 14.04、PAM 1.2.1,需要root权限,以及C语言知识。
 
首先需要了解什么是PAM:
AM即可插拔认证模块。它提供了对所有服务进行认证的中央机制,适用于login,远程登录(telnet,rlogin,fsh,ftp,点对点协议(PPP)),su等应用程序中。系统管理员通过PAM配置文件来制定不同应用程序的不同认证策略;应用程序开发者通过在服务程序中使用PAM API(pam_xxxx( ))来实现对认证方法的调用;
而PAM服务模块的开发者则利用PAM SPI来编写模块(主要是引出一些函数pam_sm_xxxx( )供PAM接口库调用),将不同的认证机制加入到系统中;PAM接口库(libpam)
则读取配置文件,将应用程序和相应的PAM服务模块联系起来。
 
配置PAM:
关于如何配置,这里就不多讲了,毕竟网上关于这方面的参考太多。
添加自定义PAM模块(修改现有PAM模块的业务逻辑):
 
一.原由:
为什么需要自定义PAM模块,举例来说,我们配置PAM login,已达到阻止root用户或者其它用户登录,或者在登录验证时错误一定错误时锁住当前用户等操作,但是像这种情况,我依然可以进入单用户模式,以达到进入系统修改配置文件,还有PAM的后门; 或许有人会想将grub加密;好,即使你将grub加密后,我还是一样可以通过bios破解掉grub加密;所以这种情况,最好是自定义PAM模块,或者修改现有的PAM模块, 或许我们需要做的不多,一条短信,一条邮件即可; 
 
二.正题:
1.所有PAM的配置依赖于PAM接口库(libpam), 所以我们不能尝试说去修改相关PAM接口库
2.需要查询当前系统使用的PAM版本, 可以查看/etc/pam.d/目录下pam的配置文件
root@ERP-CLIENT:/etc/pam.d# cat accountsservice  
#%PAM-1.2  
# Must use substack here, so the success of pam_unix will still  
# cause our pam_pin to run  
password   substack      common-password  
password   optional      pam_pin.so  
3.查询到PAM版本后,需要下载当前的PAM源码 http://www.linux-pam.org/library/  上传服务器(可以在本地修改pam模块后在上传服务器进行编译安装) 也可以直接在服务器下载
wget http://www.Linux-pam.org/library/Linux-PAM-1.2.1.tar.bz2
4.解压PAM 
mkdir /root/newpam/
tar xvjf /root/newpam/Linux-PAM-1.2.1.tar.bz2
5.进入需要修改的模块的相关目录, 然后修改代码:
举例来说: 
限制用户登录的功能,用户登录验证失败达到一定次数然后限制用户登录。其相关模块是pam_tally2.so ,现在我们需要为该模块新添加一些功能,比如打印一句话,创建一个文件,所以我们需要修改pam_tally2.so的源文件
vim  /root/newpam/Linux-PAM-1.2.1/modules/pam_tally2/pam_tally
在第170行tally_parse_args函数开头添加我们修要新增的功能的代码(该函数是我们后面在/etc/pam.d/login 配置文件的参数验证)
fprintf(stdout, "Hello\n");//输入用户名PAM验证参数时在标准输出打印Hello  
FILE *fd;  
//    char str[1024];  
fd = fopen("/tmp/file.txt", "a");//在tmp目录新建file.txt目录  
if (fd)  
{  
fputs("Hello, create file success!", fd);  
#   /* 写入Hello, software weekly字符串 */  
fclose(fd);  
}
添加后,保存退出。
6.编译
mkdir /root/newpam/config //该目录用来编译PAM的因为我们只需要提前我们需要的模块  
cd /root/newpam/Linux-PAM-1.2.1  
./configure --host=arm-linux-gnueabi --prefix=/root/newpam/config  
make install
编译完成后 找到我们自定义的pam_tally2.so,
输入命令:find /root/newpam/Linux_PAM-1.2.1 -name pam_tally2.so
/root/newpam/Linux-PAM-1.2.1/modules/pam_tally2/.libs/pam_tally2.so
7.配置PAM: 
修改/etc/pam.d/login 
在文件开头位置添加代码: 
auth          required       /root/newpam/Linux-PAM-1.2.1/modules/pam_tally2/.libs/pam_tally2.so deny=3  unlock_time=3 even_deny_root root_unlock_time=3
添加后保存退出。
8.在本地终端测试
注意的是,PAM模块不要单独编译,一定要整个PAM源码编译在提取,不然的话会出错,如果出现错误的话,导致登录不上终端,可以使用ssh登录,关于SSH登录的限制,可以配置PAM,也可以修改ssh配置文件提高安全等级。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/30629.html