Archulate's Blog

System maintence work blog

Nss及它与PAM的关系

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


所谓的Name Service是如下类信息:aliasesethersgrouphostsnetgroupnetworkspasswdprotocolspublickeyrpcservicesshadow 这些信息都是通过libc的函数去得到的.
C级函数是依靠/etc/nsswitch.conf文件去选择正确的back_endlinux下, 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 源地址: http://jessinio.blogspot.com/2009/07/nsspam.html源地址需要翻墙才能打开,我好不容易找到这个,赶紧先分享过来,翻墙不容易