免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 786 | 回复: 0
打印 上一主题 下一主题

PAM [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-11-29 21:27 |只看该作者 |倒序浏览

Pluggable Authentication Module (嵌入式认证模块)。它最初有SUN公司开发;很快被Linux社区的接受,并且开发了更多的模块。其目标是提供一套可用于验证用户身份的函数库,从而将认证从应用程序开发中独立出来。Linux-PAM处理四种独立的(管理)工作。它们是: 认证管理; 帐号管理; 会话期间管理;和密码管理。
[color="#ff0000"]client--->app--->pam--->/etc/pam.d/api(config)--->/lib/security/*.so--->/etc/security/module.conf--->result--->api--->client

PAM工作方式:
  (1) 调用某个应用程序,以得到该程序的服务。
  (2) PAM应用程序调用后台的PAM库进行认证工作。
  (3) PAM库在/etc/pam.d/目录中查找有关应用程序细节的配置文件,该文件告诉PAM,本应用程序使用何种认证机制。
  (4) PAM库装载所需的认证模块。
  (5) 这些模块可以让PAM与应用程序中的会话函数进行通信。
  (6) 会话函数向用户要求有关信息。
  (7) 用户对这些要求做出回应,提供所需信息。
  (8) PAM认证模块通过PAM库将认证信息提供给应用程序。
  (9) 认证完成后,应用程序做出两种选择:
  将所需权限赋予用户,并通知用户。
  认证失败,并通知用户。

二、简介
PAM:Pluggable Authentication Module (嵌入式认证模块)。它最初有SUN公司开发;其目标是提供一套可用于验证用户身份的函数库,从而将认证从应用程序开发中独立出来。PAM支持的四种管理界面:
1、认证管理(authentication management)    主要是接受用户名和密码,进而对该用户的密码进行认证,并负责设置用户的一些秘密信息。认证方式
2、帐户管理(account management)    主要是检查帐户是否被允许登录系统,帐号是否已经过期,帐号的登录是否有时间段的限制等等。资源基于时间地点及密码过期否
3、密码管理(password management)    主要是用来修改用户的密码。更新用户的认证信息
4、会话管理(session management)    主要是提供对会话的管理和记账(accounting)。用户开始使用或使用结束某项服务后生效。
管理的功能由配置文件中指定的模块来完成。
小结:
      验证就是系统确认用户身份的过程。访问控制确定通过验证后允许什么。验证常与帐号联系在一起。所谓帐号一般就是与独特标识符相关的一系列信息。这种信息通常包括允许人们使用系统资源所需的数据。譬如,它提供了用户个人文件的位置或者是用户的实名。它可能包括环境变量和资源极限。
      PAM有四种模块:auth(验证)、account(帐号)、password(口令)和session(会话)。auth表明如果服务试图对用户进行验证,就要用到这行。如果服务需要帐号信息如userid,就要用到account。如果服务要改变用户的口令,就要用到password。就在用户登录之前、用户退出之后的瞬间,服务要用到session。这便于生成审查日志,但也可以用来建立各种环境参数或者装上网络磁盘驱动器。允许每一种模块多次出现,但要按顺序,除非其中一行有requisite的控制标志。
      控制标志有四种:requisite(必需)、required(要求)、sufficient(足够)和optional(可选)。requisite表明如果这条规则失败,就立即拒绝访问。required表明如果这规则失败,就拒绝访问,但继续为这类模块试用其余规则。sufficient表明如果这规则成功,允许访问;但如果失败,退回到另一个规则。optional则表明忽视该规则的结果,除非这类模块没有其它规则。optional通常用于同验证用户无关的额外配置(这种情形下,我们并不关心配置是否失败)。
三、配置
PAM配置是通过单个配置文件/etc/pam.conf。RedHat还支持另外一种配置方式,即通过配置目录/etc/pam.d/,且这种的优先级要高于单个配置文件方式。
service-name   module-type   control-flag   module-path   arguments
service-name
    这笔记录相关的服务名称.通常这服务名称是特定应用程序的名字.比如, `ftpd', `rlogind' 和 `su' 这些. .
    有一个保留的服务名称,它是用来定义默认的认证机制的. 它就是`OTHER',大小写无关.注意,当已经有为指定服务定义了模块,那么 `OTHER' 记录会被忽略.
module-type
    模块的四种(目前是)类型.这四种类型是:
        auth:这种模块类型确定有关用户认证的两方面. ·,它确认用户就是他们自己,这通过指示应用程序提示用户输入密码或者其它证实身份的方法。
        account: 这些模块处理非认证级的帐号管理. 典型的用法是基于一天的不同时间段来限制/允许访问某服务,当前可用的系统资源 (最大用户数)或者限制特定用户root只能从控制台登录.
        session:首先, 这类模块和一系列动作有关,指在用户得到/失去服务时要做的事. 这包括记录用户的登录/登出,挂载必须的目录等等.
        password:这最后一种类型在更新用户的认证标志时需要. 通常,各个基于"质问/回答"(译注:指传统的用户名/密码的认证方法)的认证方法(auth)有一个对应的此模块.
control-flag :决定PAM如何使用调用后的返回值
    控制符用来指示当某一模块返回成功或失败时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)都执行过. 每个required必须通过,整次认证才通过。
        requisite:该模块必须返回成功才能通过认证,但是一旦该模块返回失败,将不再执行同一stack内的任何模块,而是直接将控制权返回给应用程序。一票否决
        Sufficient:表明本模块返回成功已经足以通过身份认证的要求,不必再执行同一stack内的其它模块,但是如果本模块返回失败的话可以 忽略。可以认为是一个充分条件。权威参数,我通过就OK
        optional:可选的,正如这名字一样,此?control-flag 致使模块对最终的成功或失败的结果不会产生决定性的影响. 可选项,提供点 warning 信息
2、使用配置目录/etc/pam.d/(只适用于RedHat Linux)PAM客户配置目录
该目录下的每个文件的名字对应服务名,例如ftp服务对应文件/etc/pam.d/ftp。如果名为A的服务所对应的配置文件/etc/pam.d/A不存 在,则该服务将使用默认的配置文件/etc/pam.d/other。每个文件由如下格式的文本行所构成:
module-type  control-flag  module-path  arguments
每个字段的含义和/etc/pam.conf中的相同。
唯一的差别是service-name不再出现.service-name是给定的配置文件名.
3、arguments  是用来传递给该模块的参数。一般来说每个模块的参数都不相同,可以由该模块的开发者自己定义,但是也有以下几个共同 的参数:
    debug          该呼叫 syslog(3) 函数在系统日志里记录下debug信息.
    no_warn        指示模块不要丢warning信息给应用程序.
    use_first_pass  这模块将不会提示用户输入密码,它可以得到前面输入过的密码(从上一个auth模块)并且用它.如果那密码不正确,那么用户就不被认证.(这模块只对auth和password模块有意义.)
    try_first_pass  表明该模块首先应当使用前一个模块从用户那里得到的密码,如果该密码验证不通过,再提示用户输入新的密码。
    use_mapped_pass 该模块不能提示用户输入密码,而是使用映射过的密码。
    expose_account  允许该模块显示用户的帐号名等信息,一般只能在安全的环境下使用,因为泄漏用户名会对安全造成一定程度的威胁。
四、PAM在系统中的应用例子
[root@feifp pam.d]# cat login
#%PAM-1.0
auth       required     pam_securetty.so
auth       required     pam_stack.so service=system-auth[调用别的PAM应用]
auth       required     pam_nologin.so
account    required     pam_stack.so service=system-auth
password   required     pam_stack.so service=system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_stack.so service=system-auth
session    optional     pam_console.so
# pam_selinux.so open should be the last session rule
session    required     pam_selinux.so multiple open
注意:针对每个类型的每条规则需要pam_stack模块,并为其提供了service=system-auth变元。这实际上是说“跳到system-auth PAM配置”,该配置可在/etc/pam.d/system-auth找到。所以如果登录程序试图验证用户,首先它会运行pam_security模块,进行检查,确保用户通过可信控制台登录(登录程序通常使用明文口令)。如果这样的话,它就跳到放在/etc/pam.d/system-auth的配置,如“默认系统验证配置”所示。
[root@feifp pam.d]# cat system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      /lib/security/$ISA/pam_env.so
auth        sufficient    /lib/security/$ISA/pam_unix.so likeauth nullok
auth        required      /lib/security/$ISA/pam_deny.so
帐号信息,pam_unix模块被用到。它被标为sufficient,所以如果模块能够确定用户帐号,就停止处理。如果失败,PAM系统继续进行,并试用下一条帐号规则。这个被标为required,并使用pam_deny模块。该模块总是拒绝访问,所以倘若第一条规则无法确定用户的帐号信息,用户就被拒绝访问。
account     required      /lib/security/$ISA/pam_unix.so
account     sufficient    /lib/security/$ISA/pam_succeed_if.so uid  pam_unix.so
lrwxrwxrwx  1 root root    11  7 24 10:41 pam_unix_auth.so -> pam_unix.so
lrwxrwxrwx  1 root root    11  7 24 10:41 pam_unix_passwd.so -> pam_unix.so
lrwxrwxrwx  1 root root    11  7 24 10:41 pam_unix_session.so -> pam_unix.so
-rwxr-xr-x  1 root root 48680 2004-11-30  pam_unix.so
为了打开匿名FTP,需要使用以下的配置命令代替默认的配置(OTHER):
  # ftpd; add ftp-specifics. These lines enable anonymous ftp over
  # standard UNIX access (the listfile entry blocks access to
  # users listed in /etc/ftpusers)
  #
  ftpd auth sufficient /usr/lib/security/pam_ftp.so
  ftpd auth required /usr/lib/security/pam_unix_auth.so use_first_pass
  ftpd auth required /usr/lib/security/pam_listfile.so
  onerr=succeed item=user sense=deny file=/etc/ftpusers
上面是ftpd服务利用PAM模块进行用户认证的三个步骤。首先用pam_ftp模块检查当前用户是否为匿名用户,如果是匿名用户,则 sufficient控制标志表明无需再进行后面的认证步骤,直接通过认证;否则继续使用pam_unix_auth模块来进行标准的unix认证,即用/etc/ passwd和/etc/shadow进行认证;通过了pam_unix_auth模块的认证之后,还要继续用pam_listfile模块来检查该用户是否出现在文件/etc/ ftpusers中,如果是则该用户被deny掉。
七、密码映射(password-mapping)
密码映射允许用户在不同的认证机制下使用不同的密码,其中有一个主密码(primary password),其它密码为次密码(secondary passwords,可能有多个)。主密码用来对次密码进行加密。在主密码认证通过后,认证模块利用主密码将加密过的次密码(也称为 mapped password)解密,并对次密码进行认证。
注:如果使用了一次性密码的机制,就不使用密码映射。
所有服务模块必须支持如下4个映射选项
1、use_first_pass
这个选项指示本模块不能提示用户输入密码,而是使用已有的密码,即从第一个向用户提示输入密码的模块那里取得密码,并对该密码进 行认证。
2、try_first_pass
这个选项指示本模块首先尝试使用已有的密码,即从第一个向用户提示输入密码的模块那里取得密码,并对该密码进行认证。如果密码认 证失败,则再提示用户输入密码。
3、use_mapped_pass
这个选项指示本模块不能向用户提示输入密码,而应使用映射过的密码,即利用主密码将加密过的次密码解密出来并进行认证。
4、try_mapped_pass
这个选项指示本模块首先尝试使用映射过的密码,即利用主密码将加密过的次密码解密出来并进行认证。如果密码认证失败,则再提示用户输入密码。
密码映射的例子:
下面是/etc/pam.conf中关于login服务的配置。这里login共有3种认证机制:Kerberos、UNIX和RSA认证,两个required控制标志表明用户必 须通过Kerberos认证和UNIX认证才能使用login服务,optional选项则说明RSA认证是可选的。首先用户输入主密码进行Kerberos认 证;use_mapped_pass选项指示UNIX认证模块利用主密码将用于UNIX认证的次密码解密出来并对该次密码进行认证;try_first_pass选项 指示RSA认证模块先使用第一个模块(即Kerberos模块)的密码作为进行认证的密码,当对该密码认证失败时才提示用户输入用于RSA认 证的次密码。
login  auth  required  pam_kerb_auth.so  debug
login  auth  required  pam_unix_auth.so  use_mapped_pass
login  auth  optional  pam_rsa_auth.so    try_first_pass
八、PAM配置错误
能够遇到最大的问题可能就是Linux-PAM的配置文件(/etc/pam.d/*或者/etc/pam.conf)被删除了。如果发生这种事情,你的系统就会被锁住。
此时,进入单用户模式。
首先按照如下步骤进行处理: cd /etc
mv pam.conf pam.conf.orig
mv pam.d pam.d.orig
mkdir pam.d
cd pam.d

接着编辑/etc/pam.d/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

然后登录。如果还是不行,那有可能是因为输入错误或者更严重的问题。如果是输入错误,会在日志文件中留下记录,可以使用[color="#ff0000"]tail /var/log/messages查看。
现在,重新登录到系统。下面的工作就是重新安装Linux-PAM和其它软件(假设是RedHat系统),使用如下命令重新安装PAM软件包: rpm -Uvh --force pam-*
最后后,需要安装(重新安装)libc库、util-linux、wuftp、NetKit等受影响的软件包如果使用X系统,也需要重新安装。
九、不要使用脆弱的other文件
如果系统默认配置文件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


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/4929/showart_59319.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP