首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

深入 Linux PAM 体系结构(2)

深入 Linux PAM 体系结构(2)

五、配置文件我们注意到,配置文件也放在了在应用接口层中,它与 PAM API 配合使用,从而达到了在应用中灵活插入所需鉴别模块的目的。它的作用主要是为应用选定具体的鉴别模块,模块间的组合以及规定模块的行为。下面是一个示例配置文件:
图2.示例配置文件
我们可以看到,配置文件有许多登记项(每行对应一个登记项)组成,每一行又分为五列(每列对应一栏),详细解释如下:
第一栏,service表示使用PAM的应用程序,比如login、passwd、rlogin等。这一栏中的OTHER表示所有没在该文件中显式列出的应用。也就是说,如果所有程序具有相同的需求,整个配置文件只需要一行即可,并且该行的第一栏为OTHER。本例中,因为所有应用程序使用相同的会话模块,所以实际上可以用单行,即
1
" OTHER   auth        required     pam_unix_auth.so"




来代替文件中的这些行:
1
2
3
"login   session     required     pam_unix_session.so
ftp     session     required     pam_unix_session.so
telnet  session     required     pam_unix_session.so"。




第二栏,module_type指明程序所用PAM底层模块的类型:auth表示鉴别类模块;account表示帐户类模块;session表示会话类模块;password表示口令类模块。注意,每行只能指定一种类型模块,如果程序需要多种模块的话,可在多行中分别规定。
第三栏,control_flag规定如何处理模块的成功和失败情况。单个应用程序可以调用多种底层模块,这通常称为"堆叠",对应于某程序的按照配置文件中出现顺序执行的所有模块成为"堆",堆中的各模块的地位与出错时的处理由control_flag栏的取值决定,它的五种可能的取值分别为required、Requisite、sufficient或_optional,现介绍如下:
required--它表示该模块的成功是用户通过鉴别的必要条件,换句话说,只有当对应于应用程序的所有带required标记的模块全部成功后,该程序才能通过鉴别。同时,如果任何带required标记的模块出现了错误,PAM并不立刻将错误消息返回给应用程序,而是在所有模块都调用完毕后才将错误消息返回调用它的程序。
Requisite--它与required相仿,只有带此标记的模块返回成功后,用户才能通过鉴别,不同之处在于其一旦失败就不再执行堆中后面的其它模块,并且鉴别过程到此结束。
optional--它表示即便该模块失败,用户仍能通过鉴别。在PAM体系中,带有该标记的模块失败后将继续处理下一模块。
sufficient--它表示该模块取得成功是用户通过鉴别的充分条件,也就是说只要标记为sufficient的模块一旦成功,那么PAM便立即向应用程序返回成功而不必尝试任何其他模块。当标记为sufficient的模块失败时,sufficient模块当做optional对待。
第四栏,module_path指出PAM模块的位置。
第五栏,options用于向特定模块传递相关的选项,然后由模块分析解释这些任选项。比如使用此栏打开模块调试,或向某模块传递诸如超时值之类的参数等。另外,它还用于支持下文所述的口令映射技术。
如果任一栏出现错误,或某模块没有找到,那么所在行被忽略并将其作为严重错误进行记录。
本例中,login程序使用UNIX口令模块进行鉴别,而ftp程序却使用S/Key模块进行鉴别。如我们想改变ftp程序的鉴别方法,比如也用UNIX口令模块进行鉴别,那么我们不必改动源程序,只需将配置文件中的
1
ftp     auth        required     pam_skey_auth.so    debug




改为
1
ftp     auth        required     pam_unix_auth.so    debug




