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.