一、Linux用户登录系统验证步骤
(1)首先在命令行输入用户名密码
(2)系统去找/etc/passwd这个文件,根据用户名去找到用户的uid、gid、家目录和shell
(3)系统去找/etc/shadow文件,该文件记录用户uid和密码的关系,根据用户名得到相应的
密码。
(4)当系统得到的密码和用户输入的密码一致时,系统将会给用户一个shell,进入shell控
制阶段。但并不意味着登陆成功,用的用户对应的shell为/bin/nologin,此用户被禁止
登陆,但是可以进行其他工作。系统在/etc/nologin.txt中记录用户不能登录的原因。
(5)进行PAM验证,必须通过PAM验证,最终才能登陆成功。
二、关于PAM的详细阐述。
(1)PAM验证原理
当一个服务器请求PAM模块的时候,PAM本身是不提供服务验证的,PAM 会调用一群模块来
进行服务器的验证,模块存放在/lib/security中,具体的哪个服务调用哪一个模块由PAM
的服务文件定义的,服务文件存放在/etc/pam.d目录下。
(2)PAM的配置服务文件
以前的PAM版本使用的PAM配置服务文件是/etc/pam.conf文件,但是现在这个已经过时。
现在的服务文件存放在/etc/pam.d/目录之下,目录中每个文件的名称和他们所控制访问
的服务名称是相同的。
例如,login程序定义的服务名为login,并生成/etc/pam.d/login的配置服务文件。
(3)配置服务文件的格式
<module interface> <control flag> <module name> <module arguments>
(a)模块接口<module interface>
Auth(认证管理):对用户的身份进行识别(如:识别是否为root用户;)
Account(账号管理):对账号的属性进行检查.(是否允许登录,是否达到最大用户数)
Session(绘画管理): 这个模块用来定义用户登录前的,及用户退出后所要进行的操作.
(如:登录连接信息,用户数据的打开与关闭,挂载文件系统等)
Password(密码管理): 使用用户信息来更新.(如:修改用户密码.)
(b)控制标志旗 <control flag>
主要的作用是利用它来处理和判断各个模块的返回值。
Required:表示需要模块返回一个成功值,如失败则继续进行同类型的下一个操作,当所有
此类型的模块都执行完之后,才返回失败值。
Requisite:与required相似,但是如果这个模块返回失败,则立刻向应用程序返回失败,表
示此类型失败再进行同类型后面的操作。
Sufficient:如果此模块返回成功,则直接向应用程序返回成功,表示此类型成功.不再进行
同类型后面的操作.如果失败,也不会影响这个类型的返回值.
Optional:使用这个标记的模块,将不进行成功与否的返回.一般返回一个PAM_IGNORE
(c)模块名 <module name>
常用的PAM模块:
pam_access.so 控制访问者的地址与帐号的名称
pam_listfile.so 控制访问者的帐号名称或登陆位置
pam_limits.so 控制为用户分配的资源
pam_rootok.so 对管理员(uid=0)无条件通过
pam_userdb.so 设定独立用户帐号数据库认证
pam_deny.so 用来拒绝用户访问,只返回一个值
Pam_env.so用来配置任意的环境变量
(d)模块参数<module arguments>
作用是给模块进行参数的传递,参数可以用空格隔开
password required pam_unix.so nullok obscure min=4 max=8 md5
(e)模块的路径
表示服务配置文件要调用的模块的存放位置,一般保存在/lib/security下
三、举例说明PAM的验证流程。
密码验证流程如下:
1、执行/usr/bin/passwd并输入密码
2、系统在服务文件目录下找到passwd配置文件调用PAM模块,读取/etc/pam.d/passwd配置文件并加
载相应.so文件,对输入的密码进行验证。
3、将验证结果传回passwd程序
4、passwd这个程序会根据PAM回传的结果来决定下一个操作。
任何一个支持PAM的服务程序在进行认证时必须以pam_start( )开始进行初始化,最后以pam_end( )
结束以便进行清理工作
四、总结。
/etc/pam.d/*:服务配置文件存在目录
/lib/security/*:真正的模块存在目录。
本文出自 “Chan_Yeol” 博客,谢绝转载!