腾讯云cvm-linux登录不上: PAM模块问题(原理篇)

PAM简介

PAM 的全称为“可插拔认证模块(Pluggable Authentication Modules),是一套应用程序编程接口,它提供了一系列的验证机制,只要使用者将验证阶段的需求告知PAM后,PAM就能返回使用者验证的结果。

PAM设计的初衷是将不同的底层认证机制集中到一个高层次的API中,从而省去开发人员自己去设计和实现各种繁杂的认证机制的麻烦。如果没有 PAM ,认证功能只能写在各个应用程序中,一旦要修改某个认证方法,开发人员可能不得不重写程序,然后重新编译程序并安装。

PAM认证原理

Service(服务)—->PAM配置文件—–>pam_*.so
首先查看服务,查看服务上是否定义的有pam验证的信息,根据这些验证信息,去读取pam配置文件,之后,pam配置文件里面定义各种规则(我们管理员需要定义的),生效,调用pam_*.so模块

PAM配置文件详解

/etc/pam.d/*:应用程序对应的pam"服务"配置文件,或者一些通用的配置文件。 通常服务名和使用该pam的程序名一致,也可以不同(程序可以通过调用pam_start函数时指定服务名);

/lib64/security/*.so:PAM 模块文件的实际放置目录;

/etc/security/*:其他 PAM 环境的配置文件;

/usr/share/doc/pam-*/:详细的 PAM 说明文档

PAM 的各个模块一般存放在 /lib/security/ 或 /lib64/security/ 中,以动态库文件的形式存在,文件名格式一般为 pam_*.so,如下图所示:

/etc/pam.d/ 类型的配置文件通常以每一个使用 PAM 的程序的名称来命令。比如 /etc/pam.d/su,/etc/pam.d/login 等等。还有些配置文件比较通用,经常被别的配置文件引用,也放在这个文件夹下,比如 /etc/pam.d/system-auth

/etc/pam.d/下的配置文件格式如下:

工作类别 控制模式 模块路径 模块参数

PAM的工作类别:

PAM 的具体工作主要有以下四种类别(type):auth,account,password 以及 session

auth:对用户的身份认证进行识别 。

提示用户输入密码,或判断用户是否为root等。假如你的验证方式有很多,比如一次性密码、指纹、虹膜等等,都应该添加在 auth 下。

account:对帐号的各项属性进行检查,能不能使用某服务,但不负责身份认证。

比如,account 这个 type 可以检查用户能不能在一天的某个时间段登录系统、这个用户有没有过期、以及当前的登录用户数是否已经饱和等等。

password:主要负责修改密码/认证token相关的工作。

修改密码的时候有时会提示“密码不够长”、“密码是个常用单词”之类的,就是在这里设置的。在这里还设置了保存密码时使用了哪种加密方式(比如现在常用的 SHA-512)。这里的密码不局限于 /etc/shadow 中的密码,有关认证 token 的管理都应该在此设置

session:用来定义用户登录前及用户退出后所要进行的操作。

登录连接信息,用户数据的打开与关闭,挂载文件系统等.

PAM的控制模式

用于定义各个认证模块在给出各种结果时 PAM 的行为,也就是PAM验证通过的标准,或者调用在别的配置文件中定义的认证流程栈。该列有两种形式,一种是比较常见的“关键字”模式,另一种则是用方括号([])包含的“返回值=行为”模式

(1)“关键字”模式

required:一票否决,表示即使某个模块对用户的验证失败,也要等所有的模块都执行完毕后,PAM 才返回错误信息。这样做是为了不让用户知道被哪个模块拒绝。如果对用户验证成功,所有的模块都会返回成功信息。

requisite:一票否决,与required相似,但是如果这个模块返回失败,则立刻向应用程序返回失败,表示此类型失败.不再进行同类型后面的操作.

sufficient:一票通过,表示如果一个用户通过这个模块的验证,PAM结构就立刻返回验证成功信息(即使前面有模块fail了,也会把 fail结果忽略掉),把控制权交回应用程序。后面的层叠模块即使使用requisite或者required 控制标志,也不再执行。如果验证失败,sufficient 的作用和 optional 相同

optional:表明本模块是可选的,它的成功与否不会对身份认证起关键作用,其返回值一般被忽略。

include:调用其他的配置文件中定义的配置信息,相当于函数调用,把其他的文件调用于此。

