Linux系统是一个多用户、多进程的操作系统,并且,它提供了众多的系统和网络服务给用户使用。因此,从应用角度来说,它不可避免地需要对大量的应用及其用户进行安全认证,只有通过了安全认证的用户才能合理、合法地使用相应的系统和网络服务。PAM机制是一个非常成熟的安全认证机制,可以为Linux多种应用提供安全、可靠的认证服务。本文将对PAM机制的原理、配置及其应用进行详细介绍,用户可以高效地使用该技术保证Linux系统的安全。linux操作系统 1 PAM认证机制简介 为安全起见,计算机系统只有经过授权的合法用户才能访问,在这里如何正确鉴别用户的真实身份是一个关键的问题。所谓用户鉴别,就是用户向系统以一种安全的方式提交自己的身份证明,然后由系统确认用户的身份是否属实的过程。换句话说,用户鉴别是系统的门户,每个用户进入到系统中都必须经过鉴别这一道关。linux 命令 嵌入式认证模块(PAM)机制采用模块化设计和插件功能,使得我们可以轻易地在应用程序中插入新的鉴别模块或替换原先的组件,而不必对应用程序做任何修改,从而使软件的定制、维持和升级更加轻松,因为鉴别机制与应用程序之间相对独立。应用程序可以通过PAM API方便的使用PAM提供的各种鉴别功能,而不必了解太多的底层细节。 此外,PAM的易用性也较强,主要表现在它对上层屏蔽了鉴别的具体细节,所以用户不必被迫学习各种各样的鉴别方式,也不必记住多个口令;又由于它实现了多鉴别机制的集成问题,所以单个程序可以轻易集成多种鉴别机制如Kerberos鉴别机制和Diffie-Hellman鉴别机制等,但用户仍可以用同一个口令登录而感觉不到采取了各种不同鉴别方法。Linux学习 在广大开发人员的努力下,各版本的UNIX系统陆续提供对PAM的支持。其中,Linux-PAM(Pluggable Authentication Modules for Linux)是专门为Linux操作系统实现的,包括Debian Linux 2.2、Turbo Linux 3.6、Red Hat Linux 5.0以及SuSE Linux6.2及它们的后续版本都提供对PAM的支持。FreeBSD从3.1版开始支持PAM。需要注意的是:除了具体实现不同外,各种版本Unix 系统上的PAM的框架是相同的,所以本文介绍的Linux-PAM框架知识具有普遍性。 2 Linux-PAM的配置 Linux大全 Linux-PAM的目标就是为系统管理者提供最大限度的灵活性。系统管理者可以通过两种形式对Linux-PAM进行配置:单一配置文件 /etc/pam.conf;或者是/etc/pam.d/目录。下面我们将讨论其配置文件的语法,接着给出一些实际应用的例子,以供读者参考。 2.1 Linux-PAM单一配置文件的语法 通过图1读者可能会注意到,配置文件也放在了在应用接口层中,它与 PAM API 配合使用,从而达到了在应用中灵活插入所需鉴别模块的目的。它的作用主要是为应用选定具体的鉴别模块,模块间的组合以及规定模块的行为。 在使用该配置文件前,读者首先应该明白Linux-PAM的记号是大小写敏感的。有两个特殊的符号:“#”和“.”。配置文件中的注释以#开头,一般配置文件中每行是一个入口(除注释外),但是如果某个入口的定义很长,可以通过使用转义符回行,而下一行也被看作是这个入口的一部分。 一般/etc/pam.conf文件每行的格式如下:交流Linux技巧 service-name module-type control-flag module-path arguments 其中,每个字符段的具体含义如下: service-name:为这个入口分配的服务名。通常这是给定应用程序的会话名。例如:ftpd、rlogind、su等等。Linux-PAM还为默认的验证机制保留一个特殊的服务名,就是ohter,大小写均可。另外,如果某个模块指定了以命名的服务,那other就应该被忽略。 modle-type:Linux-PAM当前有四种类型的模块:Linux下载auth:这种类型的模块为用户验证提供两方面的服务:让应用程序提示用户输入密码或者其它的标记,确认用户的合法性;通过它的凭证许可权限,设定组成员关系或者其它优先权。 account:这类模块执行基于非验证的账户管理。它主要用来限制/允许用户对某个服务的访问时间,当前有效的系统资源(最多可以有多少个用户),限制用户的位置(例如:root用户只能从控制台登录)。 session:这类模块的主要用途是处理为用户提供服务之前/后需要做的一些事情,包括:记录打开/关闭数据的信息,监视目录等。 password:用来升级用户验证标记。 control-flag:控制标志用来设置验证成功或者失败后PAM需要作出的反应。因为模块可以层叠,控制标志可以决定每个模块的重要性。应用程序不会意识到单个模块成功或者失败,它只会收到Linux-PAM库成功或者失败的综合反应信息。 层叠模块的执行顺序取决于/etc/pam.conf文件的入口顺序,入口列前的模块先执行。从Linux-PAM 6.0开始可以使用两种语法定义控制标志。简单的一种是使用单一关键词定义控制标志。有四个这样的关键词:required、requisite、 sufficient和optional。Linux-PAM通过如下方式解释这些关键词: required:表示即使某个模块对用户的验证失败,也要等所有的模块都执行完毕之后,PAM才返回错误信息。这样做是为了不让用户知道被哪个模块拒绝。如果对用户验证成功,所有的模块都会返回成功信息。 requisite:如果特定的模块对用户的验证失败,PAM马上返回一个错误信息,把控制权交回应用程序,不再执行其它模块进行验证。 sufficient:表示如果一个用户通过这个模块的验证,PAM结构就立刻返回验证成功信息,把控制权交会应用程序。后面的层叠模块即使使用requisite或者required控制标志,也不再执行。如果验证失败sufficient的作用和optional相同。 optional:表示即使本行指定的模块验证失败,也允许用户享受应用程序提供的服务。使用这个标志,PAM框架会忽略这这个模块产生的验证错误,继续顺序执行下一个层叠模块。 module-path:PAM验证模块的路径。如果以/开头,就表示是完整的路径;如果不是以/打头,就表示是相对于/usr/lib/security的相对路径。 args:传递给模块的参数。类似于通常的Linux Shell命令行参数。有效的参数包括一些通用参数和特定于给定模块的参数。无效的参数将被忽略,并会把错误信息记录到syslog。 需要特别注意:配置文件中的任何一行错误都会导致验证失败,同时相关错误信息被记录到syslog。 举一个简单的例子如下: Login auth required pam_unix.so debug Login auth required pam_kerb.so use_mapped_pass Login auth optional pam_rsa.so use_first_pass 这样,当login程序执行时先用pam_unix.so模块即传统的UNIX口令方式鉴别用户,然后再调用pam_kerb.so模块即 Kerberos对用户进行鉴别,最后用pam_rsa.so模块即RSA方式鉴别用户。在按上述顺序鉴别用户的过程中,如果pam_unix.so模块鉴别失败,它将继续调用下面的模块进行鉴别而非立刻向login程序返回错误消息; pam_kerb.so模块也按同样方式处理,直到顺序处理完最后一个pam_rsa.so模块后,PAM才将前面出现的错误信息返回给 login程序。对于该配置,即使pam_rsa.so模块顺利通过,只要pam_unix.so模块和pam_kerb.so模块中有一个出现错误,用户就不能通过鉴别;相反,即使pam_rsa.so模块失败,只要pam_unix.so模块和pam_kerb.so模块都通过了,用户也能通过鉴别。 |
|