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

声明:本博文用于学习总结及工作心得


环境: 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配置文件提高安全等级





你可能感兴趣的:(Linux)