Wednesday, July 22, 2009

NSS及它与PAM的关系

NSS全称: Name Service Switch. 从man手册中, 描述它的来由:

libc函数往往需要一些本地信息, 比如getpwent()参数需要/etc/passwd文件. 再gethostbyname()函数等等, 对于日益增加又健壮的服务(如NIS), 它种服务在libc的函数上被hack, 但不能永远靠hack代码去增加功能的.所以在libc5就加入NSS结构, 结构如下:

所谓的Name Service是如下类信息:
aliases
ethers
group
hosts
netgroup
networks
passwd
protocols
publickey
rpc
services
shadow
* 这些信息都是通过libc的函数去得到的.

C级函数是依靠/etc/nsswitch.conf文件去选择正确的back_end
linux下, back_end是存放在/lib/libnss_*

NSS与PAM

从Name Service提供的信息看, NSS 与 PAM 有些事是相同的. 但是细看, 两者是不一样的.

* NSS返回查询的结果数据

* PAM提供多种灵活的认证方案

在NSS中, 容易与认证扯上关系的, 无非是NSS提供的passwd.  从getpwent函数的手册上看, 本函数是返回一个C结构体的:

           struct passwd {
               char *pw_name; /* username */
               char *pw_passwd; /* user password */
               uid_t pw_uid; /* user ID */
               gid_t pw_gid; /* group ID */
               char *pw_gecos; /* real name */
               char *pw_dir; /* home directory */
               char *pw_shell; /* shell program */
           };
用户程序结果使用返回的信息(密码)与用户的输入信息(密码)是可以实现认证的效果. 但是这样需要用户的程序处理更多的事情(相比程序使用PAM的情况).

对于使用libc的函数去处理认证的情况, 在NSS的结构上, 还可以做到类PAM一样灵活配置的: 因为NSS是从libc函数去调用相应的back_end的. 这样就可以不同的back_end去改变使用不同database而不像PAM一样不影响到(使用libc的)程序本身.

例如, ldap就有一个NSS的back_end, 在ubuntu下叫libnss-ldap. 配置nsswitch.conf去使用本back_end, 就可以使程序把LDAP作为数据源.

修改程序的认证数据源, 需要程序本身使用到如下两种结构基础
1. 使用libc的函数处理认证
2. 使用PAM机制


参考文档: http://docs.hp.com/en/305/uxint.html

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.