这样,当用户使用ftp时,将用传统的UNIX口令鉴别方式来验证其身份。由此可见,在PAM体制下为应用程序改变鉴别机制是一件轻松的事情。另外,PAM体制的堆叠功能还使得应用程序能够支持多种鉴别机制,如下例中的login程序在配置文件中先后出现了三项与鉴别有关的登记项:
图3.示例配置文件
当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模块都通过了,用户也能通过鉴别。
六、口令映射在同一个机器上使用多个鉴别机制,尤其是一个应用程序集成多种鉴别机制可能导致用户需要记忆多个口令,这会让用户觉得很不舒服。虽然可以让所有机制使用相同的口令来获取易用性,但是这将削弱系统的安全性--如果其中任何一个机制的口令泄露了,则所有机制都会受到牵累。此外,不同的鉴别机制在口令长度、容许的字符、更新间隔、有效期等方面可能具有他们特有的要求,这些要求也是为多鉴别机制使用同一个口令必须考虑的一个问题。
PAM为我们提供了这样一种解决方案,它不排除为所有鉴别机制共用一个口令,同时允许通过口令映射技术让每个机制使用不同的口令。该方案用用户的"主口令"加密其他的"副口令",并且将这些经过加密的副口令存放在一个用户能访问的地方。主口令一旦经过验证,鉴别模块就能用它解密那些加密的副口令从而获得相应口令,然后将所需口令传递给鉴别模块。这称为"口令映射"。如果口令映射出现错误,或如果映射不存在,那么各鉴别模块应该提示用户输入口令。为支持口令映射,主口令应保存在PAM第二层并且在需要时由其提供给堆叠的各个鉴别模块。同时,口令要在pam_authenticate函数返回之前清除。为了保障口令映射的安全,主口令必须足够强壮,可以考虑使其的长度更长、组成口令字符的类型多样化并使用混合类型的字符组成口令等有效措施。
口令如何加密及其存储完全取决于具体的实现:它能够将加密的副口令(也称作"映射口令")存储在可靠或不可靠的地方,诸如智能卡、本地文件或目录服务。当然,如果加密的口令保存在一个不可靠的允许公共访问的地方,会留下受到字典攻击的隐患。
为实现口令映射,所有鉴别模块应支持以下四个映射选项∶
  • use_first_pass∶它表示当该模块执行时不提示用户输入口令,而将该模块之前的提示用户输入的主口令作为它们的公共口令进行验证。如果用户没能通过主口令的鉴别,则该模块不提示用户输入口令。此选项一般说来在系统管理员想强制用同一个口令通过多模块时使用。
  • try_first_pass∶除了如果主口令不正确,将提示用户输入口令之外,它的用法与use_first_pass相同。
  • use_mapped_pass∶它表示使用口令映射技术得到此模块的有效口令。也就是说,该模块执行时不提示用户输入口令,而是用映射口令即用主口令解密得到的该模块的副口令作为本模块的口令输入进行验证。如果在此之前用户没能通过主口令的鉴别,则该模块也不会提示输入口令。
  • try_mapped_pass∶除了如果主口令不正确,它将提示用户输入口令之外,该项与use_mapped_pass用法相同。
当口令更换后,PAM会保存所有新旧口令,并且使有关模块能够访问到它们。其他模块能够使用此信息更新加密的口令而不必强制用户再次输入口令。
现以下面的配置文件为例讲解口令映射:
图4. 示例配置文件
在这里login程序集成了三种鉴别方式:传统UNIX口令鉴别、Kerberos和RSA鉴别,但通常情况下用户仅输入一次口令便能通过鉴别了。当程序调用pam_unix.so模块时,PAM提示用户输入他们的UNIX口令,然后由pam_kerb.so模块对用户输入的UNIX口令进行鉴别。继而调用pam_kerb.so模块,由于该模块的选项为use_mapped_pass,它将利用口令映射机制进行认证,也就是说,如果UNIX口令鉴别通过的话,就将其作为pam_kerb.so模块的主口令来解密其对应的映射口令从而进行Kerberos鉴别。如果pam_unix.so模块所需口令没能通过验证,则无法进行口令映射,那么PAM将直接调用下一鉴别模块而不提示用户输入其Kerberos口令。最后一个模块的选项为use_first_pass,所以pam_rsa.so模块将使用前边输入的主口令来鉴别用户,如果口令错误也不提示用户输入RSA口令。所以,只要第一次输入的口令是正确的,并且映射口令存在,则一个口令便足以通过鉴别。
七、结束语Linux-PAM是一种使用灵活功能强大的用户鉴别机制,本文对它的组成结构以及各部分之间的关系进行了相应的分析,希望对读者理解PAM的机制有所帮助。
返回列表