Linux-PAM(Linux下的密碼認證和安全机制)系統管理員指南(中文版)

时间:2022-12-02 14:59:28
he 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-   |--<--| PAM config file|
         |       +        [----<--/--]        PAM    |     |================|
         |[conversation()][--+    \  |          |     | X auth .. a.so |
         +----------------+  |    /  +-n--n-----+     | X auth .. b.so |
         |                |  |       __|  |           |           _____/
         |  service user  |  A      |     |           |____,-----' 
         |                |  |      V     A                        
         +----------------+  +------|-----|---------+ -----+------+
                                +---u-----u----+    |      |      |
                                |   auth....   |--[ a ]--[ b ]--[ c ]
                                +--------------+
                                |   acct....   |--[ b ]--[ d ]
                                +--------------+
                                |   password   |--[ b ]--[ c ]
                                +--------------+
                                |   session    |--[ e ]--[ c ]
                                +--------------+

By way of explanation, 图的左边表示一个应用程序:X. 这应用程序有和Linux-PAM 库的接口并且在认证方面没有什么特别之处. Linux-PAM 函数库 (图的中部) 查询PAM配置文件的内容并且装入适用于程序 X 的模块. 这些模块进入四个管理组( 图的中下部)中的一个,并且以它们出现在配置文件中的顺序堆叠起来 . 这些模组由Linux-PAM呼叫后,为应用程序执行不同的认证工作 . 需要用户提供或提供给用户的文本信息,可以通过使用应用程序提供的conversation函数来交换.

3.1 Getting started

以下段落由Seth Chaiklin供稿:

到现在为止,我们描述了PAM如何工作在一个理想世界里,
在这儿所有应用程序都被正确编写.
然而,到此时(1998年10月), 这距离现实还太远.
因此,在你试图把PAM用于你的系统时,还得考虑一些实际因素.

Why bother, is it really worth all the trouble?

如果你运行Linux作为单用户系统, 或者在一个所由用户都可信任的环境, 那么用PAM就没什么实际优势.

Ed: 事实上还是有一个好处, 你可以令认证变哑, 就象没有任何认证....像Win95.

在网络环境里, 很显然,关于用户你必需多想点, it is clear that you need to think a little more about how users etc., are authenticated:]

如果运行Linux作为服务器, 提供一些不同的服务 (e.g., 经由密码控制的WWW区域限制, PPP), 
那PAM就有一些实际的和有趣的价值. 尤其是, 通过使用使用模块, PAM 能够使
一个程序经过几个不同的密码库来查找, 哪怕那个程序没有专为那密码库写的代码. 
下面有一些例子Here are some examples of the possibilities
that this enables.

o  Apache 有一个模块提供PAM服务.  认证特定的目录权限可以让PAM来控制, 
      这意味着,所有PAM能调用的模块都可以被Apache使用,包括RADIUS,NIS,NCP
      (NCP用来经由Novell的密码库认证).

o  pppd 有一个PAM化了的版本(来自 RedHat)  现在有可能用一系列的数据库来验证
      ppp用户. 作为对基于Linux的密码库(/etc/passwd,/etc/shadow)的扩充, 你可以
      用PAM模块来进行基于Novell密码库或NT(NTLM)密码库的认证.

o  以上两则例子可以有组合应用.想象一下你办公室/部门的用户已经经过用户名/密码
      认证登入Novell或NT.如果你想要他在Linux下的应用也用相同的用户名/密码
      (为PPP登入,web服务,或者只是普通的shell登入),你可以通过PAM进行基于这些已
      存在的数据库(译者注:Novell的或者NT的)的用户认证,而无须在Linux和LAN服务器里
      各自维护独立的数据库.

我可以让所有需要有用户认证的程序都来用PAM吗?

有的可以,有的不行.可以的是那些你能得到源代码,并且可以加入适当的PAM函数的程序.
不行的是那些你无法得到源代码,并且可执行程序没有加入PAM的功能.

