本文不对PAM模块机制做深入讲解,网上一堆文章已经把这个事儿做了,这里仅仅是PAM的实现示例以记录自己的学习过程和成果。
本文仅仅实现一个PAM示例,即一个用户程序通过PAM机制进行密码认证,编写一个用户程序,编写一个pam模块动态库即可完成这个功能。
一。PAM介绍
Linux-PAM(即linux可插入认证模块)是一套共享库,使本地系统管理员可以随意选择程序的认证方式。换句话说,不用(重新编写)重新编译一个包含PAM功能的应用程序,就可以改变它使用的认证机制,这种方式下,就算升级本地认证机制,也不用修改程序。
PAM使用配置/etc/pam.d/下的文件,来管理对程序的认证方式.应用程序 调用相应的配置文件,从而调用本地的认证模块.模块放置在/lib/security下,以加载动态库的形式加载到内存,系统程序sudo,su,login等都是通过调用PAM模块实现的口令验证。
二。PAM组成
PAM是一种系统安全认证机制:
1.PAM API,即PAM库提供的API函数,用户程序使用这些api完成口令认证。
2.PAM SPI,即PAM的接口函数,这些函数由用户在PAM 模块动态库中实现,完成认证,账户管理,密码管理,会话管理等功能,被PAM API通过dlopen方式调用。
3.应用程序,即使用PAM模块进行口令认证的用户程序,例如:su,login,sudo等,应用程序调用PAM API完成口令等相关认证功能。
4.配置文件,/etc/pam.conf这个文件一般不使用了,因为使用的是/etc/pam.d/*的配置文件,每个文件表示一个用户程序的pam认证配置文件,决定使用哪个模块动态库进行认证,用户程序调用PAM API时,PAM API会查找/etc/pam.d/目录下的配置文件以加pam模块载动态库。
如su程序使用的pam配置文件/etc/pam.d/su的配置如下:
#
# The PAM configuration file for the Shadow `su' service
#
# This allows root to su without passwords (normal operation)
auth sufficient pam_rootok.so
简单解释:su 切换root用户时执行pam_rootok.so的验证,效果是从su切换到普通用户时不用输入密码,但是从普通用户su到root时则需要密码,这就是pam_rootok.so的作用。
该目录下配置文件名称要与自己编写的PAM模块的服务名称一致,即要与用户程序里pam_start函数的第一个参数一致。
5. PAM模块动态库
/lib/x86_64-linux-gnu/security/
自己编写的PAM动态库也放到这个目录下。
三。编写示例
1.ubuntu16.04安装pam库
sudo apt install libpam0g-dev
2.编写pam模块动态库