LinuxPAM开发⽰例⼆:登录系统时使⽤⾃⼰的PAM模块进⾏
密码认证
本⽂仅仅是⼀个⽰例,没有多余的说教内容,实现在登录Linux时命令⾏、图形界⾯、su、ssh等密码认证时使⽤⾃⼰的PAM模块进⾏密码认证,这个⽰例不需要编写应⽤程序,因为系统的登录程序就是应⽤程序,例如:login、su、lightdm、ssh服务器。
1。编写PAM模块动态库
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <security/pam_appl.h>
#include <security/pam_modules.h>
#include <security/pam_ext.h>
//认证管理,⽤户证书
PAM_EXTERN int pam_sm_setcred( pam_handle_t *pamh, int flags, int argc, const char **argv )
{
printf("Setcred\n");
return PAM_SUCCESS;
}
//账户管理
PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char **argv)
{
printf("Acct mgmt\n");
return PAM_SUCCESS;
免费下载安装app软件
}
//重写PAM SPI 函数
其ascii码值最小的一个是
PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv)
{
int ret;
const char *user;
char default_pass[] = "abc"; //写死的密码,输⼊这个abc才能验证通过
ret = pam_get_user(pamh, &user, NULL);
printf("System Login PAM-TEST:%s\n", user);
if(ret != PAM_SUCCESS)
{
printf("pam_get_user failed:%d\n", ret);
return ret;
}
java线程池源码
printf("请输⼊密码为⽤户:%s\n", user);
//得到密码
const char *pass = NULL;
char *tip = "输⼊pam密码:";
ret = pam_get_authtok(pamh, PAM_AUTHTOK, &pass, tip);
if(ret != PAM_SUCCESS)
{
printf("pam_get_authtok failed:%d\n", ret);
return ret;
}
if(pass == NULL)
{
printf("pam_get_authtok failed:%d\n", ret);
return PAM_CONV_ERR;
如何重启php}
printf("get password:%s\n", pass);
//以下为简单的密码验证过程,根据实际情况修改为真是的场景即可
//检查密码不相等任务认证失败
if(strcmp(default_pass, pass) != 0)
linux修改口令的命令
{
printf("mypam login failed\n");
return PAM_AUTH_ERR;
}
printf("mypam login success\n");
return PAM_SUCCESS;
}
编译:gcc -fPIC pam_test.c -o pam_test.so -lpam -shared
复制到PAM模块的动态库路径下:sudo cp pam_test.so /lib/x86_64-linux-gnu/security/
这样⾃⼰的密码认证模块编译⽣成完成。
2. 修改PAM模块配置⽂件以让login,su、lightdm密码认证程序使⽤我们⾃定义的模块进⾏认证。
认证程序使⽤的配置⽂件:
login /etc/pam.d/login                命令⾏登录以及认证⽐如执⾏sudo时使⽤该配置⽂件配置的PAM                                                    模块进⾏认证
su /etc/pam.d/su                        执⾏su命令切换⽤户时使⽤这个配置⽂件
lightdm /etc/pam.d/lightdm        图形界⾯登录时使⽤这个配置⽂件进⾏⽤户密码等认证
如果只是改上述其中⼀种认证⽅式的话,那只要修改其对应的配置⽂件即可,如果要让系统的密码认证都执⾏⾃⼰的PAM模块,可以修改common-auth,这个⽂件不仅被上述三个配置⽂件通过include指令包含,其他⽂件也包含该⽂件,⽐如/etc/pam.d/ssh也包含这个配置⽂件,修改这⼀个⽂件就可以,其他密码认证都起作⽤,包含通过ssh远程登录机器。
/etc/pam.d/login对common-auth的包含如下,其他两个⽂件也是如下的包含语句:
# Standard Un*x authentication.
@include common-auth
修改注意:
a。必须放在配置⽂件第⼀⾏,否则不起作⽤,因为认证是从配置⽂件开头⼀⾏⼀⾏执⾏的
b。如果仅仅执⾏⾃⼰的PAM模块认证,那就要把配置⽂件⾥其他的认证配置注释掉,否则后续的认证也会继续执⾏,取决与配置时的控制类型即第⼆个字段required、requisive、等其他,根据情况修改成⾃⼰需要的,修改后不需要重启机器。
在这⾥,为了让系统原有的认证都使⽤⾃⼰的PAM模块进⾏认证,我直接修改common-auth:
添加第16⾏:auth    sufficient      pam_test.so
注释掉第19⾏:如果不注释掉,当⾃⼰的认证验证失败时,还会执⾏这⼀⾏的认证,pam_unix.so是linux的通⽤认证,login,su、ssh都使⽤这个模块认证。再者我们⽬的就是要只⽤⾃⼰的认证,所以直接注释掉,如果⾃⼰的模块认证成功,则系统登录成功,如果认证失败,则执⾏后边的pam_deny.so的认证拒绝模块,系统登录失败,重新输⼊密码进⾏登录。
3.修改配置完成后,实验命令⾏登录效果
因为密码在认证模块中写死的是abc,所以所有⽤户登录都要输⼊abc才能登录成功,其他登录失败。
4.ssh登录认证效果
5.图形登录效果
图中密码框的提⽰信息来⾃⾃定义PAM模块中的tip变量
输⼊原密码ljq认证失败,密码错误,重新输⼊密码abc后认证成功,进⼊系统。
⾄此系统使⽤⾃定义PAM认证模块实现及测试效果完成,其中的密码验证逻辑需要根据实际的密码验证算法修改,并且不同的⽤户名不同的密码,这⾥只是测试直接写死,所有⽤户都使⽤密码abc。
其它说明:3和4图中显⽰的如下信息都来⾃PAM模块⾥的输出,根据情况⾃⼰修改。
System Login PAM-TEST:root 请输⼊密码为⽤户:root
async await面试题
输⼊pam密码:
get password:kkk
mypam login failed

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。