PAM
1. 介绍
PAM全称是可插拔身份认证模块(Pluggable Authentication Modules);
Linux-PAM (Linux下的可插入式认证模组) 是一套共享函数库,允许系统管理员来决定应用程式如何识别用户.
换句话说,就是用不着(重写和)重新编译一个(支援PAM的)程式,就可以切换它所用的认证机制. 你可以整个的升级你的证系统而不用去管应用程式本身.
Linux-PAM 给系统管理员提供了相当大的弹性来设定系统里程式的权限赋予. 由PAM控制的系统安全的本地配置可以包含
在以下两个地方: 或者是一个单一的系统文件: /etc/pam.conf; 或者是/etc/pam.d/ 目录下的文件.
2、配置文件的内容(截选一行如下):
account required pam_nologin.so
认证 控制方式 调用的模块
第一列是认证类型,可用的选项有:
accout: 执行基于用户管理的非认证行为操作。典型的,它可以限制用户的登陆时间、可用的系统资源。
auth: 这个模块提供了验证用户的两个方面。首先,它认证用户是他声称的那个人(比如用密码验证);其次,它赋予用户组成员身份或其他权限。
password: 当用户修改密码时,需要这个模块。
session: 当赋予用户某些服务之前或之后,要执行哪些操作。例如用户在访问数据时执行写日志操作。
第二列是控制方式,可用的选项有:
required: 检查结果失败,最终一定会失败,但是仍然检查后续项
requisite: 与required类似。只不过该项检查失败,立即停止后续检查项。
sufficient: 该项检查成功,立即通过,不再检查后续项。如果该项检查失败,也不意味着最终会失败。
optional: 可选
include: 包含另一个文件的内容
第三列是调用的模块,这些模块位于/lib64/security/目录下
# ls /lib64/security/
pam_access.so pam_krb5afs.so pam_sepermit.so
pam_cap.so pam_krb5.so pam_shells.so
pam_chroot.so pam_lastlog.so pam_smbpass.so
pam_ck_connector.so pam_limits.so pam_sss.so
pam_console.so pam_listfile.so pam_stress.so
... ...
3.PAM应用实例:
例一:只有wheel组的成员才可以切换成root用户
# vim /etc/pam.d/su ->打开auth required 这行的注释
以tom身份登陆,执行su –操作,即使输入正确的root密码,也不能登陆
# usermod -aG wheel tom ->把tom加入到wheel组
再次执行su –操作,tom可以切换成root用户
例二:禁止tom从tty2登陆
# vim /etc/pam.d/login ,加入下面一行
account required pam_access.so
# vim /etc/security/access.conf ,尾部增加
- : tom : tty2
例三:只允许tom用户打开两个文件
查看/etc/pam.d/system-auth中包含
session required pam_limits.so
# vim /etc/security/limits.conf ,尾部增加
tom hard nofile 2
不管是切换成为tom,还是以tom身份登陆 ,都被禁止。
例四:创建文件/etc/vsftpd/ftpgrps,该文件中的组不能访问ftp
# groupadd denyftp
# usermod -aG denyftp tom
# echo ‘denyftp’ > /etc/vsftpd/ftpgrps
# vim /etc/pam.d/vsftpd ,尾部增加
auth required pam_listfile.so item=group sense=deny file=/etc/vsftpd/ftpgrps onerr=succeed
验证,tom登陆ftp,登陆不成功,检查/var/log/secure日志
4.附上一份PAM系统管理员指南:
The Linux-PAM 系统管理员指南
作者:Andrew G. Morgan,
morgan@linux.kernel.org
翻译:孙国清(Thomas Sun),thomassun@yeah.net
DRAFT v0.71 1999/11/8 这个文档所涉的是系统管理员须知的关于Linux-PAM库的知识. 它涉及了设置PAM的正确语法并讨
论维护一个可靠系统的正确的策略.
1. 介绍
Linux-PAM (Linux下的可插入式认证模组) 是一套共享函数库,允许系统管理员来决定应用程式如何识别用户.
换句话说,就是用不着(重写和)重新编译一个(支援PAM的)程式,就可以切换它所用的认证机制. 你可以整个的升级你的证系统而不用去管应用程式本身.
传统上,当一个应用程序有身份识别的需求,它就不得不把某一种验证算法写进去. 例如,就传统的UN*X系统而言,核对使用
者身份的方法就是要求用户输入正确的密码. 这密码,除了开头的两个字符作为"salt",剩下的是加密过的(经由crypt
(3)). 接著用户被验证这个加密过的密码是否与他在密码档(就是/etc/passwd文件)中他的那笔记录的第二栏相符.在这样
的系统里,绝大部份权限的授予是基于这种单一的认证机制. 权限决定于个人的识别码(uid)和不同群组的成员.服务和程
式是否可用由个人和群组的识别码决定.传统上,群组关系经由/etc/group文件中的记录来赋予.
不幸的是,随着计算机速度的不断提高,再加上满世界的关于网路计算的介绍,使得象这样曾是安全的验证机制,变得易受攻
击了.面对这样的现实,新的验证方法正在持续的开发中.
Linux-PAM项目的目标是把赋权部分的开发以可靠的合适的鉴定模式从软件中分离出来。这目标已经通过提供一组库函数
实现了,应用程序可以用这些函数来请求验证某个用户。这个 PAM 由特定的系统文件配置,/etc/pam.conf (或者是
在/etc/pam.d/里的一系列配置文件) 以经由特定的可用的认证模组来鉴定某个用户的请求。 这些个模组通常位
于/usr/lib/security目录并且以可动态加载的目标文件的形式出现(参见 dlopen(3)).
2. 文中的说明
在继续阅读之前, 请记住本文假定提到的文件位于默认的目录。这个默认的目录我们遵循RFC(RFC-86.0,见
bibliography)中的约定。如果你正用一个支持PAM但是却选择以不同的方式发布这些文件的发布版的Linux(或是其他的
OS) (Red Hat就是这样的发布版), 那你从文章中直接拷贝例子的时候就要注意一下了.
举个例子, where it is explicit, 本文假定PAM可加载目标文件(就是 模块)位于这个目录: /usr/lib/security/. 可是
, Red Hat Linux, 为遵循Linux文件系统标准(the FSSTND),把这些文件放在/lib/security. 在使用本文的例子时请小心
的做一些转换的工作。
3. 概观
For the uninitiated,我们开始于考虑一个例子。我们来说说一个应用程序提供一些服务给用户; login 就是这样的程
序。 Login 做两件事,它首先确认提出请求的用户正是他们自己,第二步提供给他们所请求的服务: 就login而言服务
即是一个命令行外壳(command shell)(如bash,tcsh,zsh之类。)以这个用户的身份去跑。
传统上,前一个步骤通过login提示用户输入密码然后确认系统是否同意登入;接着确认(就系统而言)用户确实是提出
要求的那人。这类工作就是Linux-PAM的典型应用。
从应用程序员的角度看(在这个例子里就是写login程序的人), Linux-PAM处理认证的工作——确认用户的身份。
Linux-PAM的弹性在于,你,系统管理员有权来决定实施怎样的验证方案。你有权来设定你的系统里的任何支持PAM的应用
程序的验证方案。就是说,你可以将验证方案设计成单纯的信任>;任何人(pam_permit)到像偏执狂似的通过视网膜扫描
,声音识别和一个密码!
举例说明你所面对的弹性,考虑以下情形:系统管理员(家中的父母)希望提高他的使用者(孩子们)的算术能力。她可
以设置他们喜欢玩的“Shoot 'em up”(游戏,当然得支持PAM)通过提问小于12的一对随机数的乘积的办法来进行认证
。很明显不管游戏本身如何,他们会很快学会乘法表。等他们再大些,认证可以升级到包括多位除法!(译者:我已经准
备用这种办法来教我宝贝女儿学加减乘除了。)
Linux-PAM处理四种独立的(管理)工作。它们是: 认证管理; 帐号管理; 会话期间管理;和密码管理。 The
association of the preferred management scheme with the behavior of an application is made with entries in
the relevant Linux-PAM configuration file. 管理的功能由配置文件中指定的模块 来完成。这文件的语法在 below部
分讨论。
下面的插图描述了Linux-PAM的整个组织结构。
+----------------+
| application: X |
+----------------+ / +----------+ +================+
| authentication-[---->;--\--] Linux- |--;
如果 libpam 和 libpam_misc 不在程序所需的函数库之列,那么它将不会用PAM.
然而,这两个函数库还是可能已经包含进程序了,不过问题依然存在,因为把PAM
写死在程序不会如你期望的工作.所以一个更可靠的方法是做一下的测试:
在/etc/pam.d目录里,需要为程序设有一个配置文件.具体的文件名是写死在程序里的.
通常和程序名一样,但却不总是这样.为举例说明,假设程序名字叫"pamprog",配置文件
是/etc/pam.d/pamprog.
在/etc/pam.d/pamprog里写这两行:
auth required pam_permit.so
auth required pam_warn.so
现在试着执行pamprog. 配置文件的第一行是说所有用户都被允许. 第二行会在你的
syslog 文件(或者其它你的syslog会写的文件) 里写一个warning.
如果这测试是成功的,那么你就知道你有一个"懂"pam的程序,并且你可以开始更有趣的工作:
决定如何在你的/etc/pam.d/pamprog里堆彻PAM模块.
4. Linux-PAM的设定档
Linux-PAM 给系统管理员提供了相当大的弹性来设定系统里程式的权限赋予. 由PAM控制的系统安全的本地配置可以包含
在以下两个地方: 或者是一个单一的系统文件: /etc/pam.conf; 或者是/etc/pam.d/ 目录下的文件. 本章我们来讨论这
些文件的语法和一般的选项.
4.1 设定档的语法
请注意, 在这些文件里 Linux-PAM 特有的符号是不区分大小写的. 而模块的路径,是大小写敏感的,因为它标识的是Linux
下的文件的名字. 而任何模块参数的大小写分别由各个模块定义.
除以下的行之外,为系统管理员方便,还有两个特殊的字符: 注解由'#'开头,结束于行结束,另外,模块的描述行可以以 '\'
脱字符延续到下一行.
通常/etc/pam.conf里的每一行有以下格式:
service-name module-type control-flag module-path arguments
接下来,我们来解释每个栏位的意思.另一种(也是常被采用的)设置Linux-PAM 的方法是通过/etc/pam.d/里的文件来实现.
在我们解释完上面的那行之后, 我们就来讨论这种方法.
service-name
这笔记录相关的服务名称.通常这服务名称是特定应用程序的名字.比如, `ftpd', `rlogind' 和 `su' 这些. .
有一个保留的服务名称,它是用来定义默认的认证机制的. 它就是`OTHER',大小写无关.注意,当已经有为指定服务定
义了模块,那么 `OTHER' 记录会被忽略.
module-type
模块的四种(目前是)类型.这四种类型是:
* auth; 这种模块类型确定有关用户认证的两方面. 第一,它确认用户就是他们自己,这通过指示应用程序提示用
户输入密码或者其它证实身份的方法.第二,这类模块会赋予成员资格 Secondly, the module can grant group
membership (independently of the /etc/groups file discussed above) or other privileges through its
credential granting properties.
* account; 这些模块处理非认证级的帐号管理. 典型的用法是基于一天的不同时间段来限制/允许访问某服务,
当前可用的系统资源 (最大用户数)或者限制特定用户---'root只能从控制台登录.
* session; 首先, 这类模块和一系列动作有关,指在用户得到/失去服务时要做的事. 这包括记录用户的登录/登
出,挂载必须的目录等等.
* password; 这最后一种类型在更新用户的认证标志时需要. 通常,各个基于"质问/回答"(译注:指传统的用户名
/密码的认证方法)的认证方法(auth)有一个对应的此模块.
control-flag
控制符用来指示当某一模块返回成功或失败时PAM如何动作. 既然模块可以被堆叠 (同种类型的模块按先后顺序执行,
一个接一个), 控制符决定每个模块的重要程度.应用程序不会直接接收'/etc/pam.conf' 里列出的每一个模块的成功或失
败的结果. 相应的是,它只从Linux-PAM接收一个 成功 或 失败 的结论. 这些模块的执行顺序就是它们在 /etc/pam.conf
里的记录的顺序;排在前面的记录在排在后的记录之前被执行. 在Linux-PAM 0.60版本里, 这个control-flag 可以有两种
语法来定义.
简单一些(也是过去的)语法是用一个限定词指示相关模块的重要程度. 有四个关键字: required, requisite,
sufficient 和 optional.
Linux-PAM 将这四个关键字解释为:
* required; 需要的,这表明此模块返回成功值对于整个module-type的成功是必要的. 此模块的返回失败并不会
传回给用户直到剩下的模块(同样module-type)都执行过.
* requisite; 必要的,类似 required, 只不过, 当这类模块返回失败时,整个控制会立刻回到应用程序. 返回值
同第一个 需要的 或 必要的模块返回的失败. 注意,这标志可以用来防止 required or requisite module to fail.
Note, this flag can be used to protect against the possibility of a user getting the opportunity to enter
a password over an unsafe medium. It is conceivable that such behavior might inform an attacker of valid
accounts on a system. This possibility should be weighed against the not insignificant concerns of
exposing a sensitive password in a hostile environment.
* sufficient; 充分的,这模块返回的成功会被认为已经 充分满足Linux-PAM 库确认这类模块(module-type)是
成功的条件. 如果没有先前的requisite 模块返回了失败,那么不再会有其它'堆叠' 的模块被呼叫. (注意, 这种情况下,
随后的requisite 模块就不会 被呼叫.). 这模块返回的失败不会看作是致命的错误而至影响应用程序从这module-type
得到成功的结果.
* optional; 可选的,正如这名字一样,此?control-flag 致使模块对最终的成功或失败的结果不会产生决定性的
影响. 一般,Linux-PAM 在确定整个模块堆成功活失败时忽略这模块. 然而, 当从之前或后续的模块得不到明确的成功或
失败的结果时,这模块将决定返回给应用程序的状态. 后种情况会出现在比如当其它模块返回PAM_IGNORE 时.
更复杂(新)的语法则更明确,使管理员有更多的控制用户认证的空间. 这种控制符以方括号包含,由一系列的
value=action 对组成:
[value1=action1 value2=action2 ...]
这里的 valueI 有以下值 return values: success; open_err; symbol_err; service_err; system_err; buf_err;
perm_denied; auth_err; cred_insufficient; authinfo_unavail; user_unknown; maxtries; new_authtok_reqd;
acct_expired; session_err; cred_unavail; cred_expired; cred_err; no_module_data; conv_err; authtok_err;
authtok_recover_err; authtok_lock_busy; authtok_disable_aging; try_again; ignore; abort; authtok_expired;
module_unknown; bad_item; conv_again; incomplete; 和 default. 最后的 (default) 被用来定义当没有明确定义时
的默认动作.
actionI 可以是一个正数或者是以下标识: ignore; ok; done; bad; die; 和 reset. 当以一个正数J 作为action
时,它的作用是指示以下J个模块将被跳过. 通过这种手段, 管理员可以开发出适度复杂的模块堆叠,它以许多不同的路径
执行. 至于以何种路径则决定于某个模块的反应.
* ignore - 此类模块的返回状态将不会影响应用程序所得到的返回值.
* bad - 这表示相应的返回值将被认为是模块失败. 如果此模块是堆叠中的第一个失败的模块, 它的状态值将作
为整个堆叠的状态.
* die - 和 bad 相同,不过会终止整个模块堆叠,PAM立即返回到应用程序.
* ok - 这告诉PAM 管理员要让此返回值直接作用于整个模块堆叠的返回. 换句话说, 如果堆叠的原先状态会导
致返回 PAM_SUCCESS, 这模块的返回值将会覆盖这结果. 请注意:如果堆叠的原先状态保存着一些意为模块失败的值,
这'ok'将不会用来覆盖那样的值.
* done - 和 ok 一样, 不过会终止整个模块堆叠, PAM立即返回到应用程序.
* reset - 清除储存模块堆叠状态的内存并且重新开始下一组堆叠.
来体会一下这种新语法的强大之处, 从 Linux-PAM-0.63起, 客户插件代理的概念被引进. 这多少使PAM支援从C/S应
用程序固有的传输协议进行机器-机器的认证成为可能.(?) 通过 ``[ ... value=action ... ]'' 的语法, 使应用程序对
支援binary prompt?的客户端采用binary prompt?, 而对旧有的客户端则向后兼容的采用另一种认证模式. 够灵活吧?
module-path
是可动态加载目标文件的路径; 也即可插入式模块 本身. 如果路径的首字符是 `/', 那它被作为一个完整路径. 如
果不是这样, 那模块的路径则会加上默认的模块路径: /usr/lib/security (见 above).
args
args 是一组传给模块的参数. 类似一般Linux的指令的参数. 通常, 合法的参数是可选的并且是模块特有的. 无效的
参数会被模块忽略, 可是, 当抓到一个无效参数, 模块被要求写一个错误信息到 syslog(3). 下一节有一个一般 选项的
列表.
设定档里如果有任一行有格式错误, 那通常会导致认证流程失败. 相应的错误信息会通过呼叫syslog(3)写入系统日志.
4.2 基于目录的设定
从0.56版开始有比单个配置文件更灵活的做法, 可以通过/etc/pam.d/里的文件来配置libpam. 这种方法,/etc/pam.d/里
的文件名和服务名(service-name)相同(小写): 这是各服务的个性化设置档.
Linux-PAM 可以编译成两种模式之一. 首选的模式是使用/etc/pam.d/ 或/etc/pam.conf设定,但不是同时两者皆可.也就
是说, 如果; 那我先在还能做些什么苦差呀?
好,不要惊慌. 你首先要认识到的是这种事情会发生在50%的从未碰过PAM的用户身上.
这已经不止发生一两次了,每次都不一样,但是最终,每次解决方法总是一样的.
首先,我希望你设定了LILO的延时.如果是的,重开机,按下shift或者tab或其它什么键,
然后输入:
LILO boot: linux single
(把 'linux' 替换成你的linux启动字串).
这会把你带进系统而不用登入. 想知道从控制台破掉一台Linux主机是多容的事?
现在知道了吧.
如果没法那样做,那你就要一个启动软盘和一个根文件系统盘象slachware的rescue.gz.
(Red Hat的安装盘有这样的模式.)
总之,重点是要进入到root提示符.
然后, 我假设你还没有完全打烂你的PAM安装包 - 仅仅是破坏了设定档.
这里是重新设定PAM的步骤:
cd /etc
mv pam.conf pam.conf.orig
mv pam.d pam.d.orig
mkdir pam.d
cd pam.d
然后用vi在这目录下创建一个叫"other"的文件.包含下面四行:
auth required pam_unix_auth.so
account required pam_unix_acct.so
password required pam_unix_passwd.so
session required pam_unix_session.so
现在你有了PAM的最简单的设置了, 这象你以前用的方式一样工作.
所有的事情又魔法似的能运作了.
来试着按ALT-F2从另一控制台登入. 如果无法登入, 你就有了大麻烦了,或者打错了什么.
奇怪的是如果你在设定档里输错了东西, 你不会从控制台得到任何错误 - 错误只会记录
在日志档里. 所以看看那儿!(tail /var/log/messages.)
从现在起你可以回头做实际设定, 但愿这首次经历没把你搞懵了. :/
一些要点 (to make everything "right" with Red Hat...):
从RedHat安装目录安装最新的pam, pamconfig, and pwdb , 下一个指令
rpm -Uvh [或需要加上 --force too] pam-* pamconfig-* pwdb-*
然后确认你安装(或重装)了最新版的libc, util-linux, wuftp, 和 NetKit. 或许
还有相关的x应用程序, 像xlock,但我还从没有用过.(注:这篇文章写的比较早,那时候
X程序很少)
5.2 防止采用一个脆弱的"other"设定.
拥有一个脆弱的默认设定(OTHER)是件坏事. OTHER是所有面向PAM的程序的默认设定,如果它很脆弱, 你的系统就有可能变
得易受攻击.
这里有个"other"设定的例子.pam_deny 模块会拒绝所有访问同时pam_warn模块会在在系统日志里记下auth.notice:
#
# The PAM configuration file for the `other' service
#
auth required pam_deny.so
auth required pam_warn.so
account required pam_deny.so
account required pam_warn.so
password required pam_deny.so
password required pam_warn.so
session required pam_deny.so
session required pam_warn.so
6. 可用模块的参考指南
以下是目前Linux-PAM可用的各种模块的具体说明. 通常这些模块可以自由使用. 除非特别指出.
在拷贝下面的例子时也请注意 on text conventions above里的备注.
6.1 access 模块
概要
模块名:
pam_access
作者:
Alexei Nogin ;
维护者:
作者
提供的管理组:
account
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:
需要一个设定档:/etc/security/access.conf
网络接口:
如果设定了就通过PAM_TTY , 否则尝试呼叫ttyname()从标准输入文件描述符得到tty名字.标准的 gethostname(),
yp_get_default_domain(), gethostbyname() 呼叫. NIS 用来提供网络用户组的支持.
概述
提供logdaimon(?)类型的登录访问控制.
Account component
识别的参数:
描述:
这模块提供基于登录名称和主机(或域名),internet地址(或网络数),或者非网络登录的终端名字的录访问控制.诊断
信息通过syslog(3)记录. 来自Wietse Venema的logdaemon-5.6里的login_access.c经过A. Nogin修改后采用.
例子/建议用法:
推荐使用. 例如,在管理像NIS服务器和邮件服务器时, 你需要有一些活动的帐号, 但却不想所有这些帐号都有登录的
权限.
对于/etc/pam.d类型的设定方式,你的模块放在/lib/security里, 把下面一行加在 /etc/pam.d/login,
/etc/pam.d/rlogin, /etc/pam.d/rsh 和 /etc/pam.d/ftp前面:
account required /lib/security/pam_access.so
注意, 除非你的系统忽略.rhosts, 否则这模块不会产生作用. 见pam_rhosts_auth的文档.
在发布包里包含有一个 access.conf 的样本.
6.2 Chroot
概要
模块名:
pam_chroot
作者:
Bruce Campbell ;
维护者:
Author; proposed on 20/11/96 - email for status
提供的管理组:
account; session; authentication
Cryptographically sensitive:
安全等级:
代码清洁度:
Unwritten.
系统依赖:
网络接口:
要求是 localhost.
概述
这模块的目的是对一般用户进行透明的包裹, 这可以把他们置于一个伪装的文件系统 (比如, 他们的'/' 实际上是
/some/where/else).
如果你有几个不同类的用户, 并且你对于安全性有一点点偏执, 那这模块将非常有用. 这可以用来限制哪些用户能看到什
么, 并且限制他们只能执行哪些程序.
Account component:
Need more info here.
Authentication component:
Need more info here.
Session component:
Need more info here.
识别的参数:
Arguments and logging levels for the PAM version are being worked on.
描述:
范例/建议用法:
提供一组合理的程序 - 仅放入 'cat', 'ls', 'rm', 'cp' 和 'ed' 有点...
不要太极端 (比如, 你可以为每个用户设定各自分开的环境, 但这样会太浪费磁盘空间.)
6.3 Cracklib 可插入的密码强度检查程序
概要
模块名:
pam_cracklib
作者:
Cristian Gafton ;
维护者:
作者.
提供的管理组:
password
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:
需要系统库 libcrack 和系统字典: /var/cache/cracklib/cracklib_dict.
网络接口:
概述
这模块可以插入给定程序的password堆叠来提供密码的强度检验.
这模块以以下流程运行: 它首先呼叫Cracklib例程来检查密码的强度; 如果Cracklib认可, 那么模块会经行额外一些检查
. 这包括:
* Palindrome - 新密码是否为旧密码的回文?
* Case Change Only - 新密码是否只是拿旧密码改了些大小写?
* Similar - 新密码是否太像旧密码? 这由一个参数控制, difok 这是新旧密码的相差字符能被接受的最小个数, 模
式是10个或者新密码的1/2长, 二者取小的那个.
* Simple - 新密码是否太简单? 这由五个参数控制: minlen, dcredit, ucredit, lcredit 和 ocredit. 这些参数
如何生效以及默认值是什么见参数一节.
* Rotated - 新密码是否为旧密码的轮转?
* Already used - 密码是否曾经用过? 先前用过的密码保存在/etc/security/opasswd里.
不带参数的配置这模块可以很好的工作在标准的unix密码加密环境. 对于MD5加密, 密码可以长于8个字符,那么这模块的
默认设定就使用户选择一个满意的密码变得困难了. 显然, 对于新密码不能包含多于一半的旧密码的字符的要求就成了一
个不一般的限制了. 比如, 旧密码"the quick brow fox jumped over the lazy dogs" 将难于更改... 此外, 默认设定
允许密码短至5个字符. 对于采用md5加密算法的系统, 加大允许的最短密码长度会是个好主意. One can then allow
more credit for different kinds of characters but accept that the new password may share most of these
characters with the old password.
Password component
识别的参数:
debug; type=XXX; retry=N; difok=N; minlen=N; dcredit=N; ucredit=N; lcredit=N; ocredit=N;
描述:
这部件的动作是提示用户输入密码然后通过比对系统字典和一连串规则来检查它的强度以识别出差劲的选择.
默认动作是提示用户输入一个密码, 检查强度, 然后, 如果通过检查, 提示第二次输入密码 (用来检验第一次的输入
是正确的). 这之后, 密码被当作新的认证标识传送给随后的安装的模块.
默认的动作可以用一些参数改成许多不同的方式:
* debug - 这选项令此模块写入信息到syslog(3)以显示此模块的现为(此选项不会 把密码信息写入日志档).
* type=XXX - 提示用户输入密码的默认提示符是: ``New UNIX password: '' 和 ``Retype UNIX password:
''. 用此参数可以把 "UNIX" 替换成 XXX.
* retry=N - 本模组要求新密码(用来检查强度)的默认次数是1次. 用这参数可以增加到N次.
* difok=N - 这参数会改变允许新旧密码的字符差异为至少10个这样的默认值. 此外, 如果有一半的字符不同,
新密码就会被采用.
* minlen=N - 可接受的最短的密码长度+1. 此外对于新密码的长度, 对于每个不同种的字符 (其它,大写,小写
和 数字),会得到"加分" (长度+1). 此参数的默认值是9, 这对于旧的UNIX密码体系已经够了, 但是对于利用md5的额外安
全性或许太小了. 注意, Cracklib本身有一对长度的限制: 4, 写死在程序里的"路太短"的限制;6,定意的限制.这两个限
制会不经过参考minlen 而被检查出来. 如果你要允许密码长度短至5, 你要么不要使用此模块要么重新编译crack库并重
新编译此模块.
* dcredit=N - 这是对于新密码因包含数字而得到"加分"的限制. 如果你有小于或等于N个数字, 每个数字将会
对整个长度+1来迎合当前minlen 的值. dcredit的默认是1, 对于小于10的minlen 推荐此值.
* ucredit=N - 这是对于新密码因包含大写字符而得到"加分"的限制. 如果你有小于或等于N个大写字符, 每个
大写字符将会对整个长度+1来迎合当前minlen 的值. ucredit的默认是1, 对于小于10的minlen 推荐此值.
* lcredit=N - 这是对于新密码因包含小写字符而得到"加分"的限制. 如果你有小于或等于N个小写字符, 每个
小写字符将会对整个长度+1来迎合当前minlen 的值. lcredit的默认是1, 对于小于10的minlen 推荐此值.
* ocredit=N - 这是对于新密码因包含其它字符而得到"加分"的限制. 如果你有小于或等于N个其它字符, 每个
其它字符将会对整个长度+1来迎合当前minlen 的值. ocredit的默认是1, 对于小于10的minlen 推荐此值.
范例/建议用法:
为举例说明如何使用此模块, 我们列出如何将此模块和pam_unix 部件堆叠:
#
# 下面两行堆叠了两个password类型的模块. 在这例子里, 用户有3次机会输入健壮的密码.
# "use_authok"参数确保pam_unix模块不再另外提示输入密码,
# 而是采用由pam_cracklib提供的密码.
#
passwd password required pam_cracklib.so retry=3
passwd password required pam_unix.so use_authtok
另外一个例子(以/etc/pam.d/passwd的格式)是用md5密码加密的情形:
#%PAM-1.0
#
# 下面两行采用MD5系统, 密码长度最少14+出现数字的最多2个"加分"+
# 出现其它字符的最多2个"加分", 并且至少有3个字符没有出现在旧密码中.
#
password required pam_cracklib.so \
difok=3 minlen=15 dcredit= 2 ocredit=2
password required pam_unix.so use_authtok nullok md5
6.4 死锁模块
概要
模块名:
pam_deny
作者:
Andrew G. Morgan ;
维护者:
current Linux-PAM maintainer
提供的管理组:
account; authentication; password; session
Cryptographically sensitive:
安全等级:
代码清洁度:
清洁的.
系统依赖:
网络接口:
概述
这模块用来拒绝访问. 它永远透过PAM架构告知程序失败. 正如概述 above里提到的, 这模块适合用在默认(OTHER)条目.
Account component
识别的参数:
描述:
这部件除了返回失败外不做任何动作, 返回类型是 PAM_ACCT_EXPIRED.
范例/建议用法:
把这模块堆叠在account 里将会阻止用户通过应用程序(引用Linux-PAM的帐户管理函数pam_acct_mgmt())获取访问.
下面的例子使登入变得不可能:
#
# add this line to your other login entries to disable all accounts
#
login account required pam_deny.so
Authentication component
识别的参数:
描述:
这部件除了返回失败什么也不做, 当pam_authenticate()被呼叫(当应用程式试图认证用户时)时返回值是
PAM_AUTH_ERR; 当pam_setcred()被呼叫(当建立连接并设置用户证书时 -- 在具体实现中这函数不太可能被呼叫)时返回
PAM_CRED_UNAVAIL .
范本/建议用法:
为拒绝默认程序的访问, 在你的Linux-PAM里包含下面一行:
#
# add this line to your existing OTHER entries to prevent
# authentication succeeding with default applications.
#
OTHER auth required pam_deny.so
Password component
识别的参数:
描述:
模块的这部件会阻止用户有机会修改密码. 它总是返回PAM_AUTHOK_ERR.
范本/建议用法:
这模块可以用来阻止应用程序更新申请者的密码. 比如, 为阻止login 在用户的旧密码过期后自动提示输入新密码,
应该把下面一行放在你的设定档里:
#
# add this line to your other login entries to prevent the login
# application from being able to change the user's password.
#
login password required pam_deny.so
Session component
识别的参数:
描述:
模块的这一方面会阻止应用程序在主机上开启会话.
范本/建议用法:
和其它的session模块一起工作, 那模块也许显示一下"当日消息". 这模块可以用来阻止用户开启shell. 如有
pam_motd在先, 我们或可用下面的设置来阻止用户登录并提示用户现在是系统维护时间:
#
# An example to see how to configure login to refuse the user a
# session (politely)
#
login session required pam_motd.so \
file=/etc/system_time
login session required pam_deny.so
6.5 Set/unset 环境变量
概要
模块名:
pam_env
作者:
Dave Kinchlea ;
维护者:
Author
提供的管理组:
Authentication (setcred)
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:
/etc/security/pam_env.conf
网络接口:
概述
这模块允许(取消)设定环境变量. Supported is the use of previously set environment variables as well as
PAM_ITEMs such as PAM_RHOST.
Authentication component
识别的参数:
debug; conffile=configuration-file-name; envfile=/env-file-name; readenv=/0|1
描述:
这模块允许你(取消)设定任意的环境变量为固定字串, 先前的环境参数和/或PAM_ITEM.
通过设定档(默认是,/etc/security/pam_env.conf, 但是可由connfile 参数改变) 进行所有的控制. 每行由变量名
开始, 每个变量有两个可选项: DEFAULT和OVERRIDE. DEFAULT 用来设定变量的默认值, 如果没有指定默认值则设为空字
串. OVERRIDE 告诉pam_env如果变量以设定就覆盖(覆盖" "默认值). 如果未设定OVERRIDE, 则假定为""并且不会覆盖其
它值.
VARIABLE [DEFAULT=[value]] [OVERRIDE=[value]]
(也许不存在的)环境变量可以指定值为${string} 并且(也许不存在的)PAM_ITEM 可以用来指定值:&{string} .
$和& 可以由反斜线脱意为一般字符 (成为\$本生). 双引号可以用来封装有空格的值 (但是不可以用作变量名)必须
整个被引号包含并且里面不应该有引号或者脱意的引号.
这模块还可以解析包含单纯的每行是键=值格式的文件(默认是/etc/environment). 可以用 envfile 旗标设定默认文
件并且可以设定readenv 旗标为1或0来决定是否启用这选项.
这模块的行为可以由以下旗标来更改: flags:
* debug - 往syslog(3)写更多的信息.
* conffile=filename - 默认的设定档是/etc/security/pam_env.conf. 这选项可以覆盖此默认. 必须提供完整
的文件名,目录+文件名.
* envfile=filename - 默认从/etc/environment 里读键=值对来设定变量. 这选项覆盖默认文件. 必须提供完
整的文件名,目录+文件名.
* readenv=0|1 - 打开或关闭读取envfile指定的文件(0=关闭,1=开启). 默认是开启.
范本/建议用法:
更多的用法见pam_env.conf .
6.6 filter 模块
概要
模块名:
pam_filter
作者:
Andrew G. Morgan ;
维护者:
作者.
提供的管理组:
account; authentication; password; session
Cryptographically sensitive:
Not yet.
安全等级:
代码清洁度:
在Linux系统下可以干净的被编译.
系统依赖:
需要安装filters .
网络接口:
概述
这模块用来提供给类似ttysnoop(需要一些参考)的程序一个可选的插件. 因为还没有为这功能所写的插件出现, 这模块目
前只是个玩具. 提供给这模块的唯一一个插件仅是对输入输出流做大小写转换. (这会变得非常讨厌并对基于termcap的编
辑器不太友好)
Account+Authentication+Password+Session components
识别的参数:
debug; new_term; non_term; runX
描述:
每个组建都有呼叫过滤器的能力. 过滤器总是以所属应用程序的权限被execv(2) 而 不是 以用户的权限. 因此这些
过滤器并不总能被用户不经关掉相关会话而杀掉.
这模块的行为会被传给它的参数相当程度的左右:
* debug - 这选项增加模块被执行时写进syslog(3)的信息量.
* new_term - 过滤器的默认动作是会设定PAM_TTY 为用户连上应用程序时所用的终端代号. 此参数指示过滤器
可以设定PAM_TTY 为一个过滤了的伪终端.
* non_term - 不要试图设定PAM_TTY .
* runX - 模块必须得知道何时呼叫过滤器. 这参数告知过滤器何时被呼叫, 参数后面是各自的过滤器的完整路
径和过滤器执行时的参数.
X 所允许的值是 1 和 2. 这指示过滤器执行的确切时间. 阅读 Linux-PAM的模块开发指南会对解释此观念有
所帮助. 基本上, 针对每个管理组都有多至两个呼叫此模块的函数.
在 authentication 和 session 部件里, 实际上有两个不同的函数. 对于authentication, 这两个函数是
_authenticate 和_setcred -- 此时 run1 意味着在呼叫_authenticate时执行过滤器而run2 意味着呼叫_setcred时运行
过滤器. 对于session来说, run1 意指在_open_session 阶段运行过滤器, run2 在 _close_session 作用.
对于account部件. run1 和 run2 的任何一个被运行.
对于password部件, run1 用来指示当_chauthtok第一次被执行(PAM_PRELIM_CHECK阶段)时呼叫过滤器,run2
指示第二次时(tt/PAM_UPDATE_AUTHTOK/阶段)时呼叫.
范本/建议用法:
在写作本时, 这模块鲜有实际应用. 如兴趣所致, 你可以试着把下面几行加入你的login的设定.
#
# An example to see how to configure login to transpose upper and
# lower case letters once the user has logged in(!)
#
login session required pam_filter.so \
run1 /usr/sbin/pam_filter/upperLOWER
6.7 匿名访问模块
概要
模块名:
pam_ftp.so
作者:
Andrew G. Morgan ;
维护者:
作者.
提供的管理组:
authentication
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:
网络接口:
提示用户输入email地址; 易受欺骗的.(XXX - 需要加工)
概述
此模块的意图是提供一个可插入式的匿名ftp访问模式. mode of access.
Authentication component
识别的参数:
debug; users=XXX,YYY,...; ignore
描述:
此模块会拦截用户名和密码. 如果用户名是 ``ftp'' 或 ``anonymous'', 用户的密码以
[email='@']'@'[/email]
为分隔符被分解成
PAM_RUSER 和 PAM_RHOST 两部分; these pam-items being set accordingly. The username is set to ``ftp''. In
this case the module succeeds. Alternatively, the module sets the PAM_AUTHTOK item with the entered
password and fails.
此模块的行为可以有以下旗标修改:
* debug - 往syslog(3) 写更多的信息.
* users=XXX,YYY,... - 替代 ``ftp'' 或 ``anonymous'', 提供给以逗号分开的用户以匿名访问;
``XXX,YYY,...''. 申请人可以输入这些用户名之一, 返回的用户名设定为列表中的第一个用户;``XXX''.
* ignore - 不关心用户的email地址(如果提供).
范本/建议用法:
见 above.
6.8 群组访问模块
概要
模块名:
pam_group
作者:
Andrew G. Morgan ;
维护者:
作者.
提供的管理组:
authentication
Cryptographically sensitive:
安全等级:
对于针对setgid状态的文件可访问性敏感.
代码清洁度:
系统依赖:
需要/etc/security/group.conf 文件. 可被编译成带有或不带libpwdb.
网络接口:
仅通过正确的PAM_TTY 项.
概述
此模块提供基于用户名以及他们从哪个终端请求服务的群组设定. It takes note of the time of day.
Authentication component
识别的参数:
描述:
此模块不用于认证用户, 而是用来赋予用户组的身份(在认证模块的凭证设定阶段). 这些组身份基于他们请求的服务
. 组身份列在/etc/security/group.conf .
范本/建议用法:
为使这模块正常运作,必需先要有格式正确的/etc/security/groups.conf . 此文件的格式如下.组身份基于服务应用
程序满足此设定档的任意行来赋予. 没一行有如下格式(注解以`#'开头):
services ; ttys ; users ; times ; groups
前四个栏位和pam_time的etc/security/pam_time.conf语法相同, 最后的栏位, groups, 是以逗号(或者空格)分开的
一个组的列表. 如果用户的应用程序满足前四个栏位, 用户就被赋予列表中的组身份.
通常, 这模块对于分配用户特有的文件访问权限有帮助. 问题是一旦用户得到了组身份, 他就可以创建一个setgid
的属于某群组的程序. 这之后, 当用户不再是这个组的成员时, 他们可以通过这程序获取组身份. 之所以用户访问的文件
系统如此重要, 是一旦文件系统被加载为nosuid时, 这样的程序就无法执行. 为使这模块提供任何级别的安全性, 用户能
有写权限的所有文件系统都应该被加载成nosuid模式.
pam_group 模块的功能和/etc/group平行. 如果用户已被此模块赋予了任何组身份, 他还另外被赋予/etc/group里的
相关组身份.
6.9 Add issue file to user prompt
概要
模块名:
pam_issue
作者:
Ben Collins ;
维护者:
Author
提供的管理组:
Authentication (pam_sm_authenticate)
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:
网络接口:
概述
此模块在当提示输入用户名时显示发布文件(/etc/issue).
Authentication component
识别的参数:
issue=issue-file-name; noesc;
描述:
此模块允许你在提示用户输入用户名之前显示出发布信息. 默认状态下也会解析发布文件中的脱意代码,类似有些通
用的getty(\x 格式).
识别的脱意代码:
* d - 当前日期
* s - OS名称
* l - 当前tty的名字
* m - 本系统的架构(i686, sparc, powerpc, ...)
* n - 主机名
* o - 域名
* r - OS的版本发行号(例如 2.2.12)
* t - 当前时间
* u - 当前登入的用户数
* U - 类似u, 它能区分用"user" 还是 "users" (比如. "1 user" or "10 users")
* v - OS版本/构建日期(比如. "#3 Mon Aug 23 14:38:16 EDT 1999" on Linux).
以下旗标可以用来改变此模块的行为:
* issue - 替换默认发布文件
* noesc - 不解析脱意代码
范本/建议用法:
login auth pam_issue.so issue=/etc/issue
6.10 The Kerberos 4 module.
概要
模块名:
pam_krb4
作者:
Derrick J. Brashear ;
维护者:
作者.
提供的管理组:
authentication; password; session
Cryptographically sensitive:
采用相关 API
安全等级:
代码清洁度:
系统依赖:
相关库- libkrb, libdes, libcom_err, libkadm; 和一组Kerberos的头文件.
网络接口:
从网络上的Kerberos的票据中心得到Kerberos的票据授权票.
概述
此模块提供了进行Kerberos密码认证的界面, 它能从Kerberos的票据授权服务器取得票据授权票, 离线时毁掉票据, 和修
改Kerberos密码.
Session component
识别的参数:
描述:
此部件目前会设定环境变量 KRBTKFILE (虽然目前还没法export这变量), 以及当登出时删除用户的票据(要等到
login 支持 PAM_CRED_DELETE ).
范本/建议用法:
直到我们能通过Linux-PAM 改变环境.
Password component
识别的参数:
use_first_pass; try_first_pass
描述:
这部件改变用户的Kerberos密码, 它首先凭旧密码从密码修改服务得到活动钥匙, 然后发送新密码给那服务.
范本/建议用法:
仅能用于真实的real Kerberos v4 kadmind. It cannot be used with an AFS kaserver unless special
provisions are made. Contact the module author for more information.
Authentication component
识别的参数:
use_first_pass; try_first_pass
描述:
此模块通过从Kerberos服务器申请票据授权票来验证用户的Kerberos密码, 并且可选的如果本机键文件存在就从尝试
此票据中获取本机的主机键并和本机的键文件比对.
它还会把票据记录在文件以便后序使用, 并且在当离线是删除票据文件(目前还不行,除非login会呼叫
PAM_CRED_DELETE).
范本/建议用法:
此模块可以同采用MIT v4 的Kerberos服务器协同工作. 可以加以修改已使其支持AFS类型的Kerberos. 为防止密码算
法的不一致,目前还没有支持.
1. 介绍
PAM全称是可插拔身份认证模块(Pluggable Authentication Modules);
Linux-PAM (Linux下的可插入式认证模组) 是一套共享函数库,允许系统管理员来决定应用程式如何识别用户.
换句话说,就是用不着(重写和)重新编译一个(支援PAM的)程式,就可以切换它所用的认证机制. 你可以整个的升级你的证系统而不用去管应用程式本身.
Linux-PAM 给系统管理员提供了相当大的弹性来设定系统里程式的权限赋予. 由PAM控制的系统安全的本地配置可以包含
在以下两个地方: 或者是一个单一的系统文件: /etc/pam.conf; 或者是/etc/pam.d/ 目录下的文件.
2、配置文件的内容(截选一行如下):
account required pam_nologin.so
认证 控制方式 调用的模块
第一列是认证类型,可用的选项有:
accout: 执行基于用户管理的非认证行为操作。典型的,它可以限制用户的登陆时间、可用的系统资源。
auth: 这个模块提供了验证用户的两个方面。首先,它认证用户是他声称的那个人(比如用密码验证);其次,它赋予用户组成员身份或其他权限。
password: 当用户修改密码时,需要这个模块。
session: 当赋予用户某些服务之前或之后,要执行哪些操作。例如用户在访问数据时执行写日志操作。
第二列是控制方式,可用的选项有:
required: 检查结果失败,最终一定会失败,但是仍然检查后续项
requisite: 与required类似。只不过该项检查失败,立即停止后续检查项。
sufficient: 该项检查成功,立即通过,不再检查后续项。如果该项检查失败,也不意味着最终会失败。
optional: 可选
include: 包含另一个文件的内容
第三列是调用的模块,这些模块位于/lib64/security/目录下
# ls /lib64/security/
pam_access.so pam_krb5afs.so pam_sepermit.so
pam_cap.so pam_krb5.so pam_shells.so
pam_chroot.so pam_lastlog.so pam_smbpass.so
pam_ck_connector.so pam_limits.so pam_sss.so
pam_console.so pam_listfile.so pam_stress.so
... ...
3.PAM应用实例:
例一:只有wheel组的成员才可以切换成root用户
# vim /etc/pam.d/su ->打开auth required 这行的注释
以tom身份登陆,执行su –操作,即使输入正确的root密码,也不能登陆
# usermod -aG wheel tom ->把tom加入到wheel组
再次执行su –操作,tom可以切换成root用户
例二:禁止tom从tty2登陆
# vim /etc/pam.d/login ,加入下面一行
account required pam_access.so
# vim /etc/security/access.conf ,尾部增加
- : tom : tty2
例三:只允许tom用户打开两个文件
查看/etc/pam.d/system-auth中包含
session required pam_limits.so
# vim /etc/security/limits.conf ,尾部增加
tom hard nofile 2
不管是切换成为tom,还是以tom身份登陆 ,都被禁止。
例四:创建文件/etc/vsftpd/ftpgrps,该文件中的组不能访问ftp
# groupadd denyftp
# usermod -aG denyftp tom
# echo ‘denyftp’ > /etc/vsftpd/ftpgrps
# vim /etc/pam.d/vsftpd ,尾部增加
auth required pam_listfile.so item=group sense=deny file=/etc/vsftpd/ftpgrps onerr=succeed
验证,tom登陆ftp,登陆不成功,检查/var/log/secure日志
4.附上一份PAM系统管理员指南:
The Linux-PAM 系统管理员指南
作者:Andrew G. Morgan,
morgan@linux.kernel.org
翻译:孙国清(Thomas Sun),thomassun@yeah.net
DRAFT v0.71 1999/11/8 这个文档所涉的是系统管理员须知的关于Linux-PAM库的知识. 它涉及了设置PAM的正确语法并讨
论维护一个可靠系统的正确的策略.
1. 介绍
Linux-PAM (Linux下的可插入式认证模组) 是一套共享函数库,允许系统管理员来决定应用程式如何识别用户.
换句话说,就是用不着(重写和)重新编译一个(支援PAM的)程式,就可以切换它所用的认证机制. 你可以整个的升级你的证系统而不用去管应用程式本身.
传统上,当一个应用程序有身份识别的需求,它就不得不把某一种验证算法写进去. 例如,就传统的UN*X系统而言,核对使用
者身份的方法就是要求用户输入正确的密码. 这密码,除了开头的两个字符作为"salt",剩下的是加密过的(经由crypt
(3)). 接著用户被验证这个加密过的密码是否与他在密码档(就是/etc/passwd文件)中他的那笔记录的第二栏相符.在这样
的系统里,绝大部份权限的授予是基于这种单一的认证机制. 权限决定于个人的识别码(uid)和不同群组的成员.服务和程
式是否可用由个人和群组的识别码决定.传统上,群组关系经由/etc/group文件中的记录来赋予.
不幸的是,随着计算机速度的不断提高,再加上满世界的关于网路计算的介绍,使得象这样曾是安全的验证机制,变得易受攻
击了.面对这样的现实,新的验证方法正在持续的开发中.
Linux-PAM项目的目标是把赋权部分的开发以可靠的合适的鉴定模式从软件中分离出来。这目标已经通过提供一组库函数
实现了,应用程序可以用这些函数来请求验证某个用户。这个 PAM 由特定的系统文件配置,/etc/pam.conf (或者是
在/etc/pam.d/里的一系列配置文件) 以经由特定的可用的认证模组来鉴定某个用户的请求。 这些个模组通常位
于/usr/lib/security目录并且以可动态加载的目标文件的形式出现(参见 dlopen(3)).
2. 文中的说明
在继续阅读之前, 请记住本文假定提到的文件位于默认的目录。这个默认的目录我们遵循RFC(RFC-86.0,见
bibliography)中的约定。如果你正用一个支持PAM但是却选择以不同的方式发布这些文件的发布版的Linux(或是其他的
OS) (Red Hat就是这样的发布版), 那你从文章中直接拷贝例子的时候就要注意一下了.
举个例子, where it is explicit, 本文假定PAM可加载目标文件(就是 模块)位于这个目录: /usr/lib/security/. 可是
, Red Hat Linux, 为遵循Linux文件系统标准(the FSSTND),把这些文件放在/lib/security. 在使用本文的例子时请小心
的做一些转换的工作。
3. 概观
For the uninitiated,我们开始于考虑一个例子。我们来说说一个应用程序提供一些服务给用户; login 就是这样的程
序。 Login 做两件事,它首先确认提出请求的用户正是他们自己,第二步提供给他们所请求的服务: 就login而言服务
即是一个命令行外壳(command shell)(如bash,tcsh,zsh之类。)以这个用户的身份去跑。
传统上,前一个步骤通过login提示用户输入密码然后确认系统是否同意登入;接着确认(就系统而言)用户确实是提出
要求的那人。这类工作就是Linux-PAM的典型应用。
从应用程序员的角度看(在这个例子里就是写login程序的人), Linux-PAM处理认证的工作——确认用户的身份。
Linux-PAM的弹性在于,你,系统管理员有权来决定实施怎样的验证方案。你有权来设定你的系统里的任何支持PAM的应用
程序的验证方案。就是说,你可以将验证方案设计成单纯的信任>;任何人(pam_permit)到像偏执狂似的通过视网膜扫描
,声音识别和一个密码!
举例说明你所面对的弹性,考虑以下情形:系统管理员(家中的父母)希望提高他的使用者(孩子们)的算术能力。她可
以设置他们喜欢玩的“Shoot 'em up”(游戏,当然得支持PAM)通过提问小于12的一对随机数的乘积的办法来进行认证
。很明显不管游戏本身如何,他们会很快学会乘法表。等他们再大些,认证可以升级到包括多位除法!(译者:我已经准
备用这种办法来教我宝贝女儿学加减乘除了。)
Linux-PAM处理四种独立的(管理)工作。它们是: 认证管理; 帐号管理; 会话期间管理;和密码管理。 The
association of the preferred management scheme with the behavior of an application is made with entries in
the relevant Linux-PAM configuration file. 管理的功能由配置文件中指定的模块 来完成。这文件的语法在 below部
分讨论。
下面的插图描述了Linux-PAM的整个组织结构。
+----------------+
| application: X |
+----------------+ / +----------+ +================+
| authentication-[---->;--\--] Linux- |--;
如果 libpam 和 libpam_misc 不在程序所需的函数库之列,那么它将不会用PAM.
然而,这两个函数库还是可能已经包含进程序了,不过问题依然存在,因为把PAM
写死在程序不会如你期望的工作.所以一个更可靠的方法是做一下的测试:
在/etc/pam.d目录里,需要为程序设有一个配置文件.具体的文件名是写死在程序里的.
通常和程序名一样,但却不总是这样.为举例说明,假设程序名字叫"pamprog",配置文件
是/etc/pam.d/pamprog.
在/etc/pam.d/pamprog里写这两行:
auth required pam_permit.so
auth required pam_warn.so
现在试着执行pamprog. 配置文件的第一行是说所有用户都被允许. 第二行会在你的
syslog 文件(或者其它你的syslog会写的文件) 里写一个warning.
如果这测试是成功的,那么你就知道你有一个"懂"pam的程序,并且你可以开始更有趣的工作:
决定如何在你的/etc/pam.d/pamprog里堆彻PAM模块.
4. Linux-PAM的设定档
Linux-PAM 给系统管理员提供了相当大的弹性来设定系统里程式的权限赋予. 由PAM控制的系统安全的本地配置可以包含
在以下两个地方: 或者是一个单一的系统文件: /etc/pam.conf; 或者是/etc/pam.d/ 目录下的文件. 本章我们来讨论这
些文件的语法和一般的选项.
4.1 设定档的语法
请注意, 在这些文件里 Linux-PAM 特有的符号是不区分大小写的. 而模块的路径,是大小写敏感的,因为它标识的是Linux
下的文件的名字. 而任何模块参数的大小写分别由各个模块定义.
除以下的行之外,为系统管理员方便,还有两个特殊的字符: 注解由'#'开头,结束于行结束,另外,模块的描述行可以以 '\'
脱字符延续到下一行.
通常/etc/pam.conf里的每一行有以下格式:
service-name module-type control-flag module-path arguments
接下来,我们来解释每个栏位的意思.另一种(也是常被采用的)设置Linux-PAM 的方法是通过/etc/pam.d/里的文件来实现.
在我们解释完上面的那行之后, 我们就来讨论这种方法.
service-name
这笔记录相关的服务名称.通常这服务名称是特定应用程序的名字.比如, `ftpd', `rlogind' 和 `su' 这些. .
有一个保留的服务名称,它是用来定义默认的认证机制的. 它就是`OTHER',大小写无关.注意,当已经有为指定服务定
义了模块,那么 `OTHER' 记录会被忽略.
module-type
模块的四种(目前是)类型.这四种类型是:
* auth; 这种模块类型确定有关用户认证的两方面. 第一,它确认用户就是他们自己,这通过指示应用程序提示用
户输入密码或者其它证实身份的方法.第二,这类模块会赋予成员资格 Secondly, the module can grant group
membership (independently of the /etc/groups file discussed above) or other privileges through its
credential granting properties.
* account; 这些模块处理非认证级的帐号管理. 典型的用法是基于一天的不同时间段来限制/允许访问某服务,
当前可用的系统资源 (最大用户数)或者限制特定用户---'root只能从控制台登录.
* session; 首先, 这类模块和一系列动作有关,指在用户得到/失去服务时要做的事. 这包括记录用户的登录/登
出,挂载必须的目录等等.
* password; 这最后一种类型在更新用户的认证标志时需要. 通常,各个基于"质问/回答"(译注:指传统的用户名
/密码的认证方法)的认证方法(auth)有一个对应的此模块.
control-flag
控制符用来指示当某一模块返回成功或失败时PAM如何动作. 既然模块可以被堆叠 (同种类型的模块按先后顺序执行,
一个接一个), 控制符决定每个模块的重要程度.应用程序不会直接接收'/etc/pam.conf' 里列出的每一个模块的成功或失
败的结果. 相应的是,它只从Linux-PAM接收一个 成功 或 失败 的结论. 这些模块的执行顺序就是它们在 /etc/pam.conf
里的记录的顺序;排在前面的记录在排在后的记录之前被执行. 在Linux-PAM 0.60版本里, 这个control-flag 可以有两种
语法来定义.
简单一些(也是过去的)语法是用一个限定词指示相关模块的重要程度. 有四个关键字: required, requisite,
sufficient 和 optional.
Linux-PAM 将这四个关键字解释为:
* required; 需要的,这表明此模块返回成功值对于整个module-type的成功是必要的. 此模块的返回失败并不会
传回给用户直到剩下的模块(同样module-type)都执行过.
* requisite; 必要的,类似 required, 只不过, 当这类模块返回失败时,整个控制会立刻回到应用程序. 返回值
同第一个 需要的 或 必要的模块返回的失败. 注意,这标志可以用来防止 required or requisite module to fail.
Note, this flag can be used to protect against the possibility of a user getting the opportunity to enter
a password over an unsafe medium. It is conceivable that such behavior might inform an attacker of valid
accounts on a system. This possibility should be weighed against the not insignificant concerns of
exposing a sensitive password in a hostile environment.
* sufficient; 充分的,这模块返回的成功会被认为已经 充分满足Linux-PAM 库确认这类模块(module-type)是
成功的条件. 如果没有先前的requisite 模块返回了失败,那么不再会有其它'堆叠' 的模块被呼叫. (注意, 这种情况下,
随后的requisite 模块就不会 被呼叫.). 这模块返回的失败不会看作是致命的错误而至影响应用程序从这module-type
得到成功的结果.
* optional; 可选的,正如这名字一样,此?control-flag 致使模块对最终的成功或失败的结果不会产生决定性的
影响. 一般,Linux-PAM 在确定整个模块堆成功活失败时忽略这模块. 然而, 当从之前或后续的模块得不到明确的成功或
失败的结果时,这模块将决定返回给应用程序的状态. 后种情况会出现在比如当其它模块返回PAM_IGNORE 时.
更复杂(新)的语法则更明确,使管理员有更多的控制用户认证的空间. 这种控制符以方括号包含,由一系列的
value=action 对组成:
[value1=action1 value2=action2 ...]
这里的 valueI 有以下值 return values: success; open_err; symbol_err; service_err; system_err; buf_err;
perm_denied; auth_err; cred_insufficient; authinfo_unavail; user_unknown; maxtries; new_authtok_reqd;
acct_expired; session_err; cred_unavail; cred_expired; cred_err; no_module_data; conv_err; authtok_err;
authtok_recover_err; authtok_lock_busy; authtok_disable_aging; try_again; ignore; abort; authtok_expired;
module_unknown; bad_item; conv_again; incomplete; 和 default. 最后的 (default) 被用来定义当没有明确定义时
的默认动作.
actionI 可以是一个正数或者是以下标识: ignore; ok; done; bad; die; 和 reset. 当以一个正数J 作为action
时,它的作用是指示以下J个模块将被跳过. 通过这种手段, 管理员可以开发出适度复杂的模块堆叠,它以许多不同的路径
执行. 至于以何种路径则决定于某个模块的反应.
* ignore - 此类模块的返回状态将不会影响应用程序所得到的返回值.
* bad - 这表示相应的返回值将被认为是模块失败. 如果此模块是堆叠中的第一个失败的模块, 它的状态值将作
为整个堆叠的状态.
* die - 和 bad 相同,不过会终止整个模块堆叠,PAM立即返回到应用程序.
* ok - 这告诉PAM 管理员要让此返回值直接作用于整个模块堆叠的返回. 换句话说, 如果堆叠的原先状态会导
致返回 PAM_SUCCESS, 这模块的返回值将会覆盖这结果. 请注意:如果堆叠的原先状态保存着一些意为模块失败的值,
这'ok'将不会用来覆盖那样的值.
* done - 和 ok 一样, 不过会终止整个模块堆叠, PAM立即返回到应用程序.
* reset - 清除储存模块堆叠状态的内存并且重新开始下一组堆叠.
来体会一下这种新语法的强大之处, 从 Linux-PAM-0.63起, 客户插件代理的概念被引进. 这多少使PAM支援从C/S应
用程序固有的传输协议进行机器-机器的认证成为可能.(?) 通过 ``[ ... value=action ... ]'' 的语法, 使应用程序对
支援binary prompt?的客户端采用binary prompt?, 而对旧有的客户端则向后兼容的采用另一种认证模式. 够灵活吧?
module-path
是可动态加载目标文件的路径; 也即可插入式模块 本身. 如果路径的首字符是 `/', 那它被作为一个完整路径. 如
果不是这样, 那模块的路径则会加上默认的模块路径: /usr/lib/security (见 above).
args
args 是一组传给模块的参数. 类似一般Linux的指令的参数. 通常, 合法的参数是可选的并且是模块特有的. 无效的
参数会被模块忽略, 可是, 当抓到一个无效参数, 模块被要求写一个错误信息到 syslog(3). 下一节有一个一般 选项的
列表.
设定档里如果有任一行有格式错误, 那通常会导致认证流程失败. 相应的错误信息会通过呼叫syslog(3)写入系统日志.
4.2 基于目录的设定
从0.56版开始有比单个配置文件更灵活的做法, 可以通过/etc/pam.d/里的文件来配置libpam. 这种方法,/etc/pam.d/里
的文件名和服务名(service-name)相同(小写): 这是各服务的个性化设置档.
Linux-PAM 可以编译成两种模式之一. 首选的模式是使用/etc/pam.d/ 或/etc/pam.conf设定,但不是同时两者皆可.也就
是说, 如果; 那我先在还能做些什么苦差呀?
好,不要惊慌. 你首先要认识到的是这种事情会发生在50%的从未碰过PAM的用户身上.
这已经不止发生一两次了,每次都不一样,但是最终,每次解决方法总是一样的.
首先,我希望你设定了LILO的延时.如果是的,重开机,按下shift或者tab或其它什么键,
然后输入:
LILO boot: linux single
(把 'linux' 替换成你的linux启动字串).
这会把你带进系统而不用登入. 想知道从控制台破掉一台Linux主机是多容的事?
现在知道了吧.
如果没法那样做,那你就要一个启动软盘和一个根文件系统盘象slachware的rescue.gz.
(Red Hat的安装盘有这样的模式.)
总之,重点是要进入到root提示符.
然后, 我假设你还没有完全打烂你的PAM安装包 - 仅仅是破坏了设定档.
这里是重新设定PAM的步骤:
cd /etc
mv pam.conf pam.conf.orig
mv pam.d pam.d.orig
mkdir pam.d
cd pam.d
然后用vi在这目录下创建一个叫"other"的文件.包含下面四行:
auth required pam_unix_auth.so
account required pam_unix_acct.so
password required pam_unix_passwd.so
session required pam_unix_session.so
现在你有了PAM的最简单的设置了, 这象你以前用的方式一样工作.
所有的事情又魔法似的能运作了.
来试着按ALT-F2从另一控制台登入. 如果无法登入, 你就有了大麻烦了,或者打错了什么.
奇怪的是如果你在设定档里输错了东西, 你不会从控制台得到任何错误 - 错误只会记录
在日志档里. 所以看看那儿!(tail /var/log/messages.)
从现在起你可以回头做实际设定, 但愿这首次经历没把你搞懵了. :/
一些要点 (to make everything "right" with Red Hat...):
从RedHat安装目录安装最新的pam, pamconfig, and pwdb , 下一个指令
rpm -Uvh [或需要加上 --force too] pam-* pamconfig-* pwdb-*
然后确认你安装(或重装)了最新版的libc, util-linux, wuftp, 和 NetKit. 或许
还有相关的x应用程序, 像xlock,但我还从没有用过.(注:这篇文章写的比较早,那时候
X程序很少)
5.2 防止采用一个脆弱的"other"设定.
拥有一个脆弱的默认设定(OTHER)是件坏事. OTHER是所有面向PAM的程序的默认设定,如果它很脆弱, 你的系统就有可能变
得易受攻击.
这里有个"other"设定的例子.pam_deny 模块会拒绝所有访问同时pam_warn模块会在在系统日志里记下auth.notice:
#
# The PAM configuration file for the `other' service
#
auth required pam_deny.so
auth required pam_warn.so
account required pam_deny.so
account required pam_warn.so
password required pam_deny.so
password required pam_warn.so
session required pam_deny.so
session required pam_warn.so
6. 可用模块的参考指南
以下是目前Linux-PAM可用的各种模块的具体说明. 通常这些模块可以自由使用. 除非特别指出.
在拷贝下面的例子时也请注意 on text conventions above里的备注.
6.1 access 模块
概要
模块名:
pam_access
作者:
Alexei Nogin ;
维护者:
作者
提供的管理组:
account
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:
需要一个设定档:/etc/security/access.conf
网络接口:
如果设定了就通过PAM_TTY , 否则尝试呼叫ttyname()从标准输入文件描述符得到tty名字.标准的 gethostname(),
yp_get_default_domain(), gethostbyname() 呼叫. NIS 用来提供网络用户组的支持.
概述
提供logdaimon(?)类型的登录访问控制.
Account component
识别的参数:
描述:
这模块提供基于登录名称和主机(或域名),internet地址(或网络数),或者非网络登录的终端名字的录访问控制.诊断
信息通过syslog(3)记录. 来自Wietse Venema的logdaemon-5.6里的login_access.c经过A. Nogin修改后采用.
例子/建议用法:
推荐使用. 例如,在管理像NIS服务器和邮件服务器时, 你需要有一些活动的帐号, 但却不想所有这些帐号都有登录的
权限.
对于/etc/pam.d类型的设定方式,你的模块放在/lib/security里, 把下面一行加在 /etc/pam.d/login,
/etc/pam.d/rlogin, /etc/pam.d/rsh 和 /etc/pam.d/ftp前面:
account required /lib/security/pam_access.so
注意, 除非你的系统忽略.rhosts, 否则这模块不会产生作用. 见pam_rhosts_auth的文档.
在发布包里包含有一个 access.conf 的样本.
6.2 Chroot
概要
模块名:
pam_chroot
作者:
Bruce Campbell ;
维护者:
Author; proposed on 20/11/96 - email for status
提供的管理组:
account; session; authentication
Cryptographically sensitive:
安全等级:
代码清洁度:
Unwritten.
系统依赖:
网络接口:
要求是 localhost.
概述
这模块的目的是对一般用户进行透明的包裹, 这可以把他们置于一个伪装的文件系统 (比如, 他们的'/' 实际上是
/some/where/else).
如果你有几个不同类的用户, 并且你对于安全性有一点点偏执, 那这模块将非常有用. 这可以用来限制哪些用户能看到什
么, 并且限制他们只能执行哪些程序.
Account component:
Need more info here.
Authentication component:
Need more info here.
Session component:
Need more info here.
识别的参数:
Arguments and logging levels for the PAM version are being worked on.
描述:
范例/建议用法:
提供一组合理的程序 - 仅放入 'cat', 'ls', 'rm', 'cp' 和 'ed' 有点...
不要太极端 (比如, 你可以为每个用户设定各自分开的环境, 但这样会太浪费磁盘空间.)
6.3 Cracklib 可插入的密码强度检查程序
概要
模块名:
pam_cracklib
作者:
Cristian Gafton ;
维护者:
作者.
提供的管理组:
password
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:
需要系统库 libcrack 和系统字典: /var/cache/cracklib/cracklib_dict.
网络接口:
概述
这模块可以插入给定程序的password堆叠来提供密码的强度检验.
这模块以以下流程运行: 它首先呼叫Cracklib例程来检查密码的强度; 如果Cracklib认可, 那么模块会经行额外一些检查
. 这包括:
* Palindrome - 新密码是否为旧密码的回文?
* Case Change Only - 新密码是否只是拿旧密码改了些大小写?
* Similar - 新密码是否太像旧密码? 这由一个参数控制, difok 这是新旧密码的相差字符能被接受的最小个数, 模
式是10个或者新密码的1/2长, 二者取小的那个.
* Simple - 新密码是否太简单? 这由五个参数控制: minlen, dcredit, ucredit, lcredit 和 ocredit. 这些参数
如何生效以及默认值是什么见参数一节.
* Rotated - 新密码是否为旧密码的轮转?
* Already used - 密码是否曾经用过? 先前用过的密码保存在/etc/security/opasswd里.
不带参数的配置这模块可以很好的工作在标准的unix密码加密环境. 对于MD5加密, 密码可以长于8个字符,那么这模块的
默认设定就使用户选择一个满意的密码变得困难了. 显然, 对于新密码不能包含多于一半的旧密码的字符的要求就成了一
个不一般的限制了. 比如, 旧密码"the quick brow fox jumped over the lazy dogs" 将难于更改... 此外, 默认设定
允许密码短至5个字符. 对于采用md5加密算法的系统, 加大允许的最短密码长度会是个好主意. One can then allow
more credit for different kinds of characters but accept that the new password may share most of these
characters with the old password.
Password component
识别的参数:
debug; type=XXX; retry=N; difok=N; minlen=N; dcredit=N; ucredit=N; lcredit=N; ocredit=N;
描述:
这部件的动作是提示用户输入密码然后通过比对系统字典和一连串规则来检查它的强度以识别出差劲的选择.
默认动作是提示用户输入一个密码, 检查强度, 然后, 如果通过检查, 提示第二次输入密码 (用来检验第一次的输入
是正确的). 这之后, 密码被当作新的认证标识传送给随后的安装的模块.
默认的动作可以用一些参数改成许多不同的方式:
* debug - 这选项令此模块写入信息到syslog(3)以显示此模块的现为(此选项不会 把密码信息写入日志档).
* type=XXX - 提示用户输入密码的默认提示符是: ``New UNIX password: '' 和 ``Retype UNIX password:
''. 用此参数可以把 "UNIX" 替换成 XXX.
* retry=N - 本模组要求新密码(用来检查强度)的默认次数是1次. 用这参数可以增加到N次.
* difok=N - 这参数会改变允许新旧密码的字符差异为至少10个这样的默认值. 此外, 如果有一半的字符不同,
新密码就会被采用.
* minlen=N - 可接受的最短的密码长度+1. 此外对于新密码的长度, 对于每个不同种的字符 (其它,大写,小写
和 数字),会得到"加分" (长度+1). 此参数的默认值是9, 这对于旧的UNIX密码体系已经够了, 但是对于利用md5的额外安
全性或许太小了. 注意, Cracklib本身有一对长度的限制: 4, 写死在程序里的"路太短"的限制;6,定意的限制.这两个限
制会不经过参考minlen 而被检查出来. 如果你要允许密码长度短至5, 你要么不要使用此模块要么重新编译crack库并重
新编译此模块.
* dcredit=N - 这是对于新密码因包含数字而得到"加分"的限制. 如果你有小于或等于N个数字, 每个数字将会
对整个长度+1来迎合当前minlen 的值. dcredit的默认是1, 对于小于10的minlen 推荐此值.
* ucredit=N - 这是对于新密码因包含大写字符而得到"加分"的限制. 如果你有小于或等于N个大写字符, 每个
大写字符将会对整个长度+1来迎合当前minlen 的值. ucredit的默认是1, 对于小于10的minlen 推荐此值.
* lcredit=N - 这是对于新密码因包含小写字符而得到"加分"的限制. 如果你有小于或等于N个小写字符, 每个
小写字符将会对整个长度+1来迎合当前minlen 的值. lcredit的默认是1, 对于小于10的minlen 推荐此值.
* ocredit=N - 这是对于新密码因包含其它字符而得到"加分"的限制. 如果你有小于或等于N个其它字符, 每个
其它字符将会对整个长度+1来迎合当前minlen 的值. ocredit的默认是1, 对于小于10的minlen 推荐此值.
范例/建议用法:
为举例说明如何使用此模块, 我们列出如何将此模块和pam_unix 部件堆叠:
#
# 下面两行堆叠了两个password类型的模块. 在这例子里, 用户有3次机会输入健壮的密码.
# "use_authok"参数确保pam_unix模块不再另外提示输入密码,
# 而是采用由pam_cracklib提供的密码.
#
passwd password required pam_cracklib.so retry=3
passwd password required pam_unix.so use_authtok
另外一个例子(以/etc/pam.d/passwd的格式)是用md5密码加密的情形:
#%PAM-1.0
#
# 下面两行采用MD5系统, 密码长度最少14+出现数字的最多2个"加分"+
# 出现其它字符的最多2个"加分", 并且至少有3个字符没有出现在旧密码中.
#
password required pam_cracklib.so \
difok=3 minlen=15 dcredit= 2 ocredit=2
password required pam_unix.so use_authtok nullok md5
6.4 死锁模块
概要
模块名:
pam_deny
作者:
Andrew G. Morgan ;
维护者:
current Linux-PAM maintainer
提供的管理组:
account; authentication; password; session
Cryptographically sensitive:
安全等级:
代码清洁度:
清洁的.
系统依赖:
网络接口:
概述
这模块用来拒绝访问. 它永远透过PAM架构告知程序失败. 正如概述 above里提到的, 这模块适合用在默认(OTHER)条目.
Account component
识别的参数:
描述:
这部件除了返回失败外不做任何动作, 返回类型是 PAM_ACCT_EXPIRED.
范例/建议用法:
把这模块堆叠在account 里将会阻止用户通过应用程序(引用Linux-PAM的帐户管理函数pam_acct_mgmt())获取访问.
下面的例子使登入变得不可能:
#
# add this line to your other login entries to disable all accounts
#
login account required pam_deny.so
Authentication component
识别的参数:
描述:
这部件除了返回失败什么也不做, 当pam_authenticate()被呼叫(当应用程式试图认证用户时)时返回值是
PAM_AUTH_ERR; 当pam_setcred()被呼叫(当建立连接并设置用户证书时 -- 在具体实现中这函数不太可能被呼叫)时返回
PAM_CRED_UNAVAIL .
范本/建议用法:
为拒绝默认程序的访问, 在你的Linux-PAM里包含下面一行:
#
# add this line to your existing OTHER entries to prevent
# authentication succeeding with default applications.
#
OTHER auth required pam_deny.so
Password component
识别的参数:
描述:
模块的这部件会阻止用户有机会修改密码. 它总是返回PAM_AUTHOK_ERR.
范本/建议用法:
这模块可以用来阻止应用程序更新申请者的密码. 比如, 为阻止login 在用户的旧密码过期后自动提示输入新密码,
应该把下面一行放在你的设定档里:
#
# add this line to your other login entries to prevent the login
# application from being able to change the user's password.
#
login password required pam_deny.so
Session component
识别的参数:
描述:
模块的这一方面会阻止应用程序在主机上开启会话.
范本/建议用法:
和其它的session模块一起工作, 那模块也许显示一下"当日消息". 这模块可以用来阻止用户开启shell. 如有
pam_motd在先, 我们或可用下面的设置来阻止用户登录并提示用户现在是系统维护时间:
#
# An example to see how to configure login to refuse the user a
# session (politely)
#
login session required pam_motd.so \
file=/etc/system_time
login session required pam_deny.so
6.5 Set/unset 环境变量
概要
模块名:
pam_env
作者:
Dave Kinchlea ;
维护者:
Author
提供的管理组:
Authentication (setcred)
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:
/etc/security/pam_env.conf
网络接口:
概述
这模块允许(取消)设定环境变量. Supported is the use of previously set environment variables as well as
PAM_ITEMs such as PAM_RHOST.
Authentication component
识别的参数:
debug; conffile=configuration-file-name; envfile=/env-file-name; readenv=/0|1
描述:
这模块允许你(取消)设定任意的环境变量为固定字串, 先前的环境参数和/或PAM_ITEM.
通过设定档(默认是,/etc/security/pam_env.conf, 但是可由connfile 参数改变) 进行所有的控制. 每行由变量名
开始, 每个变量有两个可选项: DEFAULT和OVERRIDE. DEFAULT 用来设定变量的默认值, 如果没有指定默认值则设为空字
串. OVERRIDE 告诉pam_env如果变量以设定就覆盖(覆盖" "默认值). 如果未设定OVERRIDE, 则假定为""并且不会覆盖其
它值.
VARIABLE [DEFAULT=[value]] [OVERRIDE=[value]]
(也许不存在的)环境变量可以指定值为${string} 并且(也许不存在的)PAM_ITEM 可以用来指定值:&{string} .
$和& 可以由反斜线脱意为一般字符 (成为\$本生). 双引号可以用来封装有空格的值 (但是不可以用作变量名)必须
整个被引号包含并且里面不应该有引号或者脱意的引号.
这模块还可以解析包含单纯的每行是键=值格式的文件(默认是/etc/environment). 可以用 envfile 旗标设定默认文
件并且可以设定readenv 旗标为1或0来决定是否启用这选项.
这模块的行为可以由以下旗标来更改: flags:
* debug - 往syslog(3)写更多的信息.
* conffile=filename - 默认的设定档是/etc/security/pam_env.conf. 这选项可以覆盖此默认. 必须提供完整
的文件名,目录+文件名.
* envfile=filename - 默认从/etc/environment 里读键=值对来设定变量. 这选项覆盖默认文件. 必须提供完
整的文件名,目录+文件名.
* readenv=0|1 - 打开或关闭读取envfile指定的文件(0=关闭,1=开启). 默认是开启.
范本/建议用法:
更多的用法见pam_env.conf .
6.6 filter 模块
概要
模块名:
pam_filter
作者:
Andrew G. Morgan ;
维护者:
作者.
提供的管理组:
account; authentication; password; session
Cryptographically sensitive:
Not yet.
安全等级:
代码清洁度:
在Linux系统下可以干净的被编译.
系统依赖:
需要安装filters .
网络接口:
概述
这模块用来提供给类似ttysnoop(需要一些参考)的程序一个可选的插件. 因为还没有为这功能所写的插件出现, 这模块目
前只是个玩具. 提供给这模块的唯一一个插件仅是对输入输出流做大小写转换. (这会变得非常讨厌并对基于termcap的编
辑器不太友好)
Account+Authentication+Password+Session components
识别的参数:
debug; new_term; non_term; runX
描述:
每个组建都有呼叫过滤器的能力. 过滤器总是以所属应用程序的权限被execv(2) 而 不是 以用户的权限. 因此这些
过滤器并不总能被用户不经关掉相关会话而杀掉.
这模块的行为会被传给它的参数相当程度的左右:
* debug - 这选项增加模块被执行时写进syslog(3)的信息量.
* new_term - 过滤器的默认动作是会设定PAM_TTY 为用户连上应用程序时所用的终端代号. 此参数指示过滤器
可以设定PAM_TTY 为一个过滤了的伪终端.
* non_term - 不要试图设定PAM_TTY .
* runX - 模块必须得知道何时呼叫过滤器. 这参数告知过滤器何时被呼叫, 参数后面是各自的过滤器的完整路
径和过滤器执行时的参数.
X 所允许的值是 1 和 2. 这指示过滤器执行的确切时间. 阅读 Linux-PAM的模块开发指南会对解释此观念有
所帮助. 基本上, 针对每个管理组都有多至两个呼叫此模块的函数.
在 authentication 和 session 部件里, 实际上有两个不同的函数. 对于authentication, 这两个函数是
_authenticate 和_setcred -- 此时 run1 意味着在呼叫_authenticate时执行过滤器而run2 意味着呼叫_setcred时运行
过滤器. 对于session来说, run1 意指在_open_session 阶段运行过滤器, run2 在 _close_session 作用.
对于account部件. run1 和 run2 的任何一个被运行.
对于password部件, run1 用来指示当_chauthtok第一次被执行(PAM_PRELIM_CHECK阶段)时呼叫过滤器,run2
指示第二次时(tt/PAM_UPDATE_AUTHTOK/阶段)时呼叫.
范本/建议用法:
在写作本时, 这模块鲜有实际应用. 如兴趣所致, 你可以试着把下面几行加入你的login的设定.
#
# An example to see how to configure login to transpose upper and
# lower case letters once the user has logged in(!)
#
login session required pam_filter.so \
run1 /usr/sbin/pam_filter/upperLOWER
6.7 匿名访问模块
概要
模块名:
pam_ftp.so
作者:
Andrew G. Morgan ;
维护者:
作者.
提供的管理组:
authentication
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:
网络接口:
提示用户输入email地址; 易受欺骗的.(XXX - 需要加工)
概述
此模块的意图是提供一个可插入式的匿名ftp访问模式. mode of access.
Authentication component
识别的参数:
debug; users=XXX,YYY,...; ignore
描述:
此模块会拦截用户名和密码. 如果用户名是 ``ftp'' 或 ``anonymous'', 用户的密码以
[email='@']'@'[/email]
为分隔符被分解成
PAM_RUSER 和 PAM_RHOST 两部分; these pam-items being set accordingly. The username is set to ``ftp''. In
this case the module succeeds. Alternatively, the module sets the PAM_AUTHTOK item with the entered
password and fails.
此模块的行为可以有以下旗标修改:
* debug - 往syslog(3) 写更多的信息.
* users=XXX,YYY,... - 替代 ``ftp'' 或 ``anonymous'', 提供给以逗号分开的用户以匿名访问;
``XXX,YYY,...''. 申请人可以输入这些用户名之一, 返回的用户名设定为列表中的第一个用户;``XXX''.
* ignore - 不关心用户的email地址(如果提供).
范本/建议用法:
见 above.
6.8 群组访问模块
概要
模块名:
pam_group
作者:
Andrew G. Morgan ;
维护者:
作者.
提供的管理组:
authentication
Cryptographically sensitive:
安全等级:
对于针对setgid状态的文件可访问性敏感.
代码清洁度:
系统依赖:
需要/etc/security/group.conf 文件. 可被编译成带有或不带libpwdb.
网络接口:
仅通过正确的PAM_TTY 项.
概述
此模块提供基于用户名以及他们从哪个终端请求服务的群组设定. It takes note of the time of day.
Authentication component
识别的参数:
描述:
此模块不用于认证用户, 而是用来赋予用户组的身份(在认证模块的凭证设定阶段). 这些组身份基于他们请求的服务
. 组身份列在/etc/security/group.conf .
范本/建议用法:
为使这模块正常运作,必需先要有格式正确的/etc/security/groups.conf . 此文件的格式如下.组身份基于服务应用
程序满足此设定档的任意行来赋予. 没一行有如下格式(注解以`#'开头):
services ; ttys ; users ; times ; groups
前四个栏位和pam_time的etc/security/pam_time.conf语法相同, 最后的栏位, groups, 是以逗号(或者空格)分开的
一个组的列表. 如果用户的应用程序满足前四个栏位, 用户就被赋予列表中的组身份.
通常, 这模块对于分配用户特有的文件访问权限有帮助. 问题是一旦用户得到了组身份, 他就可以创建一个setgid
的属于某群组的程序. 这之后, 当用户不再是这个组的成员时, 他们可以通过这程序获取组身份. 之所以用户访问的文件
系统如此重要, 是一旦文件系统被加载为nosuid时, 这样的程序就无法执行. 为使这模块提供任何级别的安全性, 用户能
有写权限的所有文件系统都应该被加载成nosuid模式.
pam_group 模块的功能和/etc/group平行. 如果用户已被此模块赋予了任何组身份, 他还另外被赋予/etc/group里的
相关组身份.
6.9 Add issue file to user prompt
概要
模块名:
pam_issue
作者:
Ben Collins ;
维护者:
Author
提供的管理组:
Authentication (pam_sm_authenticate)
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:
网络接口:
概述
此模块在当提示输入用户名时显示发布文件(/etc/issue).
Authentication component
识别的参数:
issue=issue-file-name; noesc;
描述:
此模块允许你在提示用户输入用户名之前显示出发布信息. 默认状态下也会解析发布文件中的脱意代码,类似有些通
用的getty(\x 格式).
识别的脱意代码:
* d - 当前日期
* s - OS名称
* l - 当前tty的名字
* m - 本系统的架构(i686, sparc, powerpc, ...)
* n - 主机名
* o - 域名
* r - OS的版本发行号(例如 2.2.12)
* t - 当前时间
* u - 当前登入的用户数
* U - 类似u, 它能区分用"user" 还是 "users" (比如. "1 user" or "10 users")
* v - OS版本/构建日期(比如. "#3 Mon Aug 23 14:38:16 EDT 1999" on Linux).
以下旗标可以用来改变此模块的行为:
* issue - 替换默认发布文件
* noesc - 不解析脱意代码
范本/建议用法:
login auth pam_issue.so issue=/etc/issue
6.10 The Kerberos 4 module.
概要
模块名:
pam_krb4
作者:
Derrick J. Brashear ;
维护者:
作者.
提供的管理组:
authentication; password; session
Cryptographically sensitive:
采用相关 API
安全等级:
代码清洁度:
系统依赖:
相关库- libkrb, libdes, libcom_err, libkadm; 和一组Kerberos的头文件.
网络接口:
从网络上的Kerberos的票据中心得到Kerberos的票据授权票.
概述
此模块提供了进行Kerberos密码认证的界面, 它能从Kerberos的票据授权服务器取得票据授权票, 离线时毁掉票据, 和修
改Kerberos密码.
Session component
识别的参数:
描述:
此部件目前会设定环境变量 KRBTKFILE (虽然目前还没法export这变量), 以及当登出时删除用户的票据(要等到
login 支持 PAM_CRED_DELETE ).
范本/建议用法:
直到我们能通过Linux-PAM 改变环境.
Password component
识别的参数:
use_first_pass; try_first_pass
描述:
这部件改变用户的Kerberos密码, 它首先凭旧密码从密码修改服务得到活动钥匙, 然后发送新密码给那服务.
范本/建议用法:
仅能用于真实的real Kerberos v4 kadmind. It cannot be used with an AFS kaserver unless special
provisions are made. Contact the module author for more information.
Authentication component
识别的参数:
use_first_pass; try_first_pass
描述:
此模块通过从Kerberos服务器申请票据授权票来验证用户的Kerberos密码, 并且可选的如果本机键文件存在就从尝试
此票据中获取本机的主机键并和本机的键文件比对.
它还会把票据记录在文件以便后序使用, 并且在当离线是删除票据文件(目前还不行,除非login会呼叫
PAM_CRED_DELETE).
范本/建议用法:
此模块可以同采用MIT v4 的Kerberos服务器协同工作. 可以加以修改已使其支持AFS类型的Kerberos. 为防止密码算
法的不一致,目前还没有支持.
本文转自Jx战壕 51CTO博客,原文链接:http://blog.51cto.com/xujpxm/1403232,如需转载请自行联系原作者