本文已参与「新人创作礼」活动,一起开启掘金创作之路。
实验要求
在教师讲解的基础上,阅读教师给出的参考文献编写一个程序,要求为:
- 使用Linux下的用户名及其密码实现对该程序的认证;(提示:只需完成应用程序的编写与认证策略的设定)
- 用户登录数不超过2个,用户正常登录后,可允许用户修改密码
- 该用户认证完成后,重新设置改用户的密码,密码的复杂度为至少4个数字,2个特殊符号
实验环境
Ubuntu20.04
安装pam
Ubuntu安装pam比较特殊
sudo apt install libpcm0g-dev
新建测试用户
新建一个用户用来测试
sudo useradd hahahaha
sudo passwd hahahaha
修改密码为1234
编写pam规则
新建规则
默认的pam规则存储在/etc/pam.d,新建一个规则文件,命名为check_user,写入规则:
auth required /usr/lib/x86_64-linux-gnu/security/pam_unix.so
account required /usr/lib/x86_64-linux-gnu/security/pam_unix.so
password required /usr/lib/x86_64-linux-gnu/security/pam_unix.so
password requisite /usr/lib/x86_64-linux-gnu/security/pam_cracklib.so dcredit=4 ocredit=2
session required /usr/lib/x86_64-linux-gnu/security/pam_limits.so
- auth规则用以登录
- account用以验证账户是否存在,以上完成实验1
- password用以提示修改密码,修改密码要求数字4个其他字符2个,在后面指定,完成实验2
- session用以开启会话,以便接下来配置登录次数,完成实验3
其中那几个so文件的路径在/usr/lib/x86_64-linux-gnu/security,与其他系统不同,具体配置的学习参考下面的引用
Linux下pam密码复杂度限制 限制linux用户登陆数量limits.conf配置说明 linux 密码设置及登陆控制/设置密码复杂度
实验2额外配置:安装pam_cracklib.so
检查密码强度需要它,但是pam_cracklib.so是不会默认安装的!因此要手动安装
sudo apt install libpam-cracklib
用在 Interl x86 上 libpam-cracklib_1.1.8-3.6ubuntu2.18.04.3_i386.deb 的下载页面
pam_cracklin用以检查密码
实验3额外配置:修改limits.conf
指定某账户登录次数需要修改/etc/security/limits.conf
添加配置
<username> <type> <item> <options>,这里我们是用hahahaha用户来完成实验
xxx hard maxlogins 2
编写C程序
编写C完成pam认证
代码
// check_user.c
#include <security/pam_appl.h>
#include <security/pam_misc.h>
#include <security/pam_modules.h>
#include <stdio.h>
static struct pam_conv conv = {
misc_conv,
NULL
};
int main(int argc, char *argv[]){
pam_handle_t *pamh = NULL;
int retval;
const char *user = "nobody";
const char *s1 = NULL;
if(argc == 2) {
user = argv[1];
}else{
fprintf(stderr, "Usage: check_user [username]\n");
exit(1);
}
// 指定规则文件名
retval = pam_start("check_user", user, &conv, &pamh);
// session
if((retval=pam_open_session(pamh, 0))==PAM_SUCCESS){
// auth
if (retval == PAM_SUCCESS){
retval = pam_authenticate(pamh, 0);
}else{
printf("pam_authenticate(): %d, ",retval);
s1 = pam_strerror(pamh, retval);
printf("%s\n", s1);
}
// account
if (retval == PAM_SUCCESS){
retval = pam_acct_mgmt(pamh, 0);
}else{
printf("pam_acct_mgmt(): %d, ",retval);
s1 = pam_strerror(pamh, retval);
printf("%s\n", s1);
}
// password
if (retval == PAM_SUCCESS) {
fprintf(stdout, "Authenticated\n");
if((retval=pam_chauthtok(pamh, 0))==PAM_SUCCESS){
fprintf(stdout, "Update user token successfully!\n");
}else{
fprintf(stdout, "Update failed!\n");
}
} else {
fprintf(stdout, "Not Authenticated\n");
}
// close pam
if (pam_end(pamh,retval) != PAM_SUCCESS) { /* close Linux-PAM */
pamh = NULL;
fprintf(stderr, "check_user: failed to release authenticator\n");
exit(1);
}
pam_close_session(pamh, 0);
}
return ( retval == PAM_SUCCESS ? 0:1 ); /* indicate success */
}
编译
指定pam完成编译
gcc -o check_user ./check_user.c -lpam -lpam_misc -ldl
演示
实验1、2
验证测试用户hahahaha,运行./check_user hahahaha,登陆后修改密码为123456,提示密码不符合规范
修改为
1234,.则可以通过
实验1、2完成
实验3
然后在Ubuntu把ssh打开,没有的先去装一下sudo apt install ssh
sudo /etc/init.d/ssh start
在windows物理机用cmd登录两次hahahaha账号
ssh hahahaha@192.168.x.x
虚拟机运行
who可以看到现在的登录情况:hahahaha用户已经达到最大上限
再次运行
./check_user hahahaha,无法登录了
实验3完成
完
欢迎在评论区留言