PAM从入门到精通(十七)

news2024/11/19 13:20:18

接前一篇文章:PAM从入门到精通(十六)

本文参考:

《The Linux-PAM Application Developers' Guide》

PAM 的应用开发和内部实现源码分析

先再来重温一下PAM系统架构:

更加形象的形式:

六、整体流程示例

2. 更为完整的例程及解析

上一回讲解了更为详细复杂例程的第一部分,本文继续讲解其余部分。再来贴一下完整代码:

/* 使用PAM所必需的两个头文件*/
#include <security/pam_appl.h>
#include <security/pam_misc.h>

static struct pam_conv conv = {
    misc_conv,
    NULL
}

void main(int argc, char *argv[], char **renvp)
{
    pam_handle_t *pamh = NULL;
    int status;

    /* 初始化,并提供一个回调函数 */
    if ((pam_start("login", user_name, &conv, &pamh)) != PAM_SUCCESS)
        exit(1);

    /* 设置一些关于认证用户信息的参数 */
    pam_set_item(pamh, PAM_TTY, ttyn);
    pam_set_item(pamh, PAM_RHOST, remote_host);
    while (!authenticated && retry < MAX_RETRIES)
    {
        status = pam_authenticate(pamh, 0);/* 认证,检查用户输入的密码是否正确 */
    }
    /* 认证失败则应用程序退出*/
    if (status != PAM_SUCCESS)
    {
      	……
        exit(1);
    }

    /*  通过了密码认证之后再调用帐号管理API,检查用户帐号是否已经过期 */
    if ((status = pam_acct_mgmt(pamh, 0)) != PAM_SUCCESS)
    {
        if (status == PAM_AUTHTOK_EXPIRED)
        {
            status = pam_chauthtok(pamh, 0);  /* 过期则要求用户更改密码 */
            if (status != PAM_SUCCESS)
                exit(1);
        }
    }
    /* 通过帐户管理检查之后则打开会话 */
    if (status = pam_open_session(pamh, 0) != PAM_SUCCESS)
        exit(status);
	……
    /* 建立认证服务的用户证书*/
    status = pam_setcred(pamh, PAM_ESTABLISH_CRED);
    if (status != PAM_SUCCESS)
       exit(status);
   	……
    pam_end(pamh, PAM_SUCCESS);  /* PAM事务的结束 */
    ……
 }

(2)pam_set_item函数

代码片段:

    /* 设置一些关于认证用户信息的参数 */
    pam_set_item(pamh, PAM_TTY, ttyn);
    pam_set_item(pamh, PAM_RHOST, remote_host);

作用:

设置PAM项。pam_set_item函数允许应用程序和PAM服务模块访问和更新item_type的PAM信息。为此,将创建项参数指向的对象的副本。

参数详解:

  • pam_handle_t *pamh

pamh参数是通过先前调用pam_start()获得的身份验证句柄。

此处传给pamh的实参为main函数中定义的pam_handle_t *pamh的地址&pamh。

  • int item_type

支持以下item_types:

  •         PAM_SERVICE

服务名称(标识PAM函数将用于验证程序的PAM堆栈)。

  •         PAM_USER

将使用其提供身份服务的实体的用户名。也就是说,在身份验证之后,PAM_USER标识可以使用该服务的本地实体。

注意,PAM堆栈中的任何模块都可以将该值从某个事物(例如,“匿名”)映射到其它事物(例如“guest119”)。

  •         PAM_USER_PROMPT

提示输入用户名时使用的字符串。此字符串的默认值是“login:”的本地化版本。

  •         PAM_TTY

终端名称:如果是设备文件,则前缀为/dev/;对于图形化的、基于X的应用程序,该项的值应该是$DISPLAY变量。

  •         PAM_RUSER

请求用户名:本地请求用户的本地名称或远程请求用户的远程用户名。

通常,应用程序或模块会尝试提供经过最强身份验证的值(在远程帐户之前是本地帐户)。该值的信任级别体现在与应用程序相关联的实际身份验证堆栈中,因此最终由系统管理员决定。

PAM_RUSER@PAM_RHOST应始终识别请求用户。在某些情况下,PAM_RUSER可能为NULL。在此种情况下,不清楚提出请求的实体是谁。

  •         PAM_RHOST

请求主机名(PAM_RUSER实体请求服务的机器的主机名)。这就是PAM_RUSER@PAM_RHOST确实标识了请求用户。在某些应用程序中,PAM_RHOST可能为NULL。在这种情况下,不清楚身份验证请求的来源。

  •         PAM_AUTHOK

身份验证令牌(通常是密码)。除了pam_sm_authenticate()和pam_sm_chauthtok()之外,所有模块函数都应该忽略此令牌。在前一个函数中,它用于将最新的身份验证令牌从一个堆叠的模块传递到另一个模块。在后一个函数中,令牌用于另一个目的。它包含当前活动的身份验证令牌。

  •         PAM_OLDAUTHOK

