专栏首页腾讯云服务器专家服务腾讯云cvm-linux登录不上: PAM模块问题(原理篇)
原创

腾讯云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查询资料

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

登录 后参与评论
0 条评论

相关文章

  • 腾讯云cvm-linux登录不上: PAM模块问题(案例篇)

    CVM云服务器通过VNC输入正确的密码后无法正常登录,报错Module is unknown

    赵智勇
  • 给你的SSH加一道防火墙,如何用Kryptonite进行SSH操作

    Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实...

    所有的酒都不如你
  • 如何在CentOS上使用双重身份验证

    在本教程中,您将学习如何在CentOS 7上使用一次性密码进行SSH上的双重身份验证。

    朝朝
  • 腾讯云Linux服务器搭建一个WordPress博客

    看到网络上很多人买了腾讯云服务器后却不知道怎么搭建WordPress博客,看了一下腾讯云出的WordPress教程,我觉得对新手来说难度还是太大了,所以就根据自...

    用户5907306
  • 腾讯云Linux服务器搭建WordPress博客(图文教程)

    看到网络上很多人买了腾讯云服务器后却不知道怎么搭建WordPress博客,看了一下腾讯云出的WordPress教程,我觉得对新手来说难度还是太大了,所以就根据自...

    主机精选@主机点评
  • 【原创】腾讯云服务器搭建wordpress个人博客网站(史上最详细教程)

    看到网络上很多人买了腾讯云服务器后却不知道怎么搭建WordPress博客,看了一下腾讯云出的WordPress教程,我觉得对新手来说难度还是太大了,所以就根据自...

    主机精选@主机点评
  • 腾讯云Linux服务器搭建WordPress博客

    看到网络上很多人买了腾讯云服务器后却不知道怎么搭建WordPress博客,看了一下腾讯云出的WordPress教程,我觉得对新手来说难度还是太大了,所以就根据自...

    JunyouYH
  • 新手如何用腾讯云Linux服务器搭建一个WordPress博客?

    看到网络上很多人买了腾讯云服务器后却不知道怎么搭建WordPress博客,看了一下腾讯云出的WordPress教程,我觉得对新手来说难度还是太大了,所以就根据自...

    主机优惠教程
  • 腾讯云Linux服务器搭建一个WordPress博客

    看到网络上很多人买了腾讯云服务器后却不知道怎么搭建WordPress博客,看了一下腾讯云出的WordPress教程,我觉得对新手来说难度还是太大了,所以就根据自...

    主机优惠教程
  • 腾讯云Linux服务器搭建一个WordPress博客

    看到网络上很多人买了腾讯云服务器后却不知道怎么搭建WordPress博客,看了一下腾讯云出的WordPress教程,我觉得对新手来说难度还是太大了,所以就根据自...

  • 腾讯云服务器搭建wordpress个人博客网站(史上最详细教程)

    如何购买腾讯云服务器搭建WordPress博客呢?可能有些新用户看过腾讯云的WordPress教程文档,里面有太多的专业术语,很多用户根本无法理解,今天笔者根据...

    用户2416682
  • 【玩转腾讯云】十一.轻松打造一款好用的私有云笔记

    ②选择自定义配置——计费模式为“按量付费”——地域选择“北京”——可用区选择“随机可用区”——网络选择“默认”即可

    一只特立独行的兔先生
  • 288买了三年腾讯云cvm该如何配置开发环境...

    阿里云95块钱买的ECS要到期了,续费的话需要1000多。想了想服务器上也没啥重要的东西,于是趁着腾讯云折扣,花了288买了个三年的CVM。CVM就是一个云虚拟...

    叫我阿柒啊
  • 腾讯云服务器搭建wordpress个人博客网站(史上最详细教程)

    https://cloud.tencent.com/redirect.php?redirect=1042&cps_key=6f5f5aedea72d213ca3...

    勤劳的小蜜蜂
  • 腾讯云-ASP.NET Core+Mysql+Jexus+CDN上云实践

    云服务器(Cloud Virtual Machine,CVM)为您提供安全可靠的弹性计算服务。 只需几分钟,您就可以在云端获取和启用 CVM,来实现您的计算需求...

    痴者工良

扫码关注云+社区

领取腾讯云代金券