linux pam 控制模式

工作类别(type)、流程栈(stack)和控制模式(control)

Linux-PAM 工作的“类别”(type)

PAM 的具体工作主要有以下四种类别(type):account,auth,password 以及 session。这里,我们用非定义化的语言来简单解释一下这四种类别。

  • account:在用户能不能使用某服务上具有发言权,但不负责身份认证。比如,account 这个 type 可以检查用户能不能在一天的某个时间段登录系统、这个用户有没有过期、以及当前的登录用户数是否已经饱和等等。通常情况下,在登录系统时,如果你连 account 这个条件都没满足的话,即便有密码也还是进不去系统的。

  • auth:验证“你的确是你”的 type 。一般来说,询问你密码的就是这个 type。假如你的验证方式有很多,比如一次性密码、指纹、虹膜等等,都应该添加在 auth 下。auth 做的另外一件事情是权限授予,比如赋给用户某个组的组员身份等等。
  • password:主要负责和密码有关的工作。修改密码的时候有时会提示“密码不够长”、“密码是个常用单词”之类的,就是在这里设置的。在这里还设置了保存密码时使用了哪种加密方式(比如现在常用的 SHA-512)。请注意,这里的密码不局限于 /etc/shadow 中的密码,有关认证 token 的管理都应该在此设置:如果你使用指纹登录 Linux,在设置新指纹时,如果希望首先验证这是人的指纹而不是狗的指纹,也应该放在这里。
  • session:一个“忙前忙后”的 type,它要在某个服务提供给用户之前和之后做各种工作。比如用户登录之前要将用户家目录准备好,或者在用户登录之后输出 motd 等等。

请注意:PAM 不仅仅在用户登录时才发挥作用,sudo命令,su命令,passwd命令都会用到 PAM。前文中所有提及“登录”的地方都仅仅是举例,您完全可以用其他需要用户认证的服务(或者命令)去举例,从而更全面地理解 PAM。

PAM 的流程栈(stack)概念:它是认证时执行步骤和规则的堆叠。在某个服务的配置文件中,它体现在了配置文件中的自上而下的执行顺序中。栈是可以被引用的,即在一个栈(或者流程)中嵌入另一个栈。我们之后和它会有更多的接触。

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

“关键字”模式下,有以下几种控制模式:

  • required:如果本条目没有被满足,那最终本次认证一定失败,但认证过程不因此打断。整个栈运行完毕之后才会返回(已经注定了的)“认证失败”信号。

  • requisite:如果本条目没有被满足,那本次认证一定失败,而且整个栈立即中止并返回错误信号。
  • sufficient:如果本条目的条件被满足,且本条目之前没有任何required条目失败,则立即返回“认证成功”信号;如果对本条目的验证失败,不对结果造成影响。
  • optional:该条目仅在整个栈中只有这一个条目时才有决定性作用,否则无论该条验证成功与否都和最终结果无关。
  • include:将其他配置文件中的流程栈包含在当前的位置,就好像将其他配置文件中的内容复制粘贴到这里一样。
  • substack:运行其他配置文件中的流程,并将整个运行结果作为该行的结果进行输出。该模式和 include 的不同点在于认证结果的作用域:如果某个流程栈 include 了一个带 requisite 的栈,这个 requisite 失败将直接导致认证失败,同时退出栈;而某个流程栈 substack 了同样的栈时,requisite 的失败只会导致这个子栈返回失败信号,母栈并不会在此退出。

“返回值=行为”模式则更为复杂,其格式如下:

[value1=action1 value2=action2 ...]

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

流程栈中很可能有多个验证规则,每条验证的返回值可能不尽相同,那么到底哪一个验证规则能作为最终的结果呢?这就需要 actionN 的值来决定了。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:清空之前生效的返回值,并且从下面的验证起重新开始。

我们在前文中已经介绍了控制模式(contro)的“关键字”模式。实际上,“关键字”模式可以等效地用“返回值=行为”模式来表示。具体的对应如下:

  • required:
    [success=ok new_authtok_reqd=ok ignore=ignore default=bad]

  • requisite:
    [success=ok new_authtok_reqd=ok ignore=ignore default=die]
  • sufficient:
    [success=done new_authtok_reqd=done default=ignore]
  • optional:
    [success=ok new_authtok_reqd=ok default=ignore]
时间: 2024-10-15 07:01:37

linux pam 控制模式的相关文章

Linux PAM&&PAM后门

Linux PAM&&PAM后门 我是壮丁 · 2014/03/24 11:08 0x00 PAM简介 PAM (Pluggable Authentication Modules )是由Sun提出的一种认证机制.它通过提供一些动态链接库和一套统一的API,将系统提供的服务和该服务的认证方式分开,使得系统管理员可以灵活地根据需要给不同的服务配置不同的认证方式而无需更改服务程序,同时也便于向系统中添加新的认证手段.PAM最初是集成在Solaris中,目前已移植到其它系统中,如Linux.Sun

Linux用户安全及Linux PAM验证机制

一.Linux身份验证 1.用户与系统管理员     >用户分为系统管理员与普通管理用户两大类.            >每个用户在系统中都有唯一的用户名,是用户使用系统的凭证.     >系统管理员(System Manager) 又称之为超级用户,账号为"root",也叫根用户,拥有系统操作最高行使权.         >在系统中具有最高权限,主要负责系统管理工作.     >普通用户的账号可以随意取,通常的要求是不能以数字和下划线作为第一个字符.  

华为服务器通过mgmt口挂载光盘装系统及Linux系统rescue模式下修复内核

Linux系统rescue模式下修复内核和grub 故障现象 处理思路,内核报错,因此重新安装内核,通过光盘启动,进入救援模式.1.进入救援模式(1)华为服务器没有光驱,通过mgmt管理口登录,挂载iso镜像来引导.连接服务器mgmt口至数据中心网络,浏览器登录,默认IP地址192.168.2.100,默认账号root,默认密码Huawei12#$.登录如下图 单击远程控制链接,进入远程控制管理页面,选择独占模式,如下图 打开远程管理控制台,java信息提示,点击继续这里要求远控操作电脑安装好j

Linux串口IO模式的一些心得

众所周知,在Linux系统下所有设备都是以文件的形式存在,串口也一样. 通常I/O操作都是有阻塞与非阻塞的两种方式. 其中"超时"这个概念其实是阻塞中的一种处理手段,本质还是属于阻塞的I/O模式. 在Linux中串口的IO操作 本文将它分为三种状态: 阻塞状态 超时状态 非阻塞状态 这三种状态的转换组合有这么几种: 阻塞 --> 超时 阻塞 --> 非阻塞 超时 --> 阻塞 超时 --> 非阻塞 非阻塞 --> 阻塞 我们一个一个来分析 首先在一个串口的

linux的启动模式的设置及root用户密码的修改

1.修改启动模式: 进入命令行终端使用这个命令 [[email protected] ~]# vi /etc/inittab id:5:initdefault: 5为图形界面模式 3为多用户开发者模式 敲击i进入编辑模式,将5修改为3 执行Esc->:wq->reboot 修改成功! 2.修改root密码: a.启动系统, b.在界面启动时让它停留一下,随便按一下键盘上的一个键,此时就会进入到操作系统配置引导界面, c.根据提示,敲击键盘e键,编辑启动信息 d.找到kernel选项,根据提示,

Linux进程控制编程

一.获取ID #include<sys/types.h> #include<unistd.h> pid_t getpid(void)    获取本进程ID pid_t getppid(void)  获取父进程ID 父进程:现有进程中,创建新的进程. 例:getpid.c #include<stdio.h> #include<unistd.h> #include<stdlib.h> int main() { printf("PID=%d\

linux的bond模式绑定及模式区别

[linux的bond模式配置] 原理: 多块网卡虚拟成一张,实现冗余:多张网卡对外显示一张,具有同一个IP: 工作在网卡是混杂模式的情况下: 对于多物理网卡的 Bond 网卡而言,其中一块物理网卡会被设置为 Master,其他的网卡都是 Slave,Bond 网卡的 MAC 地址取自标志为 Master 的物理网卡,然后将这个 MAC 地址复制到其他物理网卡上: 工作模式: 在主备模式下 , 只有主网卡 eth0 工作,eth1 作为备份网卡是不工作的,只有当一个网络接口失效时 ( 例如主交换

Linux进程控制——exec函数族

原文:http://www.cnblogs.com/hnrainll/archive/2011/07/23/2114854.html 1.简介 在Linux中,并不存在exec()函数,exec指的是一组函数,一共有6个,分别是: #include <unistd.h> extern char **environ; int execl(const char *path, const char *arg, ...); int execlp(const char *file, const char

Oracle Grid Infrastructure Installation Guide for Linux 以debug模式安装并记录日志

使用如下命令能够以debug模式安装Oracle Grid并将日志记录到文件 [[email protected] 11ggrid]$ ./runInstaller -debug > /home/grid/oracle_grid_installer_`date +%G%m%d_%H%M%S`.log 注意:其中的文件名为了避免重复,加入了当前的日期和时间`date +%G%m%d_%H%M%S` 代表了当前的日期和时间,之间用下横线隔开 重要说明点:那个日期$(`date +%G%m%d_%H%