我对Linux PAM模块的疑问

前言

最近在研究Linux操作系统,使用的是《鸟哥的Linux私房菜(第三版)》

这本书深入浅出地对Linux系统进行了解释,风趣幽默,干货满满。

但是最近在看14.5章讲PAM模块的时候总觉得哪里不对,在网络上搜索了一些博客文章,大多数也有错误。

最终,找到了linux的相关文档,决定补充说明一下书中没讲明白的部分。

PAM的配置

我没看明白的地方,就是关于PAM配置语法的控制标志部分。

PAM配置文件(位于/etc/pam.d/目录下)中的内容主要由4个部分组成,分别是:

  • 验证类型 (type)
  • 验证的控制标志 (control flag)
  • 使用的模块
  • 模块的参数

罪魁祸首:控制标志

罪魁祸首就是这个控制标志。

根据《鸟哥Linux》这本书里的说法,验证控制标志的解释是:

它就是“验证通过的标准”,这个字段在管控验证的放行方式,主要有四种:

  • required
    此验证成功则带有success(成功)的标志,若失败则带有failure的标志,但不论成功或失败都会继续后续的验证流程。由于后续的验证流程可以继续进行……
  • requisite
    若验证失败立即回报原程序failure的标志,并终止后续验证流程。若验证成功则带有success的标志并继续后续的验证流程 ……
  • sufficient
    若验证成功则立刻回传success给源程序。并终止后续的验证流程;若验证失败则带有failure标志并继续后续验证流程。
  • optional
    这个模块目的大多是在显示信息而已,并不是用在验证方面的。

这里就有个疑问了,既然required标志不论是否成功都会继续验证流程,那么当required标志的步骤失败后,后面紧接着一个sufficient标志的步骤又成功时,岂不是直接又验证为成功了?那之前的required标志是不是就不起任何作用了呢?

实验

接下来就让我们来验证一下

书中还举了个例子,在我们登录系统时,使用的PAM中的auth验证的配置文件:

#第一步,设置环境变量
auth  required  pam_env.so #设置环境变量的模块

#第二步,验证密码,如果通过就直接返回success给登录层序
auth  sufficient  pam_unix.so nullok try_first_pass #验证密码模块

#第三步,如果密码不对,则继续判断uid是否大于500,如果小于500则直接返回失败
auth  requisite  pam_succeed_if.so uid >= 500 quiet #判断uid模块

#第四步,直接拒绝
auth  required  pam_deny.so #直接返回failure的模块

如果我们修改这个配置文件,将第四步放到第二步之前,那么就变成了:

auth  required  pam_env.so #设置环境变量的模块

auth  required  pam_deny.so #直接返回failure的模块

auth  sufficient  pam_unix.so nullok try_first_pass #验证密码模块

auth  requisite  pam_succeed_if.so uid >= 500 quiet #判断uid模块

按照书中的说法,只要密码正确,第三步会success,直接会返回密码验证成功。所以我们仍然能够登录成功。

但是……如果你真的这么修改,你会发现,尽管你输入了正确的密码,系统也不让你登录!

破案

在网上找了好久,最后终于在man page里找到了答案。你只需要输入man pam.d就能看到了哦。

man中对sufficient的解释是:

sufficient
if such a module succeeds and no prior required module has failed the PAM framework returns success to the application or to the superior PAM stack immediately without calling any further modules in the stack. A failure of a sufficient module is ignored and processing of the PAM module stack continues unaffected.

翻译过来就是:

如果一个模块成功并且之前的required模块没有失败过,PAM框架会直接返回成功给应用程序,不会继续检查后续的模块。sufficient模块的失败结果会在后续的检查中忽略。required模块会影响后面sufficient模块的验证结果。

那么这么看来,之前实验的结果就讲得通了。

如果你感兴趣,可以自行查看这个man page,里面详细描述了其他几个控制标志的执行流程。

写在最后

如果你也对《鸟哥Linux》这本书里的这一章节有所疑问,希望这篇文章能够对你有所帮助!

你可能感兴趣的:(我对Linux PAM模块的疑问)