PAM(一)

news/2024/10/21 22:54:09/

学着写PAM 模块之前了解下PAM的大致情况是不错的选择(也是必须的),所以这里也只好引用一下关于PAM简介的内容了

 原文地址:http://blog.csdn.net/yyyyangyang/article/details/6589086

一、什么是PAM

PAM(Pluggable Authentication Modules)可插拔认证模块,最初是有Sun公司提出的一种认证机制.该机制简化了认证的定制,通过提供

一些动态链接库和一套统一的API,将系统服务和认证方式分离,使得系统管理员可以方便的配置不同服务程序的认证方式,也便于我们向系统中添加新的

认证方式.

二、PAM的结构

可以把PAM分成四部分:1-PAM API     2-PAM 库    3-PAM SPI   4-配置文件

1 PAM-API是PAM提供的一系列接口,在你的应用程序中可以通过调用这些接口实现你的应用程序利用PAM进行身份认证、账户管理等

2 PAM库是PAM API的实现(当然还有一些其他的操作比如实现PAM API与SPI的映射,就是在用户进行了不同的PAM配置后实现PAM 接口与PAMModule实现的“回调函数”的映射, 如pam_authenticate() 映射至PAM Module中的pam_sm_authenticate()..,这是我的不科学理解啊希望别误导了读者)

3 PAM SPI是PAM体系规定的PAM模块需要实现的一组接口,模块实现了这些接口PAM库就可以将PAM API映射过来(在正确配置的前提下)

4 配置文件 通过配置文件来设置各个服务的认证机制,配置文件在 /etc/pam.d/目录下

有了上面的只是我们可以画出PAM的整体结构了

-------------------        -----------------       -------------------

Application              App                         App                    . . .

-------------------       ------------------       ------------------

         \                             |                               /

   \                     |                       /

          \              |             /

---------------------------------------

              PAM API

-------------------------------------

                       |

                       |

                      \|/

------------------------------------                                           

                 PAM 库                              --------------------------->      |  configuration file  |

-----------------------------------

                    /|\

               /     |    \

        /            |          \

/                    |                   \

------------            --------------      ------------                      ---------------

pam_md1.so  pam_md2.so pam_md3.so . . . .  pam_mdn.so

------------           --------------       -------------                     ---------------

上面为PAM的整体结构,四个层次是比较明显的

application层是集成了PAM认证的应用程序,比如 login su sudo gdm ...这些程序都位于这个层次,这些程序都使用PAM机制进行认证,可以查看/etc/pam.d/目录下的配置文件,支持PAM的application都有一个以这个应用名字命名的配置文件。这些应用通过PAM API实现自身与PAM 的集成,下面就转贴一下PAM API

 

int pam_start(const char *service_name, const char *user, const struct pam_conv *pam_conversation, pam_handle_t **pamh)

使用这个函数来初始化PAM库,service_name 服务名(应该是用来确定使用哪个配置文件的吧, 如service_name为"login",将使用/etc/pam.d/login 这个配置文件--这是我的理解如果不对请纠正)

user  鉴权用户(需要验证身份和权限的用户)

pam_conversation  指向pam_conv结构的一个指针,这个结构很重要的内容如下

struct pam_conv{

        int (*conv)(int num_msg, const struct pam_message **msg,

             struct pam_response **resp, void *appdata_ptr);

      void *appdate_ptr;

}

conv--为一个函数指针,指向一个对话函数,对话函数可以实现应用程序与PAM Module(自己定制的认证模块)之间的信息交互,具体是怎样实现对话的将在后面说明.

appdata_ptr 指向特殊的应用程序数据,这个不常用(具体作用我也不知道,写这些的时候我是摸着石头过河的,因此会有很多的不确定和错误的地方,但我想供参考应该是有意义的),对了,这个值呢我们可以看到很多时候直接赋值给了conv函数的最后一个参数..

pam_conv中还有两个结构分别是

struct pam_message{

        int msg_style;

        const char *msg;

}

struct pam_response{

        char *resp;

        int resp_retcode;

}

现在说下conv的参数

num_msg  这个整数说明struct pam_message *msg[]这个指针数组含有几个元素,就好像 main函数的第一个参数argc 和argv的关系

msg这个参数呢是PAM Module提供的,msg中的每一个指针指向的内容都是PAM Module对应用程序的一条请求,请看下面关于pam_message的解释

说下pam_message吧,这个结构呢是 PAM Module发给应用程序的,里面有一些PAM Module对应用程序的一些 提问? 回答?..等等信息

其中msg_style可以指定这些信息的类型?性质?..  msg_style可以使这样的值:

PAM_PROMPT_ECHO_OFF  这个标志呢表明PAM Module想获得一些东西,比如密码、比如用户的一些其它信息,至于想获得什么信息可以在msg指向的缓冲区中设置提示信息,比如 msg[] = "Password:",那么PAM Module告诉应用程序我想让用户提供登录账户对应的密码, 比如 msg[] = "One-Time-Password:",那么PAM Module告诉应用程序我想让用户提供一个一次性密码. . .,因为是密码所以我们希望其内容不要以明文显示在屏幕上(这个就是在tty上通过login登录时,输入密码不显示这种状况),PAM_PROMPT_ECHO_OFF这个标志呢可以做到这一点,即通知应用程序给用户显示一些提示信息(msg的内容),通知应用程序为PAM Module搜集用户的信息(等待用户输入内容,应用程序搜集到内容后会想方设法--你马上将知道是什么方法--的将内容反馈给PAM Module)