也就是说, 如果一个程序打算要用PAM,那么它必须在程序里直接的包含PAM函数.
不这样做就不可能用PAM.

我怎么知道程序是否已经含有PAM的代码了呢?

一个快速的(但不总是可靠)的方法是执行ldd <程序>;
如果 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; 可选的,正如这名字一样,此

Linux-PAM(Linux下的密碼認證和安全机制)系統管理員指南(中文版)

Part 2:
议用法:

对于su的传统的用法是允许superuser不经输入密码的变更为其它次要的用户的身份. 为在Linux-PAM里实现这种行为, 下面两行需要加入设定档:

#
# su authentication. Root is granted access by default.
#
su      auth     sufficient     pam_rootok.so
su      auth     required       pam_unix_auth.so

注意. 对于以superuser执行(或者在系统开机时被开启)的程序, 应该不要用此模块去认证用户.

6.23 The securetty module
概要

模块名:

pam_securetty
作者:

Elliot Lee <sopwith@cuc.edu>;
维护者:

Red Hat Software:
    currently Michael K. Johnson <johnsonm@redhat.com>;
    (if unavailable, contact Elliot Lee <sopwith@cuc.edu>Linux-PAM(Linux下的密碼認證和安全机制)系統管理員指南(中文版).
提供的管理组:

authentication
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:

/etc/securetty file
网络接口:

为使此有意义的, 需要应用程序设定正确的PAM_TTY.

概述

提供标准的UNIX的安全的tty的认证.
Authentication component

识别的参数:
描述:

提供标准的Unix安全tty的检查, 除非PAM_TTY的值列在 /etc/securetty里, 对root的认证将会失败. 对所有其他用户, 则为成功.
范本/建议用法:

规范的用法, 这模块应该作为required的认证方法出现在任何 sufficient 的认证之前.

6.24 Time control
概要

模块名:

pam_time
作者:

Andrew G. Morgan <morgan@parc.power.net>;
维护者:

Author
提供的管理组:

account
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:

需要一个设定档:/etc/security/time.conf
网络接口:

仅通过PAM_TTY

概述

运行一个规范得很好的系统偶尔也会包含对特定服务的有选择的限制访问. 此模块提供了对系统服务的时间上的访问控制. 它的行为由一个设定档决定. 此模块可以设定成基于用户名, 时间, 星期, 具体服务和请求服务时的终端名的对(单个)用户的拒绝访问.
Account component

识别的参数:
描述:

此模块基于设定档中的制定的规则进行动作:/etc/security/time.conf. m每个规则有如下格式,

services;ttys;users;times

每个规则占一行, 结束于换行符或者注解的开始:`#'. 由分号`;' 分隔成四个栏位. 这些栏位是:

* services - 由此规则影响的服务名的逻辑列.
        * ttys - 指示受此规则保护的终端名字的逻辑列表逻辑列表.
        * user - 此规则作用到的用户的逻辑列表.

逻辑列表意味一串符号(和适当的PAM_相关), 包含不超过一个的通配符:`*', 和可选的非操作符的前置:`!'. 这一串表达式由两个逻辑操作符连接:& (逻辑与)和| 逻辑或). 两个例子:!morgan&!root, 表示此规则不会应用到用户morgan和root;tty*&!ttyp*, 表示此规则仅对控制台终端而不是伪终端适用.
        * times - 此规则的适用时间的逻辑列表. 每个元件的格式是周/时间-范围. 周由两个字符指定.比如, MoTuSa, 表示周一 周二和周六. 注意重复的周被 复位; MoTuMo 表示周二, MoWk 意为除了周一的所有工作日. 两个字符的组合可以是,

Mo Tu We Th Fr Sa Su Wk Wd Al

最后两个词是周末和 每周的整个7天.

时间范围部分是一对24时制的时间, HHMM, 以一个连字符隔开 -- 表示开始和结束的时间. 如果结束时间早于开始时间, 就假定是到第二天的这个结束时间. 例如, Mo1800-0300 表示允许的时间是从周一的晚上6点到第二天早上3点.

注意, 时间的限制只有在当前3个栏位都满足用户请求服务的应用时才适用.

为了便利和可读性, 一条规则可以由`\换行符'结尾以超过一行.
范本/建议用法:

要使用此模块可以在Linux-PAM的设定档里加入下面的行:

#
# apply pam_time accounting to login requests
#
login   account  required       pam_time.so

这里, 我们把这模块应用在login的服务.

可以放在/etc/security/time.conf里的规则举例如下:

login ; tty* & ; !ttyp* ; !root ; !Al0000-2400

除了root,禁止所有用户在任何时间从控制台登录.
    games ; * ; !waster ; Wd0000-2400 | Wk1800-0800

games (使用Linux-PAM的某游戏) 只在非工作时间可以访问. 此规则不限制用户waster.

注意, 目前还没有一个后台进程去强制终止一个超过时间范围的会话. 这要有个对策.

错误格式的规则会作为错误记录在 syslog(3).

6.25 The Unix Password module
概要

模块名:

pam_unix
作者:
维护者:

作者.
提供的管理组:

account; authentication; password; session
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:
网络接口:

概述

这是标准Unix的认证模块. 它从系统库呼叫标准的调用来获取和设定帐号信息以及认证信息. 通常这些从/etc/passwd和/etc/shadow文件(如果开启了shadow功能)获得.
Account component

识别的参数:

debug; audit
描述:

参数debug 使此模块的帐户相关的函数syslog(3)更多的它的动作的信息 (属于此模块的其它功能的参数会被直接忽略掉, 但是别的参数会当成错误而被 syslog(3)). 参数audit会丢出更多的信息.

基于以下的shadow 元素: expire; last_change; max_change; min_change; warn_change, 此模块执行确认帐号和密码状态的工作. 至於后面, 它可以建议用户改变密码或, 通过返回PAM_AUTHTOKEN_REQD, 延迟给用户提供服务直到其生成一个新密码. 列在上面的那些元素在GNU Libc的info文档里有解释. 如果用户的记录里没有包含一个或者更多的这些元素, 相对的shadow检查将不被执行.
范本/建议用法:

在帐号管理模式下, 可以这样来安装此模块:

#
# Ensure users account and password are still active
#
login   account  required       pam_unix.so

Authentication component

识别的参数:

debug; audit; use_first_pass; try_first_pass; nullok; nodelay
描述:

参数debug 使此模块的帐户相关的函数syslog(3)更多的它的动作的信息. 参数audit会丢出更多的信息.

此模块的默认设定是如果正式的密码为空则不允许用户访问服务. 参数nullok 用来使此默认设定无效.

当给出参数try_first_pass, 在提示用户输入密码之前, 模块会拿通过之前堆叠的 auth模块认证的密码来试. 参数use_first_pass 迫使模块使用上述的密码并且永远不会提示用户 - 如果没有可用的密码或密码不能通过认证, 用户将被禁止访问.

参数 nodelay 用来阻止认证部件在认证失败时的延时请求. 默认动作是请求一个一秒钟以上的失败-延迟.

属于此模块的其它功能的参数会被直接忽略掉, 但是别的参数会当成错误而被 syslog(3).

一个帮手程序, unix_chkpwd, 在当用户的密码报存在一个读保护的数据库里时提供对用户密码的检查. 这个程序非常简单, 它仅仅检查呼叫它的用户的密码. 它被此模块的认证部件以用户的名义来透明的呼叫. 如此象xlock这样的程序就不需被设成setuid-root而可以工作.
范本/建议用法:

此模块的正确功能可以由一个适当的/etc/nsswitch.conf 来支配, 那里指定的用户数据库确定用来认证的用户记录的来源.

在帐号管理模式下, 可以这样来安装此模块:

#
# Authenticate the user
#
login   auth  required       pam_unix.so

Password component

识别的参数:

debug; audit; nullok; not_set_pass; use_authtok; try_first_pass; use_first_pass; md5; bigcrypt; shadow; nis; min; max; obscure; remember
描述:

pam_unix 模块的这一部分执行更新用户密码的任务.

对于传统的UNIX用户数据库(同时保存用户密码), 参数md5 用来采用MD5的加密法以对抗不安全的传统的 crypt(3)调用. 还有种选择, 参数 bigcrypt 采用DEC(数字设备公司)的对标准UNIX的crypt()的算法进行 `C2'扩展的算法以加密超过8位长的密码.

参数nullok 用来允许改变一个原先为空的密码. 如果没有此参数, 空的密码会当成是被锁住的帐号.

参数use_first_pass 用来阻止选择旧的和新的密码,而是采用password里此模块之前的模块所保留的密码. 参数try_first_pass用来防止当pam_pwdb 跟随另一个password模块时用户重复输入也许是共享的旧密码 - 如果旧密码不正确, 再提示用户输入. 参数use_authok 用来迫使 此模块设定新密码时采用 password堆叠里先前的模块提供的值. (这用法在先前介绍的Cracklib一节里有个范本).

参数 not_set_pass 用来告诉模块不去关心给/从其它(堆叠的)密码模块提供/获取可用的旧密码或新密码.

参数debug 使此模块的密码相关的函数syslog(3)更多的它的动作的信息. 其它参数会被当成错误信息记录在syslog(3). 参数audit会丢出更多的信息.

通过设定nis 参数, pam_unix 会试图采用NIS RPC来设定新密码.

参数remember 带有一个值. 这值是为每个用户保存的最近使用的密码的个数. 它们被保存在/etc/security/opasswd 以防止用户频繁的交替使用同样的一组密码.

参数min 和 max 允许控制密码的常度. 有个固定的默认值是1到8. 这些值本身算在内.

参数obscure 允许一些额外的密码检查. 这效仿原始的shadow包里的含糊检查, 这过程和pam_cracklib模块非常相像(不做字典检查), 它执行以下一些检查:

* Palindrome - 新密码是否为旧密码的回文? 回文是指顺着读和反着读都一样的词(比如madam和radar).
        * Case Change Only - 新密码是否只是拿旧密码改了些大小写?
        * Similar - 新密码是否太像旧密码?
        * Simple - 新密码是否太简单? 这决定于密码的长度和采用不同种字符的个数(比如,字母, 数字...).
        * Rotated - 新密码是否为旧密码的轮转?(比如,"billy"和"illyb"Linux-PAM(Linux下的密碼認證和安全机制)系統管理員指南(中文版)

范本/建议用法:

标准用法:

#
# Change the users password
#
passwd   password   required   pam_unix.so

和可插入式密码检查模块,pam_cracklib 关联堆叠的例子:

#
# Change the users password
#
passwd   password   required   pam_cracklib.so retry=3 minlen=6 difok=3
passwd   password   required   pam_unix.so use_authtok nullok md5

Session component

识别的参数:
描述:

模块的此部件没有参数. 它的作用就是在用户会话开始和结束时往syslog(3) 里记录用户名和服务类别.
范本/建议用法:

session部件的用法是单纯的:

#
# session opening and closing
#
login   session  required       pam_unix.so

6.26 The userdb module
概要

模块名:

pam_userdb
作者:

Cristian Gafton <gafton@redhat.com>;
维护者:

作者.
提供的管理组:

authentication
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:

需要有 Berkeley DB.
网络接口:

概述

在一个.db数据库里查找用户并且与报存在这数据库中的密码进行比对.
Authentication component

识别的参数:

debug; icase; dump; db=XXXX;
描述:

此模块用来与储存在BerkeleyDB数据库里的资料对用户/密码进行验证. 数据库以用户名为索引, 和用户名对应的栏位是以明码形式保存的密码, so caution must be exercised over the access rights to the DB database itself.. 模块以交互机制从用户端获取输入的密码. 如果此密码用在其他认证模块(象pam_unix )的前面, 那么你得要告诉那些模块从PAM_AUTHTOK(由此模块设定)处读取输入的密码.

模块的默认动作可以由以下的参数改变:

* debug - 给syslog(3)提供更多的调信息.
        * icase - 忽略大小写的密码比对.
        * dump - 往log里下载数据库里所有的的记录.(呀, 默认情况下不要这样做!)
        * db=XXXX - 使用XXXX这个数据库文件. 注意, Berkeley DB通常会在文件名后面加上扩展名, 所以你得像 /etc/foodata 这样指定文件而不是/etc/foodata.db.

范本/建议用法:

这是一个ftp服务的设定档(通常是 /etc/pam.d/ftp ), 会接受用户名/密码对存放在/tmp/dbtest.db中的用户登入.

#%PAM-1.0
auth       required     pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
auth       sufficient   pam_userdb.so icase db=/tmp/dbtest
auth       required     pam_unix.so shadow nullok try_first_pass
auth       required     pam_shells.so
account    required     pam_unix.so
session    required     pam_unix.so

6.27 Warning logger module
概要

模块名:

pam_warn
作者:

Andrew G. Morgan <morgan@parc.power.net>;
维护者:

作者.
提供的管理组:

authentication; password
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:
网络接口:

记录远程用户和远程主机的信息(如果可以知道相关的pam-items)

概述

此模块主要用来记录试图进行认证或者更新密码的动作.
Authentication+Password component

识别的参数:
描述:

往syslog(3)里记录服务名,终端名,用户名,远端用户名和远程主机. 不是所有的项目都能侦测到, but instead obtained from the standard pam-items.
范本/建议用法:

在设定档一节 above有一个范本 .

6.28 The wheel module
概要

模块名:

pam_wheel
作者:

Cristian Gafton <gafton@redhat.com>;
维护者:

作者.
提供的管理组:

authentication
Cryptographically sensitive:
安全等级:
代码清洁度:
系统依赖:
网络接口:

概述

只给属于whell(gid=0)群组的用户授予root的访问权限.
Authentication component

识别的参数:

debug; trust; deny; group=XXXX
描述:

此模块用来实现所谓的重要人物 群组. 默认设定时, 如果请求的用户是wheel 的组成员就赋予其root的的访问权限. (首先, 模块检查组wheel是否存在. 如果不存在,那么id=0的组被当作wheel.

模块的默认动作可以通过在/etc/pam.conf里设定以下参数来改变:

* debug - 提供更多的调试信息给syslog(3).
        * trust - 此选项指示模块当一个请求root权限的用户是wheel组的成员时返回PAM_SUCCESS. 这种情况的默认动作是返回 PAM_IGNORE . 使用trust 选项可以使 wheel的组成员未经输入密码就能成为root. 小心使用.
        * deny - 这选项用来推翻模块的行为逻辑. 如果一个属于wheel组的用户试图得到uid=0 的权限时, 就禁止访问(wheel这个词也许就变得毫无意义!): 其目的是为了接下来的group= 参数而为.
        * group=XXXX - 代替对gid=0的组的眷顾, 而使用用户自己定意XXXX组. 这里的XXXX是组的名字而不是组的ID.

范本/建议用法:

为把能取得superuser权限的用户限制在wheel里, 使用下面的设定:

#
# 默认给root赋权限(rootok), 只有wheel的组成员有可能成为root( wheel), 但仍然必须
# 通过unix_auth的认证.
#
#
su      auth     sufficient     pam_rootok.so
su      auth     required       pam_wheel.so
su      auth     required       pam_unix_auth.so

7. 文件

/usr/lib/libpam.so.*

提供给应用程序访问Linux-PAM API的共享库.
/etc/pam.conf

Linux-PAM的设定档.
/usr/lib/security/pam_*.so

Linux-PAM 的动态可装载目标文件(模块)的主要所在位置.

8. See also

* Linux-PAM 应用程序开发者指南
    * Linux-PAM 模块开发者指南
    * The V. Samar and R. Schemers (SunSoft), ``UNIFIED LOGIN WITH PLUGGABLE AUTHENTICATION MODULES'', Open Software Foundation Request For Comments 86.0, October 1995. See this url: http://www.pilgrim.umass.edu/pub/osf_dce/RFC/rfc86.0.txt

9. Notes

I intend to put development comments here... like ``at the moment this isn't actually supported''. At release time what ever is in this section will be placed in the Bugs section below! Linux-PAM(Linux下的密碼認證和安全机制)系統管理員指南(中文版)

我们是否打算支持模块的use_mapped_pass 呢? 有人认识佣金低廉(免费)的好律师吗?! argument? Anyone know a cheap (free) good lawyer?!

* This issue may go away, as Sun have investigated adding a new management group for mappings. In this way, libpam would have mapping modules that could securely store passwords using strong cryptography and in such a way that they need not be distributed with Linux-PAM.

10. Author/acknowledgments

This document was written by Andrew G. Morgan (morgan@linux.kernel.org) with many contributions from Chris Adams, Peter Allgeyer, Tim Baverstock, Tim Berger, Craig S. Bell, Derrick J. Brashear, Ben Buxton, Seth Chaiklin, Oliver Crow, Chris Dent, Marc Ewing, Cristian Gafton, Emmanuel Galanos, Brad M. Garcia, Eric Hester, Roger Hu, Eric Jacksch, Michael K. Johnson, David Kinchlea, Olaf Kirch, Marcin Korzonek, Stephen Langasek, Nicolai Langfeldt, Elliot Lee, Luke Kenneth Casson Leighton, Al Longyear, Ingo Luetkebohle, Marek Michalkiewicz, Robert Milkowski, Aleph One, Martin Pool, Sean Reifschneider, Jan Rekorajski, Erik Troan, Theodore Ts'o, Jeff Uphoff, Myles Uyema, Savochkin Andrey Vladimirovich, Ronald Wahl, David Wood, John Wilmes, Joseph S. D. Yao and Alex O. Yuriev.

Thanks are also due to Sun Microsystems, especially to Vipin Samar and Charlie Lai for their advice. At an early stage in the development of Linux-PAM, Sun graciously made the documentation for their implementation of PAM available. This act greatly accelerated the development of Linux-PAM.
11. 翻译/联系方法这份档案由孙国清(thomassun@yeah.net)翻译,历时N个月,这是我首次翻译英文资料, 欢迎指正.本译文以GNU GPL版权发布. 请在引用时附属译者以及版权说明.
12. Bugs/omissions

More PAM modules are being developed all the time. It is unlikely that this document will ever be truely up to date!

This manual is unfinished. Only a partial list of people is credited for all the good work they have done.
13. Copyright information for this document

Copyright (c) Andrew G. Morgan 1996-9. All rights reserved.
Email: <morgan@linux.kernel.org>;

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

* 1. Redistributions of source code must retain the above copyright notice, and the entire permission notice in its entirety, including the disclaimer of warranties.
    * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
    * 3. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission.

Alternatively, this product may be distributed under the terms of the GNU General Public License (GPL), in which case the provisions of the GNU GPL are required instead of the above restrictions. (This clause is necessary due to a potential bad interaction between the GNU GPL and the restrictions contained in a BSD-style copyright.)

THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

$Id: pam_source.sgml,v 1.9 1999/11/08 05:09:17 morgan Exp $