substack:运行其他配置文件中的流程,并将整个运行结果作为该行的结果进行输出。该模式和 include 的不同点在于认证结果的作用域:如果某个流程栈 include 了一个带 requisite 的栈,这个 requisite 失败将直接导致认证失败,同时退出栈;而某个流程栈 substack 了同样的栈时,requisite 的失败只会导致这个子栈返回失败信号,母栈并不会在此退出。

(2)“返回值=行为”模式

[value1=action1 value2=action2 ...]

valueN 的值是各个认证模块执行之后的返回值。有 success、user_unknown、new_authtok_reqd、default 等等数十种。其中,default 代表其他所有没有明确说明的返回值。返回值结果清单可以在/usr/include/security/_pam_types.h 中找到

actionN 的值有以下几种:

ignore:在一个栈中有多个认证条目的情况下,如果标记 ignore 的返回值被命中,那么这条返回值不会对最终的认证结果产生影响。

bad:标记 bad 的返回值被命中时,最终的认证结果注定会失败。此外,如果这条 bad 的返回值是整个栈的第一个失败项,那么整个栈的返回值一定是这个返回值,后面的认证无论结果怎样都改变不了现状了。

die:标记 die 的返回值被命中时,马上退出栈并宣告失败。整个返回值为这个 die 的返回值。

ok:在一个栈的运行过程中,如果 ok 前面没有返回值,或者前面的返回值为 PAM_SUCCESS,那么这个标记了 ok 的返回值将覆盖前面的返回值。但如果前面执行过的验证中有最终将导致失败的返回值,那 ok 标记的值将不会起作用。

done:在前面没有 bad 值被命中的情况下,done 值被命中之后将马上被返回,并退出整个栈。

N(一个自然数):功效和 ok 类似,并且会跳过接下来的 N 个验证步骤。如果 N = 0 则和 ok 完全相同。

reset:清空之前生效的返回值,并且从下面的验证起重新开始。

PAM的模块路径

模块路径就是要调用模块的位置. 如果是64位系统,一般保存在/lib64/security,如: pam_unix.so

 – 相对路径: /lib64/security目录下的模块可使用相对路径 如:pam_shells.so、pam_limits.so 

 – 绝对路径:模块通过读取配置文件完成用户对系统资源的使用控制 /etc/security/*.conf 

PAM的模块参数

模块参数是传递给模块的参数.参数可以有多个,之间用空格分隔开,如:

password   required   pam_unix.so nullok obscure min=4 max=8 md5

常见的PAM模块

PAM模块

结合管理类型

说明

pam_unix.so

auth

提示用户输入密码,并与/etc/shadow文件相比对.匹配返回0

account

检查用户的账号信息(包括是否过期等).帐号可用时,返回0.

password

修改用户的密码. 将用户输入的密码,作为用户的新密码更新shadow文件

pam_shells.so

auth

如果用户想登录系统,那么它的shell必须是在/etc/shells文件中之一的shell

account

pam_deny.so

account

该模块可用于拒绝访问

auth

password

session

pam_permit.so

auth

模块任何时候都返回成功.

account

password

session

pam_securetty.so

auth

如果用户要以root登录时,则登录的tty必须在/etc/securetty之中.

pam_listfile.so

auth

访问应用程的控制开关

account

password

session

pam_cracklib.so

password

这个模块可以插入到一个程序的密码栈中,用于检查密码的强度.

pam_limits.so

session

定义使用系统资源的上限,root用户也会受此限制,可以通过/etc/security/limits.conf或/etc/security/limits.d/*.conf来设定

参考资料:

Linux的pam模块:https://www.cnblogs.com/kevingrace/p/8671964.html

常见pam模块:https://blog.csdn.net/kingdom_xu/article/details/108475555

pam之基础知识和常见模块:http://www.mamicode.com/info-detail-884967.html

腾讯云cvm-linux登录不上: PAM模块问题(案例篇):https://cloud.tencent.com/developer/article/1729568

man手册第8章内容:可通过man 8 pam或man 8 pam_limits查询资料

本站文章资源均来源自网络,除非特别声明,否则均不代表站方观点,并仅供查阅,不作为任何参考依据!
如有侵权请及时跟我们联系,本站将及时删除!
如遇版权问题,请查看 本站版权声明
THE END
分享
二维码
海报
腾讯云cvm-linux登录不上: PAM模块问题(原理篇)
PAM 的全称为“可插拔认证模块(Pluggable Authentication Modules),是一套应用程序编程接口,它提供了一系列的验证机制,只要使用...
<<上一篇
下一篇>>