『网安产品开发实践』Linux编程-pam用户认证机制编写规则实验

402 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

实验要求

在教师讲解的基础上,阅读教师给出的参考文献编写一个程序,要求为:

  1. 使用Linux下的用户名及其密码实现对该程序的认证;(提示:只需完成应用程序的编写与认证策略的设定)
  2. 用户登录数不超过2个,用户正常登录后,可允许用户修改密码
  3. 该用户认证完成后,重新设置改用户的密码,密码的复杂度为至少4个数字,2个特殊符号

在这里插入图片描述

实验环境

Ubuntu20.04

安装pam

Ubuntu安装pam比较特殊

sudo apt install libpcm0g-dev

ubuntu中怎样下载安装pam-devel?

新建测试用户

新建一个用户用来测试

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

在这里插入图片描述

  1. auth规则用以登录
  2. account用以验证账户是否存在,以上完成实验1
  3. password用以提示修改密码,修改密码要求数字4个其他字符2个,在后面指定,完成实验2
  4. 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详解(二)PAM开发

编译

指定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完成

欢迎在评论区留言