您的位置:首页 > 其它

PAM(一)

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

原文地址:/article/10663283.html

一、什么是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)函数,这个函数主要是释放资源,在你完成认证之类的操作后可以调用这个函数实现资源的释放.

今天先说到这里了...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: