Virginia Jean

PAM 教程:一、PAM 简介

本系列讲解了 Linux-PAM 的工作机制和配置方式,还在 Linux-PAM 上做一些有趣的小实验。

本文的目标读者是期望了解 PAM 认证机制的 Linux 用户或者系统管理员。如果您是开发人员,希望编写一个使用 PAM 认证的应用程序或者 PAM 模块,本文的内容可能并不能满足您的需求,请参阅《Linux-PAM应用开发指南》(英文)和《Linux-PAM 模块开发指南》(英文)。

本文是该系列的第一篇:《PAM 简介》。

目录

  1. PAM 简介(本文)

  2. Linux-PAM 的配置文件

  3. Linux-PAM 小实验

  4. 参考文献


1. PAM 简介

PAM 的全称为“可插拔认证模块(Pluggable Authentication Modules)”。设计的初衷是将不同的底层认证机制集中到一个高层次的API中,从而省去开发人员自己去设计和实现各种繁杂的认证机制的麻烦。如果没有 PAM ,认证功能只能写在各个应用程序中,一旦要修改某个认证方法,开发人员可能不得不重写程序,然后重新编译程序并安装;有了 PAM ,认证的工作都交给 PAM ,程序主体便可以不再关注认证问题了:“ PAM 允许你进来,那你就进来吧。”

PAM 机制最初由 Sun 公司提出,并在其 Solaris 系统上实现。后来,各个版本的 UNIX 以及 Linux 也陆续增加了对它的支持。Linux-PAM 便是 PAM 在 Linux 上的实现,获得了几乎所有主流 Linux 发行版的支持。Linux-PAM 的目标同 PAM 一致,都是为了给程序的开发人员提供一套统一的认证接口。本系列中对 PAM 的介绍和实验,如无特别说明,一般都特指 Linux-PAM,实验的环境也均是 Linux。

我们先用一个例子来直观感受一下 PAM 。

su 是一个很常用的 Linux 命令,可以让我们从一个用户切换到另一个用户。我们都知道,当用户使用 root 账号登录时,su 到别的用户是不需要密码的,而从其他用户 su 到 root 则需要输入密码。在用 su 命令切换用户的过程中, su 做了两件事:认证(是否是 root、不是 root 的话是否有目标用户的密码)和启动相应的 Shell。

让我们来关注一下 su 的认证功能。按照正常的逻辑, su 的开发人员很可能会自己写出认证的功能:先判断是不是 root,是则判定认证通过;不是则要求用户输入目标账号的密码,匹配成功则认证通过,否则不通过。这套逻辑并不复杂,开发人员开发出来便是了。

过了几天,用户提出了这样的一个需求:运维团队都属于 wheel 组,能不能让 wheel 组的用户也能不输入密码而使用 su 切换?看起来也不是什么特别困难的需求,开发人员本可以满足就是了。但是如果再过几天,运维小张考虑到安全想要 su 有短信验证码功能,而用户小王为了方便测试想要一个完全不用密码的 su。认证需求的差异化越来越明显,开发人员的工作也变得越来越困难。

这时,PAM 出现了。PAM 对开发人员说:“认证的事情交给我,你只要告诉我你想做用户认证就好,余下的事情由我来解决,能不能通过由我来说了算。”它又对运维人员说:“你们来我这里编写你们想要的针对 su 的认证策略吧,我将充分保证功能的灵活。”

这下好办了。su 的开发人员可以专注地为用户启动 Shell 服务,而不需要关心用户认证的细节了;用户或复杂、或简单的认证需求也都得到了满足。真是皆大欢喜。

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

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

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


这是第一篇 / 下一篇

comments powered by Disqus