旧的身份验证令牌。除pam_sm_chauthtok()外,所有模块函数都应忽略此令牌。

  •         PAM_CONV

pam_conv结构。参见pam_conv。

以下附加项目是特定于Linux PAM的,不应在可移植应用程序中使用:

  •         PAM_FAIL_DELAY

用于重定向集中管理的故障延迟的函数指针。参见pam_fail_delay。

  •         PAM_XDISPLAY

X display的名称。对于图形化的、基于X的应用程序,该项的值应该是$DISPLAY变量。该值可以独立于PAM_TTY用于传递display的名称。

  •         PAM_XAUTHDATA

指向一个结构的指针,该结构包含连接到PAM_XDISPLAY指定的显示器所需的X身份验证数据(如果需要此类信息)。参见pam_xauth_data。

  •         PAM_AUTHOK_TYPE

默认操作是模块在请求密码时使用以下提示:“New UNIX password:”和“Retype UNIX password:”。示例单词UNIX可以替换为此项,默认情况下为空。此项目由pam_get_authtok使用。

此处传给item_type的实参分别为PAM_TTY和PAM_RHOST,分别表示请求终端名称和请求主机名。

  • const void *item

对于除PAM_CONV和PAM_FAIL_DELAY之外的所有item_type,item都是指向以<NULL>为结束符的字符串的指针。在PAM_CONV的情况下,item指向初始化的PAM_CONV结构。在PAM_FAIL_DELAY的情况下,item是函数指针:void(*DELAY_fn)(int retval,unsigned usec_DELAY,void*appdata_ptr)。

PAM_AUTHTOK和PAM_OLDAUTHTOK都将在返回应用程序之前重新设定种子。这意味着应用程序无法访问身份验证令牌。

此处传给item的实参分别为ttyn和remote_host,分别表示请求终端名称和请求主机名。

更多讲解请看下回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1117079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SpringBoot底层原理】SpringBoot底层原理实践(一)——手撕SpringBoot容器(幼儿园版)

Spring底层原理实践&#xff08;一&#xff09;——手撕Spring容器&#xff08;幼儿园版&#xff09; 0. 前言1. 依赖2. 注解3. Bean定义类4. 容器接口5. 配置类6. 测试Bean7. 启动类8. 容器实现类8.1 容器初始化8.2 获取Bean8.3 创建Bean 9. 测试 0. 前言 SpringBoot项目创建…

Character Animator 2024(Ch2024):打造生动角色,让动画设计更上一层楼

Character Animator 2024是一款专为角色动画设计师打造的软件&#xff0c;它可以帮助设计师快速创建出丰富多彩的角色动画。无论是初学者还是专业设计师&#xff0c;都可以通过Character Animator 2024轻松实现自己的创意。 Ch2024独特优势&#xff1a; 实时角色动画&#xf…

进程【Linux系统编程】

一、先谈硬件——冯诺依曼体系结构 存储器&#xff1a;内存&#xff08;硬盘是外存&#xff09; 输入设备&#xff1a;鼠标、键盘、摄像头、话筒、磁盘、网卡…… 输出设备&#xff1a;显示器、播放器硬件、磁盘、网卡…… 输入输出设备是外部设备&#xff0c;简称外设。 中央…

做一个最新版的淘宝客返利程序源码有多难?

我们都知道淘宝客返利程序成为了很多人的创业和赚钱的工具。这种程序允许通过推广淘宝商品来获得佣金。然而&#xff0c;你知道构建这样一个淘宝客返利程序有多难吗&#xff1f;今天我们就从最基本的API说起&#xff0c;现在我将介绍构建一个最新版淘宝客返利程序所需的关键API…

学习学不进去的时候怎么办?

01 人生很难只有欢声笑语,学习道路也一样。 有时候,我们会面临进退两难的情形: 明明知道应该学,却仿佛被定格在原地,一步也迈不出去。 这种状态为通常被称为“学不进去”&#xff0c;这时该怎么办? 其实, “学不进去”的原因可谓千头万绪,但归根结底,大抵可归为两类: 外在环境…

Python--练习:使用while循环求1..100的和

案例&#xff1a;使用while循环求1..100的和 思考&#xff1a; 先套用原有基础模式&#xff0c;之后再思考其他的。 while循环的基本语法&#xff1a; 对于循环次数已知的情况&#xff0c;建议使用while循环 因为是知道次数的&#xff0c;所以可以用一个计数器。程序里面&am…

【前端】图片裁剪路径绘制及图片不规则裁剪

说明 项目中可能需要用户根据展示的图片&#xff0c;然后绘制需要裁剪的路径&#xff0c;再根据绘制的坐标进行裁剪&#xff0c;以下是前端的裁剪路径绘制的代码示例&#xff0c;后端可以根据当前的获取到的坐标进行裁剪&#xff0c;裁剪的坐标保存在coordinate数组中。 代码 …

Hadoop3教程(二十八):(生产调优篇)NN、DN的多目录配置及磁盘间数据均衡

文章目录 &#xff08;148&#xff09;NN多目录配置&#xff08;149&#xff09;DataNode多目录配置及磁盘间数据平衡磁盘间数据均衡 参考文献 &#xff08;148&#xff09;NN多目录配置 NN多目录的意思是&#xff0c;本地目录可以配置成多个&#xff0c;且每个目录存放内容相…

用 Python 这样去创建词云不是更美嘛?

什么是词云&#xff1f;在网络上我们经常可以看到一张图片&#xff0c;上面有一大堆大小不一的文字&#xff0c;这便是词云。词云一般是根据输入的大量词语生成的&#xff0c;如果某个词语出现的次数越多&#xff0c;那么相应的大小就会越大。 Python 中有一个专门用来生成词云…

Spring的 @ControllerAdvice 之 ResponseBodyAdvice对响应结果进行增强

Spring的 ControllerAdvice 之 ResponseBodyAdvice对响应结果进行增强 1. 使用背景2. 使用方法3. 结果 1. 使用背景 对响应结果进行统一结果处理时&#xff0c;有时会出现有的接口未进行封装&#xff0c;为了解决该问题&#xff0c;可使用ControllerAdvice 注解对响应结果进行…

三辊闸机的应用领域和特点

三辊闸机是一种常用于门禁控制的设备&#xff0c;它具有以下应用和优点&#xff1a; 应用&#xff1a; 门禁控制&#xff1a;三辊闸机可以用于各种场合的门禁控制&#xff0c;如小区、写字楼、学校、医院等。考勤管理&#xff1a;三辊闸机可以与考勤系统集成&#xff0c;用于…

机器学习-K-近邻(KNN)算法

目录 一 . K-近邻算法&#xff08;KNN&#xff09;概述 二、KNN算法实现 三、 MATLAB实现 四、 实战 一 . K-近邻算法&#xff08;KNN&#xff09;概述 K-近邻算法&#xff08;KNN&#xff09;是一种基本的分类算法&#xff0c;它通过计算数据点之间的距离来进行分类。在…

算法通关村第二关-青铜终于学会链表了

大家好我是苏麟 , 今天来学反转链表 . 反转链表 描述 : 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 LeetCode 206.反转链表 : 206. 反转链表 牛客 BM1 反转链表 : 分析 : 本题有两种方法&#xff0c;带头结点和不带头结点&am…

【C语言精髓之指针】结构体指针(->与.两个运算符的区别)

/*** file * author jUicE_g2R(qq:3406291309)————彬(bin-必应)* 通信与信息专业大二在读 * copyright 2023.10* COPYRIGHT 原创技术笔记&#xff1a;转载需获得博主本人同意&#xff0c;且需标明转载源* language C/C* IDE Base on Mic…

下载安装Microsoft ODBC Driver for SQL Server和配置SQL Server ODBC数据源

1. 下载SQL Server ODBC驱动&#xff1a; Microsoft ODBC Driver for SQL Server - ODBC Driver for SQL Server | Microsoft Learn 2. 安装SQL Server ODBC驱动&#xff1a; 运行安装程序&#xff0c;出现如下图所示页面&#xff1b; 选择下一步&#xff1b;选择我同意许可协…

git学习——第2节 时光机穿梭

我们已经成功地添加并提交了一个readme.txt文件&#xff0c;现在&#xff0c;是时候继续工作了&#xff0c;于是&#xff0c;我们继续修改readme.txt文件&#xff0c;改成如下内容&#xff1a; Git is a distributed version control system. Git is free software. 现在&…

uni——底部弹框显示,底部导航隐藏

案例 在uni-app中&#xff0c;如果你在tabbar页面显示一个底部弹框&#xff0c;底部导航默认是会依旧显示的。如果你想在弹框显示时隐藏底部导航&#xff0c;你可以使用uni.hideTabBar和uni.showTabBar方法来控制底部导航的显示和隐藏。 export default {methods: {openPopup(…

汽车空调工作总结

工作总结 2022年3月加入公司&#xff0c;公司在河南&#xff0c;从事车载空调等相关项目&#xff0c;我的岗位是嵌入式软件工程师&#xff0c;在工作中也遇到了很多机遇和挑战&#xff0c;也学到了非常多的东西&#xff0c;在这里给大家分享下总结经验。 关于工作、公司 毕业…

线上答题活动小程序结合线下大屏复盘总结

线上答题活动小程序结合线下大屏复盘总结 ~ 说来话长&#xff0c;这个活动也接近尾声了&#xff0c;从刚开始着手开发&#xff0c;到现在已过去半年&#xff0c;好不夸张的&#xff0c;当时从4月份开始接触&#xff0c;现在已经十月份了 该小程序我发下主界面截图&#xff0…

ant提供对所有系统属性的访问

ant提供对所有系统属性的访问&#xff0c;就好像这些系统属性已经用 <property>任务定义过一样。 例如&#xff0c;下面的build文件中通过${os.name}获取操作系统名称&#xff0c;通过${java.home}获取Java的安装路径&#xff1a; <project name"demo_project&…