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