原标题:Linux身份鉴别机制实现分析(5)

2.4.2文件二 pam_access.c

PAM中具有多种服务模块,服务模块就是具体的身份验证方式,传统的UNIX验证方式也是以pam_unix.so的形式挂载在pam的服务模块中。

2.4.2.1 文件描述

pam_access模块提供基于登录用户名、客户IP或者主机名、网络号以及登录终端号的访问控制。所属类型是account,即帐号管理类型,该模块的配置文件是/etc/security/access.conf,可以使用accessfile参数指定自定义的配置文件【1】。该模块可带参数:accessfile=/path/to/file.conf,需写入具体配置文件的路径,配置文件中是每行是由三个字段组成的:

权限:用户:来源

权限字段可以是”+”(即允许访问),”-”(禁止访问),用户字段可以是用户名、组名以及诸如格式的用户名,ALL表示任何人,具有多个值时,可以用空格分开。来源字段可以是tty名称(本地登录时)、主机名、域名(以”.”开始),主机IP地址,网络号(以”.”结束)。ALL表示任何主机,LOCAL表示本地登录。

2.4.2.2主要变量及宏定义

pam_access.c中主要的变量及宏定义如下:

c2a7c885b7340c4bcd3bf5dde7dc50fc.png

2.4.2.3结构体定义

该文件定义了一个login_info的结构体来描述用户信息:

96415ed3845255426b7dc8a9b790a931.png

该结构体中字段含义解释如下表:

26f1af17f8858e7702efcad0b0e629bd.png

通过定义一个pam_module 的结构体,将此模块挂接在整个模块链表中供_pam_dispatch来遍历并运用这个服务模块,其定义如下所示:

0235d7a81e0e6cd8d91f6e181d608065.png

2.4.2.4外部函数

服务模块用PAM的SPI来编写具体的验证方式,以下是在pam_access.c文件中这些SPI的原型。

1. pam_sm_setcred()

函数原型:

8bdca802b114c462034c8a261c3bdffd.png

函数功能:设置认证信息接口。

函数参数:pamh为PAM过程信息结构体,flags为标志位,argc表示传递的参数个数,argvc表示传递的参数的字符串数组。

返回值:PAM_IGNORE。

2. pam_sm_acct_mgmt()

函数原型:

f545353d4f60432f6930bc4edb1d1cb3.png

函数功能:设置用户认证信息接口。

函数参数:pamh为PAM过程信息结构体,flags为标志位,argc表示传递的参数个数,argvc表示传递的参数的字符串数组。

返回值:pam_sm_authenticate()的验证结果。

3. pam_sm_open_session()

函数原型:

d70c36a2dea6ee7a3a9840d74e84ccd6.png

函数功能:设置打开会话函数接口。

函数参数:pamh为PAM过程信息结构体,flags为标志位,argc表示传递的参数个数,argvc表示传递的参数的字符串数组。

返回值:pam_sm_authenticate()的验证结果。

4. pam_sm_close_session()

函数原型:

0839161b5315a66523c647725e5a1050.png

函数功能:设置关闭会话函数接口。

函数参数:pamh为PAM过程信息结构体,flags为标志位,argc表示传递的参数个数,argvc表示传递的参数的字符串数组。

返回值:pam_sm_authenticate()的验证结果。

5. pam_sm_chauthtok()

函数原型:

e1cc354d7060feeda9495118801e7615.png

函数功能:设置更改密码函数接口。

函数参数:pamh为PAM过程信息结构体,flags为标志位,argc表示传递的参数个数,argvc表示传递的参数的字符串数组。

返回值:pam_sm_authenticate()的验证结果。

该模块主要是通过pam_sm_authenticate这个接口函数来实现的,其函数原型为:

22cb281ae0a9eb1ff69e431aa6fc5792.png

函数流程图如下所示:

b9e902418829dc77deea21a553cfc0f5.png

1.首先通过pam_get_user获得用户名等信息,失败则记入日志并退出;

2. 如果获取失败或者用户名为空,则向系统记录出错;

3. 如果成功则将得到的用户信息存入user_pw中;

4. 开辟存储空间,并将用户信息存入loginfo这个结构体中;

5. 通过parse_args解析配置文件或传输路径的参数,查看是否具有远程远程登录,有则将loginfo.from_remote_host记录为1,没有则视为本地登录,并用pam_get_item来获得本地登录的终端名。

6. 所有信息获得之后,将进入login_access这个函数来对用户进行权限验证,如果通过权限则返回PAM_SUCCESS,失败则返回PAM_PERM_DENIED。

责任编辑:

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