PAM_PROMPT_ECHO_ON 这个标志的作用呢和PAM_PROMPT_ECHO_OFF基本一样,区别在于:用户的输入将回显在屏幕上

PAM_PROMPT_ECHO_ON PAM_PROMPT_OFF这两个标志在我们定制的PAM Module中会用到的,我们需要使用这两个标志获得一些用户的输入信息

 

PAM_ERROR_MSG 这个标志呢通知应用程序 "你需要向用户显示一条错误提示信息",其中错误提示信息的内容为msg指向的内容

PAM_TEXT_INFO   这个标志呢通知应用程序  "你需要向用户显示一条信息(错误?警示?向导提示?随便了)",内容也是存放在msg指向的缓冲区中

 

resp是一个pam_response结构指针的数组,是对msg对应请求的一个回答吧

大概说下pam_response

PAM Module通过conv对话函数向应用程序发出需要用户提供一些信息(上面的密码之类的)后,在对话函数返回时会将用户提供的信息通过这个结构返回,怎么样大概意思知道了吧...resp_retcode这东西据说一般可以不用考虑的

 

至此呢conv这个对话函数就说完了,可能有些乱?没关系,接着走下去就会明朗了.(在这里需要说明一点,conv这个函数是有应用程序提供的,也就是说login gdm su sudo其实都是实现了这个函数的,PAM Module中会通过一些方法得到login/su/sudo/gdm..实现的这个函数的地址,从而可以在PAM Module中调用这个函数...)

 

现在要说下pam_start的最后一个参数(刚才解释的东西太多了)...

pam_handle_t *pamh,这个参数是一个 pam_handle_t类型的指针,pam_handle_t这个东西呢还是蛮复杂的,我不想转贴了,有兴趣的自己看吧,但是这个呢其实是一个上下文,是pam_start()函数的出参,以后所有的PAM API SPI都要使用这个参数的,里面其实就是一些配置信息...

 

 

 

和pam_start()对应的是pam_end(pam_handle_t *pamh)函数,这个函数主要是释放资源,在你完成认证之类的操作后可以调用这个函数实现资源的释放.

今天先说到这里了...


http://www.ppmy.cn/news/345135.html

相关文章

McPAT

McPAT: An Integrated Power, Area, and Timing Modeling Framework for Multicore and Manycore Architectures 论文的参与单位:美国圣母大学,惠普实验室,国立首尔大学,圣迭戈加利福尼亚大学 摘要: McPAT&#xff1a…

使用 Terraform 在 GCP 上一键部署 EMQX MQTT Broker

引言 MQTT 是一种轻量级的消息传递协议,适用于物联网应用实现设备间通信。 作为一款主流的开源 MQTT Broker,EMQX 能够提供高扩展性、可靠性和安全性的 MQTT 消息传递服务。 借助广泛应用的基础设施即代码(IaC)工具 Terraform&a…

PA

About the manual 数据包加速器(PA)是网络协处理器(NETCP)外设的主要组件之一。该PA与安全加速器(SA)和千兆位以太网交换机子系统一起形成网络处理解决方案。NETCP中PA的目的是执行数据包处理操作&#xff…

Linux中pam模块详解

pam简介 Linux-PAM(linux可插入认证模块)是一套共享库,使本地系统管理员可以随意选择程序的认证方式。换句话说,不用重新编译一个包含PAM功能的应用程序,就可以改变它使用的认证机制。这种方式下,就算升级本地认证机制,也不用修改程序. PAM使…

PAM(3)

写到这一篇才发现自己了解的远没有预期的多.. 上一次说了对话函数,对话函数是PAM模块与使用PAM进行认证的应用程序进行信息交互的桥梁,通过对话函数PAM模块可以获得用户的输入信息(明文、密文), 还有两套很重要的函数 pam_set_data(pam_handle_t *pamh, const char …

podman简介

podman简介掌握docker,跟上云时代的步伐 Podman是一个开源项目,可在大多数Linux平台上使用并开源在GitHub上。Podman是一个无守护进程的容器引擎,用于在Linux系统上开发,管理和运行Open Container Initiative(OCI)容器…

Impala

应用场景 在使用Hive的过程中,编写了HQL语句,发现HQL执行过程是非常慢的,因为hive采用的是把HQL转化成hadoop的MapReduce任务,然后编译,打包成jar包,分发到各个server上去执行,这个过程会很慢很慢!而impala也可以执行SQL,但是比Hive快很多,而Impala根本不用Hadoop的M…

pam

Pluggable Authentication Modules:可插入验证模块 比如一台服务器开着FTP、SSH等服务,那么新建一个用户默认就享有对以上的服务的操作权限,那么如果一个用户的帐号密码泄露会涉及到多个服务。 PAM最大的特点是实现了服务程序和认证机制的分…